我需要從 iptables 遷移到 nftables 嗎?

我需要從 iptables 遷移到 nftables 嗎?

我有以下 iptables 規則。

將來自 1.2.3.4 和 5.6.7.8(來源)的封包轉送到連接埠 10000 到 10.10.10.10:1080 上的外部ocks5 伺服器。伺服器IP為50.50.50.50

如果來源數量不高且同時外部socks5數量也不高,則該模式運作良好。一旦我有 50 個來源和 30k 外部襪子 - iptables 被卡住並且沒有資料包轉發,所以我懷疑 iptables 效能有限制。有人可以告訴我 nftables 是否更強大,如果是的話 - 如何將我的規則轉換為 nftables?

*nat
:PREROUTING ACCEPT [1:40]
:INPUT ACCEPT [1:40]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A PREROUTING -s 1.2.3.4,5.6.7.8 -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.10.10.10:1080
-A POSTROUTING -d 10.10.10.10/32 -p tcp -m tcp --dport 1080 -j SNAT --to-source 50.50.50.50

COMMIT

*filter
:INPUT ACCEPT [15:1012]
:FORWARD ACCEPT [26:1348]
:OUTPUT ACCEPT [9:932]
COMMIT

答案1

以下是對可能出現問題的粗略解釋。

  • 之前iptables規則:

    X(OP 的起始範例中的 X=2)來源 IP 位址,具有 2^16 個可能的來源連接埠和 1 個目標位址和連接埠:

    X * 2^16 可能的連接。

  • 之後iptables規則:X 個來源被壓縮為一個來源

    1 * 2^16 可能的連接。

X * 2^16 連線無法僅適用於 2^16 連線。來源連接埠衝突將開始越來越頻繁地發生,並透過更改來源連接埠來解決,但找到一個不與其他串流衝突的空閒來源連接埠將變得越來越困難:效能下降開始增加,甚至開始發生丟包。

如果情況會有所不同iptables被替換為nftables?不。此解決方案是在相同的通用 Netfilter 後端中完成的:nf_nat模組,如果需要的話可能會迭代多次,甚至放棄(即:刪除新的連線條目和觸發其臨時建立的資料包)。

原因是當存在單一可能的目標(伺服器)時執行來源 NAT:應該避免。

可能的解決方法:

  • 不要使用來源 NAT。應建立適當的路由(即使這需要多宿主或隧道),以便 10.10.10.10 不必看到單一 50.50.50.50 來源。該問題沒有解釋為什麼需要此 SNAT,因此無法進一步詳細說明。

  • 有多個來源位址來負載平衡並分散來源端口壓力。這可以透過以下方式實現iptables使用statistic模組負載平衡到多個SNAT目標。

切換到nftables通常是一種改進,但對於這種情況,這似乎不是解決方案。

相關內容