我使用 ubuntu 服务器作为 NAT 网络上用户的路由器。我想强制所有用户使用网络上设置的本地 DNS 服务器。即使他们在客户端计算机中使用公共 DNS 服务器,DNS 端口也应重定向 (DNAT) 到我的本地 DNS 服务器。这就是我想出的办法:
iptables -t nat -A PREROUTING -i eth5 -p udp --dport 53 -j DNAT --to 192.168.1.1:53
iptables -A FORWARD -d 192.168.1.1 -i eth5 -p udp --dport 53 -j ACCEPT
面向 NAT 网络的接口是eth5
。上述规则对我来说不起作用。有没有更好的解决方案?
编辑 1:我的目标是实现 Opndns 过滤器来阻止网络上的 bittorrent 流量。该过滤器目前运行良好,并且用户可以使用本地 dns 服务器,因为他们使用 DHCP。但我担心他们可能会发现一种解决方法,例如手动指定 ip 地址和 dns 服务器 ip。
编辑2:以下代码在番茄固件上实现了该功能:
if (nvram_match("dns_intcpt", "1")) {
ipt_write("-A PREROUTING -p udp -s %s/%s ! -d %s/%s --dport 53 -j DNAT --to-destination %s\n",
lanaddr, lanmask,
lanaddr, lanmask,
lanaddr);
}
答案1
还有更好的解决方案吗?
是的——根本就没这么做。
无论您试图解决什么问题,干扰正常的 DNS 解析几乎从来都不是正确的答案。
编辑回复:您的更新。您试图使用技术来解决政策问题的做法并不恰当。不要这么做。
答案2
它不起作用,因为来自 DNS 服务器的回复绕过了防火墙。然后客户端将(正确地)丢弃这些响应,因为它们与发送的内容不匹配。
您需要在 POSTROUTING 表中添加另一条规则,以将发往 DNS 服务器的数据包 SNAT 到路由器的 IP。
或者,将 DNS 服务器放在单独的网络上可以解决问题,因为响应将被强制通过路由器返回。
答案3
为什么不直接将 DNS 流量转移到任何外部 DNS 服务器呢?那些明确指定外部服务器的人会注意到,这样做不起作用。