![如何使用 iptables 重定向已建立的连接?](https://linux22.com/image/784055/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20iptables%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%B7%B2%E5%BB%BA%E7%AB%8B%E7%9A%84%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我正在尝试创建 iptables 规则,将所有发往端口 1986 的流量重定向到端口 9,以使用以下规则引发“连接被拒绝”:
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1986 -j DNAT --to-destination :9
这对于新的连接非常有效,但问题是已建立的连接似乎跳过了这条规则并且没有被拒绝。
我尝试NOTRACK
在原始表中添加一条规则,以尝试避免连接状态跟踪,但这没有效果:
iptables -t raw -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j NOTRACK
将状态添加到 nat 规则也不起作用:
iptables -t nat -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j DNAT --to-destination :9
如何使用 iptables 引发在已建立连接上发送的数据包的“连接被拒绝”错误?
答案1
DNAT
当通过 TCP 三次握手建立连接时,该规则会在 conntrack 表中创建一个条目。
该notrack
规则似乎禁止创建新的 conntrack 条目。但是,它不会阻止使用现有的 conntrack 条目。
由于连接已经建立,因此 conntrack 表中已经有一个条目,内核使用该条目来转发流量。
您应该使用conntrack
工具从 conntrack 表中删除流。例如:
conntrack -D -s 192.168.1.10 -d 192.168.100.20 -p tcp --dport 1986
发出此命令后,使用 iptables 中的新 DNAT 规则将连接重新添加到 conntrack。然后新的目标服务器将拒绝该连接。我不确定新的目标服务器到底会发回什么,可能是 TCP RST。