控制本地 DNS 查询到本地服务器的源 IP?

控制本地 DNS 查询到本地服务器的源 IP?

我的 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-sourcein 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,如果你想作为答案发布,我会给你一个赞成票。

相关内容