DNAT:ed数据包消失

我有一台机器有一个DNAT规则,将数据redirect到邻居服务器:

iptables -t nat -A PREROUTING -p udp -d 10.99.193.116 --dport 54321 -j DNAT --to 10.99.193.115:54321 

可以看出,这个规则是经常触发的:

 pkts bytes target prot opt in out source destination 192K 19M DNAT udp -- * * 0.0.0.0/0 10.99.193.116 udp dpt:54321 to:10.99.193.115:54321 

但是,从接口看,redirect的数据包不会在接口上发送出去。

 $ tcpdump -i eth0 -n port 54321 17:03:36.553363 IP 172.21.0.159.54321 > 10.99.193.116.54321: UDP, length 82 17:03:37.514257 IP 172.21.0.20.54321 > 10.99.193.116.54321: UDP, length 39 17:03:37.633556 IP 172.21.0.91.54321 > 10.99.193.116.54321: UDP, length 82 17:03:37.678211 IP 172.21.0.196.54321 > 10.99.193.116.54321: UDP, length 68 17:03:38.542620 IP 172.21.0.185.54321 > 10.99.193.116.54321: UDP, length 39 

在添加这些规则之后,机器首次重新启动后发生了这个问题,所以推测这和现在有一些区别。 但是什么? 还是有一些内核bug,意味着即使计数器递增,这些数据包也被丢弃了?

该机器是一个CentOS4盒子,Linux 2.6.9-67.0.1.ELsmp。

您还需要FORWARD规则,例如:

 iptables -t filter -I FORWARD -m udp -p udp --dst 10.99.193.115 --dport 54321 -j ACCEPT 

并启用转发,当然:

 sysctl -w net.ipv4.ip_forward=1