例如我在 PREROUTING 链中添加了以下规则:
iptables -t nat -A PREROUTING -d 210.210.210.210 -j DNAT --to-destination 200.200.200.200
(假设这两个 IP 地址都是互联网上的网络服务器)
现在当我使用任何浏览器浏览 210.210.210.210 时,我都会被重定向到 200.200.200.200 到目前为止一切顺利..当我在浏览后立即从链中删除规则,然后刷新或再次输入地址并按“go”时,我仍然会被重定向到 200.200.200.200 它会保持这种状态几分钟,过了一会儿,当我重试时,我又回到了 210.210.210.210
如果是浏览器缓存问题,我该如何强制它不缓存 DNS 地址,或者 iptables 该如何防止这种情况发生?
答案1
Linux 中的 NAT 是通过“连接跟踪”基础架构实现的。顾名思义,它跟踪连接。nat 规则仅定义连接启动时要做什么 - 然后设置 NAT,创建 conntrack 规则,并且 iptables nat 规则不再用于此连接。
浏览器可能使用持久 HTTP 连接与服务器,在您删除规则后,请求将通过已建立的连接发送。
'conntrack' 实用程序(http://linux.die.net/man/8/conntrack) 来自 conntrack-tools 包,可以帮助您删除 conntrack 规则。
如果你无法使用该实用程序,你可以尝试使用其他 iptables 规则断开连接,例如这个(它会停止全部流量到 200.200.200.200):
iptables -I FORWARD -d 200.200.200.200 -j REJECT
通常这需要插入到 FORWARD 表 ('-I') 的开头,通常有一条规则来接受已在某处建立的所有连接。
我使用 REJECT,因为它会向发送方发送错误响应,这可能会比 DROP 更早地中断连接。