![控制本地 DNS 查询到本地服务器的源 IP?](https://linux22.com/image/98052/%E6%8E%A7%E5%88%B6%E6%9C%AC%E5%9C%B0%20DNS%20%E6%9F%A5%E8%AF%A2%E5%88%B0%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%BA%90%20IP%EF%BC%9F.png)
我的 Linux 路由器上运行着本地 DNS 服务器。我将其配置为仅允许来自我的 LAN (192.168.1.0/24) 的请求。我还希望服务器能够自行查询 DNS。为此,我也允许 127.0.0.1 作为源。
问题是该盒子对自身发出的每个查询都将其源 IP 设置为我的外部 IP。我确认了这一点tcpdump
;当服务器在 127.0.0.1 处查询自身时,数据包到达lo
目标 IP 127.0.0.1 的接口,但源 IP 是我的 ISP 的 IP。
使用dig -b
没有帮助。会发生完全相同的效果。
这意味着除非我明确地将 ISP 的 IP 添加到允许的 IP 中,否则 DNS 查找将无法在本地进行。由于我的 IP 可以是动态的,这实际上意味着将整个 IP 范围添加到 DNS 服务器。这在我的 LAN 上的机器上显然不是问题,因为它们正确设置了源 IP。该问题特定于服务器上对其自身的本地查询。
我希望能够告诉服务器使用显式源 IP 地址(不一定只是源接口)来对其自身进行查询。这可以做到吗?
答案1
要设置服务器主接口以外的源查询,请使用query-source
in BIND 选项。
设置是这样的,只有服务器/守护程序发起的查询才会使用该 IP 发出。
当心如果是内部/RFC 1918 私有地址,到外面去的时候就得做NAT了。
根据我的服务器,在/etc/bind/named.conf.options
:
options {
query-source address X.X.X.X;
}
其中 XXXX 是您的 IP 地址。
另一种选择是使用动态 DNS 服务,在那里注册您的 IP 地址,并根据 DNS 名称执行规则。当然,每当 IP 地址发生变化时,必须将脚本放置为 DHCP 挂钩以重新应用规则,这会带来一些小不便。
答案2
@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,如果你想作为答案发布,我会给你一个赞成票。