iptables可以丢弃stream量,但不能redirect

假设TCP数据包被发送到目的ip(dest_ip)并且可以通过以下命令被丢弃:

iptables -A INPUT -d dest_ip -p tcp -j DROP 

但是,当我尝试使用iptables NAT将数据包redirect到不同的ip(diff_ip)时,数据包仍旧到达旧目标(dest_ip):

 iptables -t nat -A PREROUTING -d dest_ip -p tcp -j DNAT --to-destination diff_ip 

有一些iptables,我不太明白在这里,因为我期待数据包不能再达到dest_ip。 有人能解释为什么这样吗? 谢谢。

可能相关的其他信息:
/ proc / sys / net / ipv4 / ip_forward已经设置为1
ifconfig显示两个接口:eth0和lo; dest_ip在eth0上,diff_ip是远程ip

更新1:使用telnet进一步testing

在12800上build立一个使用socat的监听器来接收telnet消息:

 socat -u TCP-LISTEN:12800,reuseaddr,keepalive,reuseaddr OPEN:/tmp/output.txt,creat,append 

Telnet连接使用随机消息进行:

 telnet 127.0.0.1 12800 

1)testing使用:

 iptables -A INPUT -p tcp --dport 12800 -j DROP 

结果:所有来自telnet的消息被丢弃,如计数器所确认的:

 iptables -L INPUT -v -n Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 2 120 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800 

2)testing使用:

 iptables -t nat -A PREROUTING -p tcp --dport 12800 -j DNAT --to-destination remote_ip 

结果:所有消息到达端口12800而不被redirect,这是由计数器确认的:

 iptables -L PREROUTING -t nat -v -n Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800 to:remote_ip 

更新2:进一步testing使用telnet(见上文),但在OUTPUT链上的iptables规则:

 iptables -t nat -A OUTPUT -p tcp --dport 12800 -j DNAT --to-destination remote_ip 

结果:由计数器确认所有消息都被成功redirect:

 iptables -L OUTPUT -t nat -v -n Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 3 180 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12800 to:remote_ip 

这是有道理的,因为telnet是一个本地进程,它的输出应该直接进入OUTPUT链。 然而,这又提出了另一个问题:根据更新1,telnet消息也可以放在INPUT链中,那么数据包究竟是如何传播的呢? OUTPUT – > INPUT?

你所有的testing都指出你应该弄清楚的东西。 在处理Netfilter / iptables时,如果不考虑数据包的stream动 ,就无法成功构build规则。

正如你所看到的,本地进程永远不会通过PREROUTING链,而只能通过OUTPUTPOSTROUTING 。 这就是为什么当你把你的规则放在OUTPUT时,你的telnet进程被redirect的原因,但是当你把它放在PREROTUING时, PREROTUING 。 但是,这个规则适用于穿越你的机器的外部数据包。