官方openwrt软路由科学上网状态下可以完美IPV6及科学上网
编译官方openwrt加入ssrp及smartdns完美解决国内域名IPV6上网和科学上网不和谐问题。
前面介绍了如何编译带科学上网的官方openwrt源码软路由固件。实际使用中需要完全关闭ipv6才能不影响科学上网。仅过滤IPV6 AAAA记录,会引起墙外域名间歇性不能访问或有个延迟才能访问。这是因为路由器只是过滤了IPV6 AAAA记录,但IPv6还是在工作着的,终端设备需等待IPV6的超时后返回的ipv4地址,然后通过ssrp访问墙外网站。另外域名被污染也是很严重的问题,我们需要得到完全可信的目标域名IP。
思索了下发现通过smartdns作为前置dns解析服务即可完美解决这个问题。它的作用相当于Lean的Turbo ACC网络加速中的DNS加速,不过Smartdns可以对dns上游服务器进行分类,不同组可以对dns服务做出不同的配置,完美满足了国内网站开启IPV6,境外网站关闭IPV6的要求,也不影响科学上网。
一、编译官方openwrt软路由固件
Openwrt官方源码自带smartdns,但是版本较旧。不需要最新版本,无需执行下步。编译时选择luci-app-smartdns
就好了。
如果想编译最新smartdns版本,在编译官方openwrt带科学上网的软路由固件第三步 “复制下载所需应用软件源码” 完成后增加一个步骤,修改smartdns源码。
#删除官方openwrt自带smartdns cd rm -rf openwrt/feeds/luci/applications/luci-app-smartdns rm -rf openwrt/feeds/packages/net/smartdns #下载最新发行版 cd && cd openwrt/feeds/packages/net/ git clone https://github.com/pymumu/openwrt-smartdns smartdns/ cd && cd openwrt/feeds/luci/applications/ git clone https://github.com/pymumu/luci-app-smartdns cd #改为最新master版 #openwrt/feeds/packages/net/smartdns/makefile 修改第15行commit SHA值 #luci-app-smartdns和Github主仓库luci可能有不同步 #再次编译如需更新 cd && cd openwrt/feeds/luci/applications/luci-app-smartdns && git pull cd && cd openwrt/feeds/packages/net/smartdns && git pull cd #已经编译过官方的版本,再次编译修改为smartdns最新版,遇报错需要执行 cd && cd openwrt rm -rf ./tmp ./scripts/feeds install -a
make menuconfig
编译的时候,在luci里面选中luci-app-smartdns
。其他修改编译步骤和原文一致。

二、配置DHCP及lan口ipv6
编译的固件刷入软路由后,登录软路由,拨号上网。看网络
—接口
虚拟动态接口wan_6
处有没有ipv6地址,如有的话说明你的网络ISP提供IPV6地址服务。如果isp确实提供ipv6,但路由器没有获取到ipv6地址,则应该检查下openwrt路由器wan、wan6的设置。

路由器拨号获取到ipv6地址后,我们就可以对路由器IPV6进行设置。
在网络
—DHCP/DNS
—高级设置
里不要选择 过滤 IPv6 AAAA
记录,其他无需变化。
网络
—接口
—lan
—编辑
,在高级设置
处 IPv6 分配长度
选择60或64 ,需要子网则根据运营商下发的定,上图中IPV6-PD(公网IPV6前缀)最后的值,大于等于该值且最高64,无需子网则设为64就行了。在DHCP服务器
—IPV6设置
处,RA服务:服务器模式,DHCPV6服务:服务器模式,NDP代理:混合模式。IPV6 RA设置无需进行个人设置,默认就行了。

