我有一个本地DNS服务器运行在我的Linux路由器上。我将它配置为只允许来自局域网的请求(192.168.1.0/24)。我还希望服务器能够查询自己的DNS。为此,我也允许使用127.0.0.1作为源。
问题是,该框对自己进行的每个查询都将其源IP设置为我的外部IP。我用tcpdump确认了这一点;当服务器在127.0.0.1查询自己时,一个数据包到达目标IP 127.0.0.1的接口lo上,但源IP是我的ISP的IP。
使用dig -b没有帮助。同样的效果也会发生。
这意味着,除非我显式地将ISP的IP添加到允许的IP中,否则DNS查找将无法在本地工作。因为我的IP可以是动态的,这实际上意味着向DNS服务器添加整个IP。这显然不是一个问题,在我的局域网上的机器,因为他们正在正确地设置他们的源IP。这个问题是针对服务器上的本地查询本身的。
我希望能够告诉服务器使用一个显式的源IP地址(而不仅仅是一个源接口)来对自己进行查询。这能办到吗?
发布于 2016-11-06 21:25:11
若要设置服务器主接口以外的源查询,请在绑定选项中使用query-source。
设置是这样的,只有由服务器/守护进程发起的查询才会与该IP一起运行。
请注意,如果这是一个内部/RFC 1918私人地址,您将不得不NAT它时,去外面。
根据我的服务器,在/etc/bind/named.conf.options中:
options {
query-source address X.X.X.X;
}其中X.x是您的IP地址。
另一个选项是使用动态DNS服务,在那里注册您的IP地址,并根据DNS名称执行规则。当然,当IP地址发生变化时,必须将脚本作为DHCP挂钩重新应用规则会带来很小的不便。
发布于 2016-12-03 17:12:43
@roaima的评论把我引向了正确的方向。
我的iptables POSTROUTING规则如下所示:
-t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to <my public IP>
只是在上面添加了一条规则来排除路由器自己的IP,修复了所有内容:
-t nat -I POSTROUTING 1 -s 192.168.1.1 -j ACCEPT
@roaima,如果你想发帖作为回答,我会给你一张上等票。
https://unix.stackexchange.com/questions/321472
复制相似问题