========================
DNS介绍
我们使用的互联网是基于TCP/IP协议的,而TCP/IP的基石是IP地址,所以在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,但对于人类来说,记住很多IP地址是件很困难的事情,于是发明了DNS(Domain Name System,域名系统),现在我们访问网站时,只需要输入相应的域名,就能看到所需要的页面。这是因为互联网上有一种叫“DNS服务器”的计算机会自动把我们的域名“翻译”成了相应的IP地址,并告诉我们。以访问百度为例www.baidu.com
,系统会向DNS服务器(如8.8.8.8
)发送请求:“嘿,我要用度娘,赶紧告诉我它的IP地址”,DNS服务器收到请求后,就会回复我们:”这是百度的ip地址,请查收“,系统收到IP地址后,便会和百度的服务器进行通信,最后得到我们看到的网页。
DNS的问题
一般运营商(联通,电信,移动)都会搭建自己的DNS服务器,以提高响应速度,但是运营商会为了为了某些目的,会对DNS做一些手脚,导致我们无法通过域名解析出正确的IP地址。常用的手段有:DNS劫持和DNS污染。网上很多文章建议将DNS设为公共DNS(如阿里的223.5.5.5
,谷歌的8.8.8.8
,腾讯的119.29.29.29
),但是你们也太小看运营商了,以移动为例:他们会对UDP53(DNS默认向53端口用UDP包发送查询请求)进行抢答。随便输入一个IP地址(8.1.2.3不是任何公共DNS服务器地址),都能给你返回查询结果。
解决方案
这里介绍使用Pcap_DNSProxy搭建防污染防劫持的DNS服务器。Win/MacOS都有编译好的二进制文件,可以直接下载使用。
下文介绍Arch Linux下的Pcap_DNSProxy的编译与使用,其他环境请参考chengr28的官方文档
- 安装编译环境
sudo pacman -S gcc cmake libpcap libsodium openssl git bind-tools
- 下载源码
- 编译生成可执行文件
cd Pcap_DNSProxy/Source/Auxiliary/Scripts #进入指定目录
chmod 755 CMake_Build.sh #赋予脚本执行权限
./CMake_Build.sh #执行编译程序
- 编译成功后,
Pcap_DNSProxy/Source/Release
目录下的文件即目标程序和配置文件,我们先来测试一下。
1 | cd ../../Release #切换到Relese目录 |
设置开机自启
- 进入
Release
目录并编辑 Pcap_DNSProxy.service 文件,编辑完成后保存:
WorkingDirectory= 项为程序所在目录的绝对路径(例如:/home/my/Pcap_DNSProxy/Source/Release)
ExecStart= 项为程序所在目录的绝对路径,并在最后加上程序的名称(例如:/home/my/Pcap_DNSProxy/Source/Release/Pcap_DNSProxy)
- 自动安装到系统,并设为开机自启
sudo ./Linux_Install.Systemd.sh
- 修改系统DNS设置
1 | > echo "nameserver 127.0.0.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf #修改系统DNS为127.0.0.1 |
- 再来测试一下,类似的结果即配置成功
其他
- 正常情况,Pcap_DNSProxy 可以做到开箱即用,你想做一些调整的话,可以修改配置文件
Config.conf
1 | Outgoing Protocol = IPv4 + UDP + TCP #优先使用UDP,提高解析速度 |
更详细配置请阅读文档