您尚未登录。

#1 2016-12-19 20:57:32

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 231

pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

我觉得我是时候开个 blog 或者 wiki 了……每次都没地方记然后就扔到社区论坛来。

0. 动机
之前一直用 dnsmasq,没有觉得有什么问题。然而现在有了 IPv6 的地址,可以直接用 IPv6 访问 Google 或者 YouTube 或者 t66y 之类的网址。那么问题来了,要访问这些网址首先需要能正确解析这些网址的 IPv6 地址,显然国内没有 DNS 可以提供干净的 IP 地址。所以打算用 Google 的 2001:4860:4860::8888 服务器。但是发现用如果用 UDP 进行查询,得到的结果依然是被 GFW 污染过的,用 TCP 查询是没有污染的。但是 dnsmasq 似乎不支持 TCP 查询呐!坑啊!所以打算用 pdnsd 来解决这个问题。

所以整个服务大致的框架是这样子的(冒号后面的表示应用程序监听端口):

                 TCP                  UDP
Google DNS:53 <-------> pdnsd:5353 <-------> dnsmasq:53 <-------> 本地应用程序(resolv.conf)

1. pdnsd
首先安装 pndnsd,然后把示例配置文件拷贝到 /etc 中:

# cp /usr/share/doc/pdnsd/pdnsd.conf /etc

然后删掉没用的东西,添加点有用的东西,最后大概是这样:

global {
	run_ipv4=off;  # 以 IPv6 模式运行,因为指定的 Google DNS 是 IPv6 的
	server_port=5353;  # 监听端口
	perm_cache=1024;
	cache_dir="/var/cache/pdnsd";
	run_as="pdnsd";
	server_ip = 127.0.0.1;  # Use eth0 here if you want to allow other
				# machines on your network to query pdnsd.
	status_ctl = on;
	                   # but may make pdnsd less efficient, unfortunately.
	query_method=tcp_udp;  # 查询方式,优先 TCP
	min_ttl=15m;       # Retain cached entries at least 15 minutes.
	max_ttl=1w;        # One week.
	timeout=10;        # Global timeout option (10 seconds).
	neg_domain_pol=on;
	udpbufsize=1024;   # Upper limit on the size of UDP messages.
}
server {
	label= "mydns";
	ip="2001:4860:4860::8888","2001:4860:4860::8844";  # 指定 Google DNS
	proxy_only=off;
	timeout=10;
	uptest=ping;
	purge_cache=off;
	preset=off;
}
source {
	owner=localhost;
	file="/etc/hosts";
}
rr {
	name=localhost;
	reverse=on;
	a=127.0.0.1;
	owner=localhost;
	soa=localhost,root.localhost,42,86400,900,86400,86400;
}

然后让 systemd 启动 pdnsd 服务。

2. dnsmasq
安装 dnsmasq,然后配置 /etc/dnsmasq.conf,大致有以下几行存在:

server=127.0.0.1#5353  # 这行强制使用 127.0.0.1:5353 (就是 pdnsd)来解析域名
listen-address=127.0.0.1
bind-interfaces
conf-dir=/etc/dnsmasq.d

然后启动 dnsmasq 服务就可以了。
这里还可以配合肥猫的 dnsmasq-china-list-git 使用,这样解析国内域名就走国内的 DNS 服务而不是使用 Google DNS。

3. resolv.conf
把 resolv.conf 的 nameserver 设置成 127.0.0.1 就好了。记得在 /etc/dhcpcd.conf 里加上 nohook resolv.conf。

后记
好吧写完之后怎么感觉这篇东西写得那么水呢?= =#
主要坑点在于让 dnsmasq 用非标准端口的 DNS 来解析,之前一直在研究怎么在 /etc/resolv.dnsmasq.conf 里指定端口,最后还是老老实实看 man 去了……

最近编辑记录 zsrkmyn (2016-12-19 21:13:19)

离线

#2 2016-12-20 09:49:00

jouyouyun
会员
注册时间: 2011-10-10
帖子: 242

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

Mark

离线

#3 2016-12-20 11:49:40

依云
a.k.a. 百合仙子
所在地: 一个等待妹纸出现的地方
注册时间: 2011-08-21
帖子: 4,388
个人网站

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

IPv4 上走 TCP 解析是会被 reset 的。所以我还是用的 UDP + 过滤的策略。

以下是效果:

>>> dig +short zh.wikipedia.org g.alicdn.com ssl.google-analytics.com | ipmarkup
198.35.26.96(美国加利福尼亚州旧金山市维基媒体基金会)
g.alicdn.com.danuoyi.alicdn.com.
123.125.18.109(北京市联通)
123.125.18.108(北京市联通)
ssl-google-analytics.l.google.com.
203.208.43.126(北京市北京谷翔信息技术有限公司BGP节点)

离线

#4 2016-12-20 17:21:42

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 231

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

依云 说:

IPv4 上走 TCP 解析是会被 reset 的。所以我还是用的 UDP + 过滤的策略。

嗯呐,我这也是刚好有 IPv6 地址,不然也不会来瞎折腾……

离线

#5 2016-12-20 23:05:38

LastAvengers
其实不是会员
所在地: Royal Blue Shit Univeristy
注册时间: 2015-05-01
帖子: 92
个人网站

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

阿森真的棒!

离线

#6 2016-12-21 10:32:50

ouyang
稀释
所在地: 安徽芜湖
注册时间: 2016-02-16
帖子: 43

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

没有v6的哭


——一只ID名为稀释的小白

离线

#7 2016-12-22 20:10:47

wxg4net
会员
注册时间: 2012-01-07
帖子: 210

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么


Arch Linux User

离线

#8 2016-12-22 23:49:48

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 231

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

wxg4net 说:

搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么

pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?

离线

#9 2016-12-23 12:46:27

wxg4net
会员
注册时间: 2012-01-07
帖子: 210

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

zsrkmyn 说:
wxg4net 说:

搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么

pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?

这个是可以的 只不过麻烦点。dnsmasq是可以指定域名用哪个dns解析。pdnsd是让个dns不解析某域名


Arch Linux User

离线

#10 2016-12-23 15:08:35

zsrkmyn
lazy...
注册时间: 2013-05-05
帖子: 231

Re: pdnsd + dnsmasq 解决 DNS 污染问题和国内网站域名解析问题

wxg4net 说:
zsrkmyn 说:
wxg4net 说:

搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么

pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?

这个是可以的 只不过麻烦点。dnsmasq是可以指定域名用哪个dns解析。pdnsd是让个dns不解析某域名

对啊,所以我选择了 dnsmasq 啊

离线

页脚