dnscrypt-proxy和iptables联合使用,保护DNS查询
August 26, 2018 行动起来
dnscrypt-proxy是一个支持Dnscrypt和DNS-over-HTTPS的DNS查询器,一般在本机或路由器上配置,接受不加密的查询,并转换为加密查询发送。而iptables是Linux的防火墙工具,除了阻挡入站链接,还有各种路由器级功能,包括NAT、重定向、请求限制、日志等,甚至可以在符合规则的包到达时点亮LED灯。
首先配置好dnscrypt-proxy,用dig检查一下走dnscrypt-proxy的DNS查询是否正常,如果正常,参见下一部分。如果还没有,阅读官方文档来配置。
接下来,我们设置iptables规则,使系统上所有DNS请求走查询器,防止泄漏。可以添加用于改写包的目的地和端口的iptables目标的链位于NAT表中,首先,添加以下规则:# iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-port 53
,先对使用TCP的DNS查询重定向到查询器,然后执行dig +tcp [some domain]
检查配置是否正确。如果正确,将上一个iptables命令中的tcp改为udp,即iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-port 53
,再测试一下。设置DNS服务器为随机IP,只要能正常查询,设置就是正确的。如有条件,可以使用wireshark抓网络接口的包,检视53号端口。
注意:如果查询器并不监听
127.0.0.1
或::1
,需要使用DNAT。参见iptables-extensions(8)
。
但是,以上设置不适合调试(尤其是拥有DNS服务器或者网站时),这会导致无法正常查询非递归DNS。如果需要,用-d
选项指定要(或不要)被重定向的DNS包的目标地址。一般来说,阻挡到保留IP段(用于局域网)和运营商的DNS服务器即可。但是,这可能不能提供足够的保护。如果这么配置,应该运行DNS查询记录器,将所有其它查询重定向到它,以方便检视。
这些设置稍作修改,就可以做为透明代理。不过,不要阻挡代理本身的连接。这会导致无法连接。