具体RA服务、NDP代理这些名词是什么意思,见Openwrt路由器中ipv6相关说明 。
三、配置smartdns
SmartDNS这个软件毁誉参半,无明显共识。2023年五一节这几天折腾下来,发现其中一个原因是写的wiki不太友好,通篇下来并无完整的配置介绍。很多解释让人看了很费劲。其实国内外DNS商就那几个,在路由器luci-app-smartdns 软件里完全没有必要让使用者各种手工配置,应该在app程序中体现出来,毕竟没人比作者更懂SmartDNS。稍有配置不好路由器就无法正确运行。这里介绍我的处理方法,但是旧版(<41版)配置复杂,动手能力弱的看看就好,2023.42版LUCI界面已经内置了很多新功能,配置相对简单。简单设置smartdns也能用,只是只能对gfwlist列表里的网站访问,不能很好的解决域名污染问题,不在gfwlist表里的境外网站而且域名被污染的将不能访问。
我这里用的是ssrp,以 绕过大陆ip模式 说明。解决方案文字说明太麻烦,还是看shadowsocksr plus 配合SmartDNS的流程解析图:

可见能够获取到正确网站ip在B 、C 、D处,难点在C处,不在gfwlist列表里的境外网站极大可能获取到非可信目标IP,导致被墙依然不然浏览。这就需要默认组设置可信上游DNS,一般要设置境外Dot格式的上游dns,才能获取到可信的ip。SmartDNS如果默认dns全是dot格式,必须要设置个国内数字ip的上游dns,否则路由器刚开机有极大可能无法获得任何境外ip,连ssrp都不能正常工作,我这里出现过n次了。但是只要有国内上游dns,那么解析出的ip是被污染ip的可能性极大。(如果默认组全设置国外上游dns,解决上面问题的方法是等路由器启动完2-3分钟后 重启SmartDNS,后附脚本。)如果默认组能解析到正确的ip,这种方式完还是很好的。所以我们需要改下模式,用下面的方法,流程图见下:

GFWList 内置的域名已然跟不上 GFW 的更新,上面的问题在lean大的LEDE也不能很好的解决,后来lean大加入了 国内dns服务器
功能 ,也就是 chinadns-ng, 可以极大程度上缓解该问题。这里用Chinadns-ng对境外ip再一次用可信上游dns(smartdns第二组)获取可信ip,以解决SmartDNS默认组带来的污染ip问题。
下面就针对这种方式进行配置。luci界面配置参考下面的配置进行配置,最后我也会把luci-app-SmartDNS配置文件发出来,但是很多额外配置要放到手工配置里面,还有一些脚本需要自己新建。创建脚本不能windows文本文件创建,要UNIX格式,可以用Winscp软件 建立。
1、对SmartDNS默认端口进行设置
上图的A处,服务
—smartdns
—常规设置
,这里开始配置smartdns。
本地端口 设置一个没被占用的端口,如5888端口,不要设为为53、5333、5335端口。设置为5888端口就是让SmartDNS作为Dnsmasq的前置dns解析服务。如设置为53端口则SmartDNS会被设为路由器中的主dns,造成Dnsmasq的规则失效。而ssrp、passwall等都需要依赖Dnsmasq,造成科学上网失败或不稳定。5333端口是ssrp中chinadns-ng的默认端口,不能用,否则冲突。5335端口要设为SSRP的可信墙外dns服务端口。

TCP服务器、IPV6服务器、双栈IP优选、域名预加载、缓存过期服务、解析本地主机名、自动设置Dnsmasq都勾选上。自动Dnsmasq开启后会自动在Dnsmasq里开启转发服务,即Dnsmasq把DNS转发至127.0.0.1#5333
处解析。完成Smartdns设置后可以到DHCP/DNS
—常规设置
中查看。

