问题

我在内网服务器上部署了一个 Alist 服务(通过 FnOS 的 Docker 环境部署),并通过内网穿透实现外网访问。该服务有一个域名(如 alist.example.com)解析到外网的 FRP 地址。我想实现这样的智能访问:当在内网时直接访问服务器,不经过 FRP;当在外网时则通过 FRP 访问。

解决方案

软路由通过DNS解析指向本地的Nginx服务,Nginx再将请求反向代理到对应的本地IP和端口。

  • DNS服务:内网已安装iStoreOS软路由(其他openwrt软路由也行),其中默认包含dnsmasq
  • Nginx服务:部署在FnOS中,使用1Panel面板的OpenResty进行反向代理,其他反代软件也行
  • Alist服务:部署在FnOS的Docker环境中

具体步骤

编辑dnsmasq配置

首先通过SSH连接到软路由,使用vim或nano编辑/etc/dnsmasq.conf文件,添加如下配置:

配置格式为:address=/后接域名alist.example.com,最后是Nginx服务的内网IP地址(本例中为192.168.1.50

address=/alist.example.com/192.168.1.50

然后执行命令,重启dnsmasq

/etc/init.d/dnsmasq restart

在1Panel中添加反代

如果你使用其他反向代理软件,不一定要用1Panel,因为原理都是一样的。

由于1Panel安装在FnOS内,FnOS默认会将80和443端口重定向到FnOS的端口。

这时只需取消下方的勾选,然后在安装1Panel时直接使用80和443端口即可。

不过请注意,这样设置后直接输入FnOS的IP地址将无法访问,需要在地址后加上对应的端口号。

image.png

安装完1Panel之后,进入1Panel,然后点击**网站-创建网站**

image.png

填入相关信息即可。

DNS生效需要大约10分钟的时间。生效后,在内网访问域名时会直接通过本地反向代理访问服务,无需经过FRP。

此时你会发现内网访问默认使用HTTP协议,而外网部署通常默认使用HTTPS。为了解决这种访问协议不一致的问题,只需要在1Panel中配置相应的证书即可。

配置内网Https

首先进入1Panel,依次点击**网站-证书。如果之前已申请过证书,只需点击上传证书**即可。我此前在NginxProxyManager中申请了泛域名证书,因此直接下载使用即可。

NginxProxyManager下载下来的证书内容

1Panel上传证书

保存填写内容后,进入网站列表,点击刚创建的网站,依次选择**配置** -****HTTPS 。然后选择刚上传的证书并保存即可