kra*_*teg 4 networking linux iptables udp dnat
我的 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 -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 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
Run Code Online (Sandbox Code Playgroud)
添加一组规则后,有些规则不起作用。我可以通过 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
Run Code Online (Sandbox Code Playgroud)
我添加了一个规则来记录一个不工作的特定发件人:
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j LOG --log-prefix='PREROUTING LOG :'
Run Code Online (Sandbox Code Playgroud)
但是这个规则不会记录任何东西。数据包即将到来,因为我在 tcpdump 中看到了数据包,但它们没有被记录。同样使用-viptables 中的选项,我没有看到此规则的计数器增加。
如果我在它停止工作之前应用相同的规则,我会有一些日志。
您描述的症状与 NAT 规则和连接跟踪条目之间存在冲突时看到的症状相匹配。
例如,当一个数据包被匹配时
-A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 10.0.1.123
Run Code Online (Sandbox Code Playgroud)
需要创建一个新的连接跟踪条目。这会将传入端的源和目标 IP 和端口的元组映射到传出端的类似元组。
不可能有与传入端匹配的现有连接跟踪条目,因为如果存在,它将被使用而不是规则。然而,一旦元组的目标 IP 已被替换以构造传出端的元组,该元组可能会与现有的连接跟踪条目发生冲突。
如果安装了该conntrack实用程序,则可以键入conntrack -L以查看现有连接跟踪条目的列表。该实用程序还具有仅列出符合特定条件的连接跟踪条目以及删除选定条目的功能。
如果这确实是您面临的问题,那么删除有问题的连接跟踪条目将使问题消失。永久性修复通常涉及为两个方向的数据包配置相关的 NAT 规则,以便您始终获得所需的连接跟踪条目,即使第一个数据包恰好是在与通常情况相反的方向发送的。
| 归档时间: |
|
| 查看次数: |
7107 次 |
| 最近记录: |