默认第一组DNS服务器不要禁用IPV6地址解析,也就说国内网站开启IPV6。其他缓存大小、域名TTL等处设置无需配置,smartdns默认已设置为最优模式,适合大部分场景的DNS查询体验改善。smartdns默认自动根据磁盘空间是否启用缓存。
Openwrt路由器如果安装了luci-app-smartdns,配置需要在luci界面配置。启动smartdns后会自动生成smartdns配置文件,位置在/var/etc/smartdns/smartdns.conf
,该文件不能手工改,luci界面启动或重启会刷新。下面给出的配置文件,是作为参考用,看看在luci界面设置的正确与否,不能直接写入/var/etc/smartdns/smartdns.conf
。
2、设立国内域名组
就是上图的B处。我们一般期望国内网站可以返回ipv6,所以要设立cn组中国域名集。用于解析中国域名列表,这里设置了一域名组cn -group cn
,不参与默认解析 -exclude-default-group
。不用默认组解析的原因是默认组需要屏蔽ipv6解析。这里的上游dns都是国内的dns。
-exclude-default-group
表示将 DNS 服务器从默认组中排除。本例中,比如解析baidu.com的时候只用cn组的dns服务器,访问一个既不在gfwlist中又不在cn组的域名时则默认组、gfw组都参与解析。
完成后的配置参考如下:
#国内域名组cn server 114.114.114.114 -group cn -exclude-default-group server 223.6.6.6 -group cn -exclude-default-group server [2400:3200::1] -group cn -exclude-default-group server [240C::6666] -group cn -exclude-default-group
luci界面的配置方式很简单,上游服务器
里添加自定义dns,常规设置
输入名称、ip、类型等,高级设置
里服务器组名设为cn
,额外的服务器参数设为-exclude-default-group
。后就不再赘述了。
我们还要建立一组国内域名列表,供smartdns识别到国内域名并用cn组解析。Github有热心网友提供的V2Ray 路由规则文件加强版整理下载,我们只需要把规则文本转换成SmartDNS能认识的格式,下面给处脚本。
#!/bin/sh #先删除旧文件 rm /etc/smartdns/cn.conf #下载国内域名最新列表并合并到cn.conf,地址网站https://github.com/Loyalsoldier/v2ray-rules-dat curl "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/direct-list.txt" >> /etc/smartdns/cn.conf curl "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/apple-cn.txt" >> /etc/smartdns/cn.conf curl "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/google-cn.txt" >> /etc/smartdns/cn.conf #转换成smartdns格式,指定cn组解析 sed "s/^full://g;s/^regexp:.*$//g;s/^/nameserver \//g;s/$/\/cn/g" -i /etc/smartdns/cn.conf
以上脚本保存为cnsmartdns.sh
文件,放入 /usr/share/smartdns/
里,然后执行一下,并设置为定时任务,每天自动更新。
#执行一次生成cn.conf国内域名列表文件 chmod 755 /usr/share/smartdns/cnsmartdns.sh /usr/share/smartdns/cnsmartdns.sh #增加自动升级SmartDNS国内域名任务计划 echo "0 5 * * * /usr/share/smartdns/cnsmartdns.sh" >> /etc/crontabs/root
然后加入自定义配置文件。
#国内域名集 echo "conf-file /etc/smartdns/cn.conf" >> /etc/smartdns/custom.conf #重启SmartDNS /etc/init.d/smartdns restart
上面这句如果用luci界面配置,
就是在smartdns自定义设置
里面,写入一行 conf-file /etc/smartdns/cn.conf
。
3、SmartDNS默认组解析
图中的c处,默认上游DNS 我们不能让SmartDNS返回被污染的目标ip。我们对默认上游dns全部用dot协议的国外DNS,加入一个国内上游dns作为bootstrap启动DNS,只解析DNS服务器的ip,以解决全dot上游ip不能解析的问题。这里设置两个8.8.4.4和dns.quad9.net。最好有个ip格式的dot服务器。另外默认上游dns也不能返回ipv6,否则浏览器直接用ipv6地址访问,ssrp就失效了。
对于域名类的上游服务器,SmartDNS会使用bootstrap类的服务器进行解析,该dns服务器用-bootstrap-dns
参数。这里设置了用腾讯dns作为启动 DNS,同时不参与默认组解析。默认上游dns只返回ipv4,用 -whitelist-ip
参数表示白名单 IP 地址,白名单ip地址限制在0.0.0.0-255.255.255.255,返回的ipv6全部丢弃。
完成后的配置参考如下:
#默认上游dns server 119.29.29.29 -bootstrap-dns -exclude-default-group server 127.0.0.1:5333 -whitelist-ip server-tls 8.8.4.4 -whitelist-ip server-tls dns.quad9.net -whitelist-ip whitelist-ip 0.0.0.0/0
默认组不能有国内上游DNS服务商。由于不能有国内上游DNS,所以需要Chinadns-ng来解决这个问题,见流程图中的E处。默认组解析用了国外的上游DNS(Google 、Cloudflare)和Chinadns-ng,有点重复且套娃的感觉。用ChinaDNS-ng查询的目的是,避免cn组、Gfwlist组外的网站全用国外DNS,不能获取网站有国内CDN节点IP的缺点。有了Chinadns-ng既保证了国内网站(没被cn组记录的国内网站)解析出ip的速度,同时被墙的网站的解析ip又不被污染。
Luci界面里,设置上游dns不再赘述,再在smartdns自定义设置
里面,写入一行 whitelist-ip 0.0.0.0/0
。
默认组如果有国内上游DNS,该组解析出的被墙网站ip必被污染。由于还有其他国外上游DNS服务器解析,这样该组解析的ip就会出现时能访问,时不能访问。浏览器经常出现err_connection_closed的提示。如果被解析到facebook.com ,就会出现安全证书错误提示。如下图所示:

