如何使用 iptables 重定向已建立的连接?

如何使用 iptables 重定向已建立的连接?

我正在尝试创建 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。

相关内容