
我的 iptables DNAT 規則在重新啟動之前不起作用。如果我重新啟動伺服器,所有規則都會生效。
架構說明:
數十台主機(發送者)會向我的 Linux 路由器發送一些 UDP 封包(在特定連接埠 9999 上單向)。這個 Linux 路由器使用 iptables 將這些封包轉送到多個主機(接收器)。
senderX 10.0.0.X ====> 附 iptables 的 Linux 路由器 ====> receiveY 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 --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
症狀:
新增一組規則後,有些規則不起作用。我可以透過 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 規則,因此即使第一個資料包碰巧以與通常情況相反的方向發送,您也始終可以獲得所需的連接追蹤條目。