默认组的缓存如果使用了chinadns-ng功能,可以使用缓存,luci界面 缓存大小
不做设置即可。如果在流程图C处也就是有国内上游DNS,建议关闭默认组的缓存。因为一旦网站非可信ip地址被缓存下来,将很长时间内无法访问该网站,只有等到ttl时间到了重新获取才可能获取到正确的ip。电脑操作系统也会缓存dns的,所以只有初次访问的时候慢。可以打开 域名预加载 功能。缓存过期服务可以不要打开,重新获取DNS费不了多少时间。
4、SmartDNS第二组
图中的D处,这里主要设置第二组dns,作为可信上游DNS服务商,供返回无污染的目标ip用,这里必须要全用国外上游dns。无需设为Dot dns服务器,tcp协议即可,翻墙成功会自动走代理服务器的。
由于编译的是ShadowSocksR Plus+,在DNS 解析方式里提供了使用本机端口为5335的DNS服务
,这里SmartDNS第二dns服务器
—本地端口
设置为5335
。TCP服务器勾选启用。 服务器组设置为gfw
,跳过测速、跳过cache、停用ipv6地址解析勾选。由于测速是本地路由器到dns服务器的测速,而不是代理服务器到dns服务器的测速,所以需要关闭测速服务。跳过cache也需关闭,不然更换路由器里翻墙节点时候,还是用的旧的地区ip地址,导致网站访问速度变慢或不可访问(如netfilx网站)。也可以将Dnsmasq的DNS缓存关闭(DHCP/DNS
—高级设置
—DNS 查询缓存的大小
设为0)。由于ssrp+不支持ipv6,所以gfw组dns服务器需要停用ipv6地址解析。
完成后的配置参考如下:
#第二组上游dns server-tcp 8.8.8.8 -group gfw -exclude-default-group server-tls dns.google -group gfw -exclude-default-group server-tcp 1.1.1.1 -group gfw -exclude-default-group
Luci界面里自行设置第二组上游dns。第二DNS服务器的luci配置如图:

这样所有的上游DNS服务器就完全设置好了,效果见图:

