页次: 1
我觉得我是时候开个 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)
离线
Mark
离线
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节点)
离线
IPv4 上走 TCP 解析是会被 reset 的。所以我还是用的 UDP + 过滤的策略。
嗯呐,我这也是刚好有 IPv6 地址,不然也不会来瞎折腾……
离线
离线
没有v6的哭
——一只ID名为稀释的小白
离线
搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么
Arch Linux User
在线
搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么
pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?
离线
wxg4net 说:搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么
pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?
这个是可以的 只不过麻烦点。dnsmasq是可以指定域名用哪个dns解析。pdnsd是让个dns不解析某域名
Arch Linux User
在线
zsrkmyn 说:wxg4net 说:搞不懂为什么 pdnsd和dnsmasq 混用 pdnsd单独解决不了问题么
pdnsd 好像不能分域名选择 DNS 啊(或者是我不会用?
这个是可以的 只不过麻烦点。dnsmasq是可以指定域名用哪个dns解析。pdnsd是让个dns不解析某域名
对啊,所以我选择了 dnsmasq 啊
离线
页次: 1