温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
一、本文背景
国内 DNS 解析返回的数据有一些是被污染的(错误的 IP 地址),这在日常开发工作中影响较大,所以需要进行一定的处理使之返回正确的 IP。国内网络素有大局域网美誉,但是很多开发网站都在局域网外,所以还需要一个能够自动搭桥上网的功能。
二、开始之前
本文方法主要通过一台已安装潘多拉固件(即 PandoraBox,OpenWRT 也可)的路由器来实现,要实现自动搭桥上网(下文简称 FS
)则需要一台能够正常上网的外网设备。
三、方法步骤
1、分析
DNS 防污染解析大致流程如下:
客户端访问请求
└─ DNS 请求
└─ 转发给路由器 ChinaDNS
└─ 根据国内路由表判断是否为国内网站
├─ 国内网站交给国内上游服务器处理 — 直接访问
└─ 国外网站交给的 FS 的 UDP 转发处理
└─ FS UDP 转发目的地为国外的 DNS 服务器 — FS 访问
下面我们将直接通过路由器的网页管理界面来实现。
2、安装
路径:系统 - 软件包
开始之前先更新一遍软件源,以更新软件清单。
I、ChinaDNS
在过滤器搜索 ChinaDNS
,然后在可用软件包里找到 luci-i18n-chinadns-zh-cn
点安装,由于软件管理工具opkg
依赖性特点,会自动一起安装 ChinaDNS
和 luci-app-chinadns
等软件包:
如果不想通过网页界面进行,在命令行中直接
opkg install
这三个软件包也可,下同。
II、Shadowsocks
即上文的 FS
。在过滤器搜索 shadowsocks
,然后在可用软件包里找到 luci-app-shadowsocks
点安装,同样的,会自动一起安装 shadowsocks-libev-config
、shadowsocks-libev-ss-local
、shadowsocks-libev-ss-redir
、shadowsocks-libev-ss-rules
和 shadowsocks-libev-ss-tunnel
等软件包:
3、配置
根据第 1 步分析,为实现这种效果,根据依赖性在配置上我们应该倒过来进行。
I、Shadowsocks
路径:服务 - 影梭
先在服务器管理添加服务器 FS
,然后点保存:
回到一般配置,配置两个地方,透明代理 和 端口转发,(主)服务器下拉选择刚保存的服务器 FS
,端口转发 的本地端口记下来后面要用到:
其他配置根据需要配置,保持默认也可,点 保存&应用。
II、ChinaDNS
路径:服务 - ChinaDNS
全部打勾,然后保存&应用即可,其中:
- 本地端口是下一步 DHCP 要用到的,记下来;
- 国内路由表是上一步影梭访问控制要用到的,记下来;
- 上游服务器需要填写
两个
DNS 服务器地址,第一个写国内 DNS 服务器地址,第二个写转发给 Shadowsocks 的UDP 转发地址,端口号即是上一步记下的 端口转发 的本地端口的值(UDP),两个地址间用半角逗号分隔:
回到影梭的访问控制中,默认策略是国内的直连(即刚记下的国内路由表),国外的一律通过上面的透明代理:
修改后记得保存&应用。
III、DHCP
路径:网络 - DHCP/DNS - 一般设置
下拉找到 DNS 转发,将其设置为第 II 步 ChinaDNS 记下的本地端口:
然后切换到 HOSTS 和解析文件,将 忽略解析文件 和 忽略 /etc/hosts 勾上,避免 DHCP 失效:
最后保存&应用。
4、验证
I、DNS 解析
[root@PDR:~]#dig google.com @127.0.0.1 +short
172.217.24.78
[root@PDR:~]#dig www.google.com @127.0.0.1 +short
172.217.161.132
[root@PDR:~]#host 172.217.24.78
78.24.217.172.in-addr.arpa domain name pointer sin10s06-in-f78.1e100.net.
78.24.217.172.in-addr.arpa domain name pointer hkg07s33-in-f14.1e100.net.
78.24.217.172.in-addr.arpa domain name pointer sin10s06-in-f14.1e100.net.
[root@PDR:~]#host 172.217.161.132
132.161.217.172.in-addr.arpa domain name pointer hkg12s17-in-f4.1e100.net.
可以看到 DNS 解析返回了无污染的正确 IP。
II、自动搭桥
[root@PDR:~]#curl http://members.3322.org/dyndns/getip
*.*.*.*(宽带外网 IP)
[root@PDR:~]#curl http://ifconfig.me/ip
*.*.*.*(FS IP)
[root@PDR:~]#curl -I https://www.google.com/
HTTP/1.1 200 OK
Date: Sat, 15 Feb 2020 14:00:59 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-02-15-14; expires=Mon, 16-Mar-2020 14:00:59 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=; expires=Sun, 16-Aug-2020 14:00:59 GMT; path=/; domain=.google.com; HttpOnly
Transfer-Encoding: chunked
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
Accept-Ranges: none
Vary: Accept-Encoding
[root@PDR:~]#curl -I https://www.baidu.com/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Sat, 15 Feb 2020 14:01:12 GMT
Etag: "575e1f65-115"
Last-Modified: Mon, 13 Jun 2016 02:50:13 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
可以看到访问已经按照我们的设置,实现了国内直连,国外自动透明代理。
参考文章: