本文适用于通常的UDP方式DNS查询不可用、不稳定或者无法正常解决DNS污染的情况,适用于但不限于以下情况:
1、你的ISP可能会封杀国外的大部分UDP通讯(如教育网)
2、UDP通讯不稳定,DNS解析经常卡住
3、代理服务器不支持代理UDP协议,又遇到长城宽带这种坑爹ISP时;
TCP方式查询,请搭配shadowsocks等代理效果更佳,使用shadowsocks代理路由器的TCP流量,使得TCP的DNS查询也能走shadowsocks代理,更加稳定安全。上面的第三条的情况可能必须这么做才能解决问题(没有长宽的网络环境无法测试)。
一. 使用dns-forwarder
dns-forwarder的安装可参考:《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》一文中的安装部分,到文中提到的地址,下载安装dns–forwarder_x.x.x–x_xxxx.ipk,luci–app–dns–forwarder_x.x.x–x_all.ipk即可。
配置也很简单,luci界面,“服务”→”DNS 转发”(英文界面是DNS Forwarder),如图配置:
然后将上级DNS请求转发至127.0.0.1:5311端口即可。同时请确保你的代理设置中,8.8.8.8是走代理的。
二. 使用unbound
首先安装unbound:
1 2 |
opkg update opkg install unbound |
然后修改 /etc/unbound/unbound.conf 文件,把以下内容相关的条目的注释取消,并按如下形式修改:
1 2 3 4 5 6 7 8 9 10 |
# unbound本地端口 由于dnsmasq占用53端口所以改用其他 如5454 port: 5454 # 启用TCP模式 tcp-upstream: yes # 设置转发的DNS服务器 forward-zone: name: "." forward-addr: 8.8.8.8 forward-addr: 8.8.4.4 forward-first: no |
启动unbound:
1 |
/etc/init.d/unbound start |
接着将DNS请求发送至unbound的端口即可。同时请确保你的代理设置中,8.8.8.8是走代理的。
三. 使用pdnsd
可以直接在Luci界面中,切至软件包配置页面,刷新列表后,键入pdnsd点击安装即可。(注:由于pdnsd软件早已停止更新,新版OpenWrt/LEDE的官方源中已经移除了pdnsd,OpenWrt CC及之前版本用户可以到BB版本的下载页面下载;LEDE用户需要自行编译。
配置/etc/pdnsd.conf,文件配置分为数个区域,主要修改global区域和server区域,其他区域保留默认值即可。具体的配置文件详情请查阅官方文档:pdnsd Documents
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# 这里是全局设置区域,酌情修改 global { perm_cache=2048; # 缓存文件大小,单位KB cache_dir="/var/pdnsd"; # 缓存文件位置,保留默认 # pid_file = /var/run/pdnsd.pid; # pid文件,不用管 run_as="nobody"; # runas,保留默认 server_ip = 0.0.0.0; # 监听所有 server_port = 25252; # pdnsd 监听端口 status_ctl = on; # 保留on # paranoid=on; # This option reduces the chance of cache poisoning # but may make pdnsd less efficient, unfortunately. query_method=tcp_only; # 只使用TCP min_ttl=6h; # 最小TTL时间,自己酌情往上加,默认是15分钟 max_ttl=1w; # 最长TTL时间,默认一周 timeout=10; # 全局超时时间,默认10秒,酌情修改 neg_domain_pol=on; # 用到neg domain的话可以试试,不用就不用管 udpbufsize=1024; # 默认 } # 这个是server区域,可以定义多组,定义pdnsd的上游dns server { label= "mydns"; # 为这组server起一个名字 ip = 3.4.5.6; # 填写DNS的IP地址,多个地址逗号分隔,可以换行,分号结尾 port = 5353; # 填写DNS的端口,我这里上一级是3.4.5.6,监听的5353 # 如果使用GoogleDNS等公共 DNS 这里端口号应该是53,或者删除该行也行 # proxy_only=on; # Do not query any name servers beside your ISP's. # This may be necessary if you are behind some # kind of firewall and cannot receive replies # from outside name servers. timeout=4; # 超时值,酌情修改 uptest=none; # 是否进行可用性检查,none=不检查,具体方法看官方文档 interface=eth0; # 可用性检查所用的interface名 interval=10m; # 检查频率 purge_cache=off; # 如果off,pdnsd不会主动清除缓存中过期的项目 除非缓存满了 edns_query=on; # 是否使用edns } |
给pdnsd设置开机启动:
1 |
/etc/init.d/pdnsd enable |
也可以在Luci的启动项配置页面找到pdnsd,将开机自动从禁用改成启用。接着,你需要将路由器的DNS请求转发至pdnsd上来,在上游DNS中填入:127.0.0.1:PORT,其中port是pdnsd监听端口,上面的配置文件中写的是25252。同时请确保你的代理设置中,8.8.8.8是走代理的。
最后,重启一下路由,应该就好了。
引用: Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙 - ShadowSocks