我有一台机器具有 DNAT 规则,可以将数据重定向到邻近的服务器:
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
但是,查看接口,重定向的数据包并没有从接口上发送出去。
$ 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
这个问题是在添加这些规则后第一次重启机器时发生的,所以可能当时和现在的情况有些不同。但是是什么呢?还是有一些内核错误导致这些数据包被丢弃,即使计数器增加了?
该机器是CentOS4盒,Linux 2.6.9-67.0.1.ELsmp。
答案1
您还需要一个 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