同域名内外网智能路由

问题

我在内网服务器上部署了一个 Alist 服务(通过 FnOS 的 Docker 环境部署),并通过内网穿透实现外网访问。该服务有一个域名(如 alist.example.com)解析到外网的 FRP 地址。我想实现这样的智能访问:当在内网时直接访问服务器,不经过 FRP;当在外网时则通过 FRP 访问。
如果有其他人有这种需求,可以参考下面我的解决方案

解决方案

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

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

具体步骤

编辑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地址将无法访问,需要在地址后加上对应的端口号。

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

填入相关信息即可。

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

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

配置内网Https

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

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

7 个赞

感谢大佬教程

我有这个需求的话直接在adgh添加dns重定向就好了

我回来研究下看看

感觉说的不是很清晰,这个需求不是简单的内网DNS重写吗

我现在在用tailscale在外网访问局域网,
外网dns设置的是 alist.xxx.com → 100.64.x.x (tailscale的IP)
家里局域网dns重写为 alist.xxx.com → 192.168.x.x (局域网IP)

只是DNS重写的话,是没办法指定端口的,默认是到80端口,所以需要反代一下

开发调优, Lv1开发调优

我也是这种方案,局域网部署adguardHome作为dns服务器,使用tailscale来作为内网穿透服务。不过比较烦的是我电脑dns查询目前是有ipv6则优先使用ipv6,我又还没搞清楚怎么固定ipv6地址。

我也是这种方案,内网也要反代一下,让内外网都使用https,端口号也要一至。内网DNS劫持就可以了。