0%

使用Pcap_DNS搭建本地防污染DNS服务器

========================

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地址后,便会和百度的服务器进行通信,最后得到我们看到的网页。

dig

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服务器地址),都能给你返回查询结果。
dns_fake

解决方案

这里介绍使用Pcap_DNSProxy搭建防污染防劫持的DNS服务器。Win/MacOS都有编译好的二进制文件,可以直接下载使用。

下文介绍Arch Linux下的Pcap_DNSProxy的编译与使用,其他环境请参考chengr28的官方文档

  • 安装编译环境

sudo pacman -S gcc cmake libpcap libsodium openssl git bind-tools

  • 下载源码

git clone https://github.com/chengr28/Pcap_DNSProxy.git

  • 编译生成可执行文件

cd Pcap_DNSProxy/Source/Auxiliary/Scripts #进入指定目录
chmod 755 CMake_Build.sh #赋予脚本执行权限
./CMake_Build.sh #执行编译程序

  • 编译成功后,Pcap_DNSProxy/Source/Release 目录下的文件即目标程序和配置文件,我们先来测试一下。
1
2
3
cd ../../Release                      #切换到Relese目录
sudo ./Pcap_DNSProxy --disable-daemon #调试运行
dig @127.0.0.1 github.com #若能正常返回查询结果,即正常工作

设置开机自启

  • 进入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
2
> echo "nameserver 127.0.0.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf #修改系统DNS为127.0.0.1
>sudo chattr +i /etc/resolv.conf #其他网络管理程序可能会修改这个文件,设置特殊权限以避免被其他程序改动
  • 再来测试一下,类似的结果即配置成功
    dns_success

其他

  • 正常情况,Pcap_DNSProxy 可以做到开箱即用,你想做一些调整的话,可以修改配置文件Config.conf
1
2
3
4
Outgoing Protocol = IPv4  + UDP + TCP #优先使用UDP,提高解析速度
EDNS Label = 1 #EDNS 标签支持
SOCKS Proxy = 1 #允许使用Sock5代理,以远程解析DNS请求
SOCKS IPv4 Address = 127.0.0.1:1080

更详细配置请阅读文档

参考

欢迎关注我的其它发布渠道