我的 iptables DNAT 规则在重启之前不起作用。如果我重启服务器,所有规则都会起作用。
建筑结构描述:
数十台主机(发送方)向我的 Linux 路由器发送一些 UDP 数据包(在特定端口 9999 上单向发送)。此 Linux 路由器使用 iptables 将这些数据包转发到多个主机(接收方)。
senderX 10.0.0.X ====> 带有 iptables 的 Linux 路由器 ====>receiverY 10.0.1.Y
Linux路由器有两个网卡eth1 10.0.0.1/24(发送方)和eth0 10.0.1.1/24(接收方)。
Iptables设置:
- ip_forwarding 已激活
- 所有默认策略均设置为“接受”
- 每个发送者有一条 iptables 规则,以下是示例:
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --到目标 10.0.1.123
网络设置 :
ip addr show
:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 54:9f:35:0a:16:38 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.1/24 brd 10.0.1.255 scope global eth0
inet6 fe80::569f:35ff:fe0a:1638/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 54:9f:35:0a:16:3a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1
inet6 fe80::569f:35ff:fe0a:163a/64 scope link
valid_lft forever preferred_lft forever
症状:
添加一组规则后,有些规则不起作用。我使用 tcpdump 看到 UDP 数据包不再路由并且被拒绝。
tcpdump -n -i eth1 host 10.0.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:12:58.241225 IP 10.0.0.2.56859 > 10.0.0.1.9999: UDP, length 1464
16:12:58.241285 IP 10.0.0.1 > 10.0.0.2: ICMP 10.0.0.1 udp port 9999 unreachable, length 556
- 如果我清除所有规则并将它们重新注入 iptables,那么不起作用的规则仍然不起作用。
- 如果我重新启动服务器,所有规则都可以正常工作。
已完成分析:
我添加了一条规则来记录不起作用的特定发件人:
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j LOG --log-prefix='PREROUTING LOG :'
但是此规则不记录任何内容。数据包正在到来,因为我在 tcpdump 中看到它们,但它们没有被记录。此外,使用-v
iptables 中的选项,我没有看到此规则的计数器增加。
如果我在它停止工作之前应用相同的规则,我就会得到一些日志。
问题 :
- iptables 中 UDP 转发有任何限制吗?
- 我该如何解决这个问题?
答案1
您描述的症状与 NAT 规则和连接跟踪条目之间存在冲突时出现的症状相符。
例如,当数据包被匹配时
-A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 10.0.1.123
需要创建一个新的连接跟踪条目。这将把传入端的源和目标 IP 及端口的元组映射到传出端的类似元组。
不能存在与传入端匹配的现有连接跟踪条目,因为如果有,它将被用来代替规则。但是,一旦元组的目标 IP 被替换以构建传出端的元组,该元组可能会与现有的连接跟踪条目发生冲突。
如果您安装了该conntrack
实用程序,您可以键入conntrack -L
以查看现有连接跟踪条目的列表。该实用程序还具有仅列出符合特定条件的连接跟踪条目以及删除选定条目的功能。
如果这确实是您面临的问题,那么删除有问题的连接跟踪条目将使问题消失。永久修复通常涉及为两个方向的数据包配置相关的 NAT 规则,这样您总是可以获得所需的连接跟踪条目,即使第一个数据包恰好以与通常情况相反的方向发送。