同一域名,内外通达:详解局域网与公网的分流解析​

先来看效果,两条nslookup命令后面跟的都是同一个域名,前者使用家里的WIFI进行上网,后者用手机开热点模拟外网

|236L

可以看到两条命令返回了不同的IP地址,192.168.1.118 是内网飞牛NAS的主机IP,后者是我将飞牛NAS上部署的 OpenList 通过 Frp 映射到公网上的地址

要做到这个其实很简单,只需要在内网对DNS进行“劫持”即可,让其为指定的域名返回内网IP,不需要修改外网的任何配置

IPv6

另外,如果使用的是IPv6,现在大多数路由器都支持内外网自动分流
即路由器检测到访问的主机和当前设备位于同一局域网时不会走外部流量
一般在内网Ping IPv6地址时延迟个位数就是直接走内网了

实现这个,可以有两种途径,一是修改路由器的hosts,另一个是内网自建DNS服务器

注意

所有设备需要指定DNS为路由器IP为自建的DNS的IP,否则无效

修改路由器hosts

很多路由器都有这个功能,一般都在路由器后台或者管理路由器的app内可以找到

以小米路由器为例,需要前往米家app,在自定义Hosts内输入格式为 IP 域名 的记录,一行一条,如下图所示

|L|475

然后再ping你设置的域名,就会发现返回的IP是你设置的内网IP了

自建DNS

自建DNS的选择有很多,我以AdGuardHome为例,这是一个集成去广告、DNS服务器、DHCP服务器的开源局域网级的广告跟踪拦截软件,由AdGuard团队开发并可以免费使用

如果主路由器为OpenWrt,可以直接安装插件 kongfl888/luci-app-adguardhome ,并设置重定向53端口到Adguardhome

如果主路由不是OpenWrt,直接在内网的任意一台支持Docker的主机上安装,docker-compose.yml如下,其中53端口和3000端口必须映射,其余按需,其实内网使用只开53和3000就够了,注意修改最后两行的工作目录和数据目录的映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.8'

services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
ports:
- "53:53/tcp" # 映射 DNS over TCP
- "53:53/udp" # 映射 DNS over UDP
- "3000:3000/tcp" # 映射管理后台端口
#- "443:443/tcp" # [可选] 映射 HTTPS 管理界面
#- "443:443/udp" # [可选] 映射 HTTPS over UDP (可能用于 QUIC)
#- "853:853/tcp" # [可选] 映射 DNS over TLS (DoT)
#- "784:784/udp" # [可选] 映射 DNS over QUIC (DoQ) 或其他用途
#- "853:853/udp" # [可选] 映射 DNS over TLS over UDP (可能)
#- "8853:8853/udp" # [可选] 映射 DNS over HTTPS (DoH) over UDP 或其他用途
#- "5443:5443/tcp" # [可选] 映射其他加密 DNS 或管理端口
#- "5443:5443/udp" # [可选] 映射其他加密 DNS 或管理端口 (UDP)
volumes:
- /my/own/workdir:/opt/adguardhome/work # 持久化工作目录
- /my/own/confdir:/opt/adguardhome/conf # 持久化配置目录

安装完成后浏览器输入 IP:3000 按照指引配置好adgh后,点击设置-DNS设置,在上游DNS那里添加几条公共DNS
L|240

比如我设置的如下,你也可以使用你们当地的运营商DNS
国内推荐腾讯和阿里云的公共DNS,可以前往adguard提供的DNS列表选择几个延迟低的用 已知的 DNS 提供商 | AdGuard DNS Knowledge Base

注:国内不建议使用google或者cloudflare这种国外DNS,往往有减速效果

1
2
3
https://dns.alidns.com/dns-query
https://dns.pub/dns-query
https://doh.360.cn/dns-query

下面这个选项个人比较推荐并行请求

Bootstrap DNS 服务器就填写当地的运营商DNS,比如四川电信的 61.139.2.69218.6.200.139

填写完后点击应用

填写完后点击 过滤器 - DNS重写 ,添加你需要的映射规则

如果你是OpenWrt插件安装的,做到这里就已经结束了

但如果不是,则还差最后一步,前往路由器后台,修改DHCP配置,将DNS指向安装AdguardHome的IP地址
L|450

效果展示

尝试在内网访问,查看AdugardHome的日志

L|450

通过F12可以看到,在内网访问OpenList直接返回了内网IP

|169L

但是如果你在外网是用的HTTP/HTTPS隧道,或者用了Nginx反向代理,那么还需要在内网安装一个OpenResty或者Nginx来反向代理域名

Nginx 或 OpenResty 可以直接用 1panel 和 宝塔面板,也可以手动部署,看个人喜好

我直接用飞牛NAS应用商店内的 1panel 安装 OpenResty

提示

飞牛OS应用商店安装的1panel是飞牛团队魔改过的,无法升级,只能v1.10.18-lts版本
安装的OpenResty必须选择 1.21.4.3-3-3-focal 这个版本,其他版本会报错!!!

OpenResty安装完后选择添加网站,选择反向代理,输入域名和代理的ip,如下,如果外部有HTTPS,在1panel上申请SSL证书即可