5、屏蔽部分ipv6解析
由于ssrp需要定时进行【谷歌】连通性检查,对www.google.com进行ssr-check检测,我们需要屏蔽掉google.com的ipv6解析,不然ssrp在谷歌连通性检查时有几率ping到ipv6地址,而ipv6地址是无法通过ssrp代理的,导致过段时间ssrp就切换代理服务器。对doh查询服务器dns.google也需屏蔽解析的ipv6地址,防止ipv6不通,无法正常使用。可以在路由器shell里面ping这些地址看看有没有ping到ipv6地址。
shell命令行操作代码:
echo "address /google.com/#6" >> /etc/smartdns/address.conf echo "address /dns.google/#6" >> /etc/smartdns/address.conf
luci界面操作,是在高级设置
—域名地址
写入:
#屏蔽www.google.com的ipv6地址 address /google.com/#6 #屏蔽dns.goole的ipv6地址 address /dns.google/#6
注意:凡是高级设置、自定义设置里写入的内容不是写入到luci-app-samrtdns的配置文件里,而是写到了/etc/smartdns/
下的几个自定义配置文件里,在luci里面点击保存并应用
或强制应用
并不生效。需要点击下方的重启
按钮。也可以在路由器shell里面执行命令重启smartdns。
/etc/init.d/smartdns restart

6、延时重启
有时SmartDNS路由器开机后第一次doh可能无法解析,或不能获得正确域名格式的上游dns的目标ip,或缓存了错误的目标ip地址,需要重启SmartDNS才能正常使用。可以手工运行,也可以用脚本自动执行。这步属于可选。Openwrt路由器启动2分钟后重启一下samartdns,并在ssrp日志里写入,供检查成功与否。延时脚本如下:
#!/bin/sh /etc/rc.common START=99 start() { sleep 120 /etc/init.d/smartdns restart echo "SmartDNS deferred restart success after boot" >> /var/log/ssrplus.log }
将脚本保存为delaysmd
,放入 /etc/init.d
文件夹里。然后运行命令使之开机自动启动。
#开机自动2分钟后重启smartdns chmod 755 /etc/init.d/delaysmd ln -s /etc/init.d/delaysmd /etc/rc.d/S99delaysmd
7、完整的SmartDNS配置及下载
以下个人设置仅供参考。
四、ssrp设置
我们设置中需要调用Chinadns-ng对国外ip重新解析,防止获取到的是污染、虚假的目标域名IP 。在ShadowSocksR Plus+里并不支持使用 使用本机端口为5335的DNS服务
同时又开启国内DNS服务器(chinadns-ng)
,在gfw列表模式
下chinadns也不能被启用。也就是我们要修改以下源码,修改也是比较简单的,在shell里面输入:
#修改ssrp,使调用本机5335端口也能用chinadns-ng sed -i 's/o:value("0", translate("Use Local DNS Service listen port 5335"))/o:value("3", translate("Use Local DNS Service listen port 5335"))/' /usr/lib/lua/luci/model/cbi/shadowsocksr/client.lua sed -i '/o:depends({pdnsd_enable = "2", run_mode = "router"})/a \ \to:depends({pdnsd_enable = "3", run_mode = "router"})' /usr/lib/lua/luci/model/cbi/shadowsocksr/client.lua #去除ssrp中chinadns的前置解析服务 ,避免和smartdns争抢前置解析 sed -i '/server=127.0.0.1#$china_dns_port/d' /etc/init.d/shadowsocksr
使用本机端口为5335的DNS服务
的pdnsd_enable值原来为0,这里改为3 。0的话就不启用ssrp内置的一些dns解析方式。
还要去除ssrp内置的chinadns-ng前置解析,不然和smartdns争抢做dnsmasq上游服务器,导致ipv6解析异常。srp中chinadns-ng屏蔽了ipv6,这就是让smartdns做前置服务器的目的。
修改后我们就可以配置ShadowSocksR Plus+ 了。SSRP配置界面:运行模式:绕过大陆IP模式
、DNS解析方式改为 使用本机端口为5335的DNS服务
、国内DNS自行选择,其他设置自行修改。

