..

使用 iptables 转发 dns 服务

最近发现手里的一个动态域名经常在需要访问的时候查询不到 IP 地址。这个域名服务器是自己部署在海外的。所以最开始出现的时候以为可能是国内的访问海外服务器不顺畅的问题。但最近越来越频繁的遇到,有点干扰正常的工作了。所以决定看一下怎么回事。

一路排除最后才发现原来声明的两个 NS 记录地址,其中有一个弃用了。但是忘记改记录了。所以就可能导致其他查询服务轮询到这个地址的时候会出现不可访问的情况。

解决这个问题也很简单,删掉那个没有使用的记录即可。不过为了避免国内访问海外不顺畅的问题,所以另外再部署一台服务器。但是这个 dns 服务器会访问数据库,如果部署多个实例可能会带来数据同步的问题。最后决定做一个简单数据转发即可。

基本情况

A服务器公网地址:100.0.0.1
B服务器公网地址:100.0.0.2
B服务器内网地址: 192.168.1.3(eth0)

配置 B 服务器

iptables -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 100.0.0.1:53
iptables -A POSTROUTING -p udp -d 100.0.0.1 --dport 53 -j SNAT --to-source 192.168.1.3

这是一个典型的数据转发,也很简单。这个时候从外部发起查询应该是会获得正确的 dns 数据。

dig @100.0.0.2 test.com

但是没有任何反应。直到 timeout。

检查了 net.ipv4.ip_forward,也是正确启用的。

百思不得其解的时候,突然发现了 iptables-save 输出的数据中。FORWARD 默认是全部 drop 的。将 eth0 设置为 accept 即可。

iptables -A FORWARD -i eth0 -j ACCEPT

再次从外部发起查询,即可获得正确的数据。