原本在路由器上搭建过一个 PcapDNSProxy 用来做 DNS 解析,但是出门在外,没有一个好的无劫持 DNS 解析难如登天。于是只好自己搭建一个 DNS 解析并主动屏蔽掉广告域名。
一、关于 DNS 域名污染的题外话
域名服务器缓存污染 (维基百科)
域名服务器缓存污染(DNS cache pollution),又称域名服务器缓存投毒(DNS cache poisoning),是指一些刻意制造或无意中制造出来的域名服务器封包,把域名指往不正确的 IP 地址。
在 2013 年左右的时候,域名污染突然增强了,当时还没有现在广泛普及的 Shadowsocks 这个小程序,于是一群人做了一份 hosts 表,在主机测避免 DNS 域名污染,直接从本地读取正确的 DNS 。但是这种方式有一个问题,那就是 DNS 是随时可能更新的,所以一些人开发了一个工具并搭建了一个服务器,让大家随时同步最新的 hosts 表。
但是这种工具在 2016 年就销声匿迹的,主要原因还是在于 DNS 污染可以直接读取 http 头中明文的一些信息,比如 url,比如证书,当发现你的访问链接是本应被污染的链接,就会阻断掉。而 hosts 无法防范这种攻击方式,所以被现在完全普及的 Shadowsocks 全面替换掉了。
二、如何防范 DNS 污染
你在搜索防范 DNS 污染时,可以看到一些常见的名字"DNSProxy""DNSmasq""PDnsd"。这些软件主要都是替你解析 DNS,并将结果缓存下来,当你再次查询时可以让查询速度变快,查询期间可以通过其他方式保证结果准确性等等。
而本人使用的 Pcap_DNSProxy,并弃用 udp 改为 tcp 方式解析 DNS 。这样暂时足够防止 DNS 污染,但是以后无法预测。
使用前,在此对 chengr28 作者表示感谢 [ Github ][ 备份链接 ]
三、 Windows 部署 DnsProxy
1 、下载 Pcap_DNSProxy,可以访问 Github 项目网址,并下载已经发布的 release 版本。
2 、下载 Npcap,链接可以到 Npcap 官网查看。如果你的系统版本比较低或者不熟悉 Npcap 可以选择 WinPcap 。
3 、解压 Pcap_DNSProxy,以管理员方式运行 ServiceControl.bat,打开命令行窗口后选择第一条 "1: Install service" 安装 Pcap_DNSProxy,服务会自动安装好。
4 、配置 Pcap_DNSProxy,自定义相关配置(配好后需要重启服务,重启为上一部选择第五条 "5: Restart service")
[Listen] Listen Protocol = IPv6 + IPv4 + TCP + UDP # 这个是 DNS 服务器开启的协议,默认是全开启 Listen Port = 53 # 这个是 DNS 服务器开启的端口,默认是 53 Operation Mode = Private # 这个是 DNS 服务器模式,默认是 Private 私人模式,可以改为 Server 服务器模式 [DNS] Outgoing Protocol = IPv4 + UDP # 这个是 DNS 查询时使用的方式,默认是 IPV4,使用 UDP 协议。建议改为 TCP 保证特殊解析正常 Cache Type = Timer + Queue # 这个是 DNS 缓存方式,是按照时间缓存还是按照数量缓存,默认时间和数量同时开启 Cache Parameter = 4096 # 这个是 DNS 缓存时间,单位为秒,默认为 4096 秒,建议增加时间,比如 86400 秒 [Local DNS] # 这个是境内 DNS 查询的配置 [Addresses] IPv4 Main DNS Address = 1.1.1.1:53 IPv4 Local Main DNS Address = 114.114.115.115:53 # 这个是境内 DNS 查询主机的地址 IPv6 Main DNS Address = [2606:4700:4700::1111]:53 [Proxy] SOCKS Proxy = 0 # 这个是 DNS 查询时是否启用代理查询,默认为 0 关闭,建议修改为 1 开启 SOCKS IPv4 Address = 127.0.0.1:10888 # 这个是 Sock 代理主机地址 [Switches] EDNS Label = 1 # 这个是允许使用 EDNS 扩展查询 EDNS Client Subnet Relay = 1 DNSSEC Request = 1 # 这个是开启 DNSSEC 检查 DNSSEC Force Record = 0 # 这个是关闭 DNSSEC 强制检查
四、 Linux 部署 DnsProxy
1 、下载 Pcap_DNSProxy,注意本次下载的是源代码,需要编译。
可以使用 Git 的方式下载 git clone https://github.com/chengr28/Pcap_DNSProxy.git
2 、编译 Pcap_DNSProxy 。
官方有完整的 Linux 编译安装说明(链接)。但是太繁琐了。所以直接贴上简单方式
#首先安装编译环境,由于 CentOS 默认编译环境版本过低,所以本次采用 SCL 源并使用 V7 版本的开发包
yum install centos-release-scl
yum install devtoolset-7-gcc* clang cmake3 libpcap libpcap-devel libevent libevent-devel libsodium libsodium-devel openssl openssl-devel
scl enable devtoolset-7 bash # 覆盖系统开发环境变量,仅临时有效,重启后恢复系统原环境变量
#进入程序目录准备开始编译,不要使用静态编译,会报错。
cd Source/Auxiliary/Scripts
ldconfig #刷新动态链接库
#然后编辑 CMake_Build.sh 修改 Cmake 版本为 cmake3
vim CMake_Build.sh
将 CMakeShell="cmake "改为 CMakeShell="cmake3 "
#开始正式编译
chmod +x CMake_Build.sh
./CMake_Build.sh
# 当查看到 [100%] Built target Pcap_DNSProxy 时则编译成功
#最后进入编译好的成品目录中
cd ../../Release/
3 、安装 Pcap_DNSProxy 服务
注意此 Release 目录可以移动到其他地方,然后再进行安装操作。
本文移动到/etc/pcapdnsproxy/目录下
#修改服务配置文件 vim Pcap_DNSProxy.service ExecStart=/etc/pcapdnsproxy/Pcap_DNSProxy WorkingDirectory=/etc/pcapdnsproxy/ #安装此服务 ./Linux_Install.Systemd.sh
4 、配置 Pcap_DNSProxy
自定义相关配置请参考本文之前内容
5 、开启防火墙端口并查看运行状态
firewall-cmd --add-service=dns systemctl status Pcap_DNSProxy
五、 Docker 版
来源 https://github.com/LisonFan/docker-pcap_dnsproxy
docker pull lisonfan/pcap_dnsproxy
docker run -itd --name pcapdnsproxy --network=dns -v /etc/pcapdnsproxy/Config.conf:/pcap_dnsproxy/Config.conf -p 53:53/udp -p 53:53/tcp --restart=unless-stopped lisonfan/pcap_dnsproxy
六、参考文章
PcapDnsproxy 官方 Linux 说明文档 [链接]
防 DNS 污染工具 Pcap_DNSProxy [链接]
一分钟快速搭建 Windows 防污染 DNS 服务器——Pcap_DNSProxy [链接]
Pcap_DNSProxy 二进制编译版或 python 版 [链接]
无污染 DNS 搭建 linux 下编译过程全记录 [链接]
SCL 项目:在 Red Hat 系列系统上安装同一软件的不同版本 [ 链接 ]
利用 Dnsmasq 部署 DNS 服务 [ 链接 ]