我的iptables DNAT规则在重启之前不起作用.如果我重启我的服务器,所有规则都有效.
@H_404_2@建筑的诠释:
@H_404_2@数十台主机(发件人)将一些UDP数据包(特定端口9999上的单向)发送到我的Linux路由器.这个Linux路由器使用iptables将这些数据包转发到多个主机(接收器).
@H_404_2@senderX 10.0.0.X ====>带iptables的Linux路由器====> receiverY 10.0.1.Y
@H_404_2@linux路由器有两个网卡eth1 10.0.0.1/24(发件人方)和eth0 10.0.1.1/24(接收方).
@H_404_2@iptables设置:
@H_404_2@> ip_forwarding已激活
>所有默认策略都设置为ACCEPT
>每个发件人都有一个iptables规则,这是一个例子:
>如果我重新启动服务器,所有规则都可以正常工作. @H_404_2@分析完成: @H_404_2@我添加了一条规则来记录一个不起作用的特定发件人:
>我如何解决这个问题?
>所有默认策略都设置为ACCEPT
>每个发件人都有一个iptables规则,这是一个例子:
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 10.0.1.123@H_404_2@网络设置 : @H_404_2@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,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,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@H_404_2@症状: @H_404_2@添加一组规则后,某些规则不起作用.我可以通过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@H_404_2@>如果我清除所有规则并在iptables中重新注入它们,那些无效的规则仍无效.
>如果我重新启动服务器,所有规则都可以正常工作. @H_404_2@分析完成: @H_404_2@我添加了一条规则来记录一个不起作用的特定发件人:
iptables -t nat -A PREROUTING -s 10.0.0.2 -i eth1 -j LOG --log-prefix='PREROUTING LOG :'@H_404_2@但是这个规则没有记录任何东西.数据包即将到来,因为我在tcpdump中看到了这些数据包,但它们未被记录.同样在iptables中使用-v选项,我没有看到此规则的计数器增加. @H_404_2@如果我在停止工作之前应用相同的规则,我会有一些日志. @H_404_2@题 : @H_404_2@> iptables中的UDP转发是否有任何限制?
>我如何解决这个问题?
解决方法
您描述的症状与NAT规则和连接跟踪条目之间存在冲突时看到的症状相匹配.
@H_404_2@例如,当数据包匹配时
-A PREROUTING -s 10.0.0.2 -i eth1 -j DNAT --to-destination 10.0.1.123@H_404_2@需要创建新的连接跟踪条目.这会将传入端的源和目标IP和端口元组映射到传出端的类似元组. @H_404_2@不存在与传入方匹配的现有连接跟踪条目,因为如果存在,则将使用它而不是规则.但是,一旦替换了元组的目标IP以构造传出侧的元组,元组可能与现有的连接跟踪条目冲突. @H_404_2@如果安装conntrack实用程序,则可以键入conntrack -L以查看现有连接跟踪条目的列表.该实用程序还具有仅列出符合特定条件的连接跟踪条目以及删除所选条目的功能. @H_404_2@如果这确实是您所面临的问题,那么删除有问题的连接跟踪条目将使问题消失.永久性修复通常涉及在两个方向上为数据包配置相关NAT规则,这样您始终可以获得所需的连接跟踪条目,即使第一个数据包恰好以与通常情况相反的方向发送.