ShadowSocksR Plus+中也无需将1.1.1.1、8.8.8.8等国外dns加入强制走代理的 WAN IP,防止路由器开机时代理服务器节点域名解析出现死循环。
五、相关ipv6、科学上网测试
以上配置好并重启路由器。电脑网络设置为自动获取ip,把电脑也重启一下或把计算机网卡关闭再打开重启下,让计算机重新获取ipv6地址,不然会获取到错误的ipv6。首先我们测试下电脑是否能正常ipv6上网。打开以下这个网站测试:
有科学上网最好用这个↓ http://testipv6.cn/ 这个也行↓ http://6.ipw.cn
由于科学上网的原因,别用www.test-ipv6.com等这些网站,他会用代理服务器的IP进行测试,而不是本地计算机的IP。

也可以用http://iptv.pdsu.edu.cn/
这个网站测试,由于只允许校园网,外网访问会出现403 forbidden,说明你的电脑正确启用了ipv6。电脑没有ipv6则出现一片空白,无法访问。
在电脑端也可以用nslookup
命令查询,如图:

可见国内域名返回了ipv6及ipv4地址,而境外域名只返回了ipv4地址。注意SmartDNS在早期版本只会返回一个IP地址,这一个IP地址速度是最快的,这对游戏、浏览器都很好,但对于一些视频播放软件、下载软件则不太友好。这些软件需要更多更好的IP地址。Smartdns从37版开始,支持返回多个优选的IP地址,IP列表中的第一个IP为最快地址。
检测smartdns及chinadns是否正常运行
root@OpenWrt:~# ps | grep smartdns 12405 root 22604 S /usr/sbin/smartdns -f -c /var/etc/smartdns/smartdns.conf 15674 root 1148 S grep smartdns root@OpenWrt:~# ps | grep chinadns 14174 root 844 S /var/etc/ssrplus/bin/chinadns-ng -l 5333 -4 china -p 3 -c 114.114.114.114#53 -t 127.0.0.1#5335 -N -f -r 15701 root 1148 R grep chinadns root@OpenWrt:~#
域名污染解决测试。提供2个既不在目前GFWLIST又被墙的境外网站,如果你能成功访问到,说明域名被污染的问题的得到了解决。不能访问说明域名污染问题没有得到解决。
https://imageglass.org/
https://www.smartdnsproxy.com/
技术不断升级,请注意文章时效性。
本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/net/1205.html
评论列表(7条)
请问按照上面设置了,有些pt网站获取不到IPv6地址,要怎么解决呢?
老哥,如果把ssrp换成openclash,也是同样的配置流程吗?谢谢
请问如果ssrp换成passwall,Chinadns-ng这一部分要怎么设置呢?
@Nick:用Passwall的话,作者的折腾之路基本都能绕过了,只要保证:
1. Dnsmasq里关闭过滤aaaa
2. SmartDNS默认国内组自动设置Dnsmasq,关闭停用IPv6解析,国外组则开启停用
3. Passwall远程DNS指向SmartDNS国外组
另外SmartDNS也不需要像作者这样设置这么多上游DNS,国内组只要两个运营商DNS即可(运营商的查询速度和质量现在基本上都会优于公共DNS,也不会像以前有广告之类的),而国外组只要Cloudflare+谷歌的DOT或DOH,再配个任意Bootstrap DNS即可。因为默认情况下,国外组的查询结果仅供Passwall分流,所以只要准确和查询快就够了。测速也可以全部关掉,只要最快响应结果,毕竟国内用运营商DNS的话,测不测速基本没区别,而国外组测速无意义,原因前面说了。
已经正常编译原版openwrt了,有1个疑问,关于屏蔽出国ipv6
我使用过程中仅采用GFW模式(以及netflix分流),如果只用这个模式,因为没有china-ng了,请问设置会有什么变化么..
@sa9685:用GFW模式配置的时候,
四、ssrp设置
里面的修改无需做。SMARTDNS里默认组也无需配置china-ng为上游。跟着作者的笔记,从个性化编译固件,到成功配置smartdns和ssrp。解决我之前开ssrp后不能ipv6的问题。十分感谢~