Nat

NFTables 偽裝不工作

  • March 2, 2021

我正在嘗試設置 NFTables 以將來自特定 UDP 埠的流量轉發到具有不同 IP 地址的另一台伺服器。但是,我的偽裝規則似乎不起作用。當我向這個特定的 UDP 埠發送數據包時,它會嘗試轉發流量,但不會將源 IP 更改為轉發伺服器的 IP 地址。據我了解,這應該與偽裝規則一起發生。但是,即使是 SNAT 規則也不起作用。

這是顯示問題所在的 TCPDump 輸出:

01:04:12.437619 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:12.437657 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <DestIP>.27015: UDP, length 9
01:04:14.145003 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:14.145051 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <DestIP>.27015: UDP, length 9

我希望它看起來像這樣:

01:04:12.437619 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:12.437657 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <ForwardIP>.7130 > <DestIP>.27015: UDP, length 9
01:04:14.145003 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:14.145051 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <ForwardIP>.7130 > <DestIP>.27015: UDP, length 9

這是我目前的 NFTables 的設置方式:

root@forwardtest:~# nft list tables
table ip compressor_forward

root@forwardtest:~# nft list table compressor_forward -a
table ip compressor_forward { # handle 1
       chain prerouting { # handle 15
               type nat hook prerouting priority dstnat; policy accept;
               udp dport 27015 dnat to 149.28.45.245 # handle 17
       }

       chain postrouting { # handle 16
               type nat hook postrouting priority srcnat; policy accept;
               masquerade random # handle 18
       }
}

我嘗試刪除randomNAT 標誌以及添加persistentNAT 標誌。對於我的情況,我確實需要randomNAT 標誌。但是,添加/刪除標誌並沒有什麼不同。

還設置了 IPv4 轉發:

root@forwardtest:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

IPTables (NAT) 也應該被刪除。以下是我執行的一些命令:

root@forwardtest:~# rmmod iptable_nat
rmmod: ERROR: Module iptable_nat is not currently loaded

root@forwardtest:~# lsmod | grep "iptable"

root@forwardtest:~# lsmod | grep "nft"
nft_masq               16384  1
nft_nat                16384  1
nft_chain_nat          16384  2
nf_nat                 40960  3 nft_nat,nft_masq,nft_chain_nat
nf_conntrack          139264  3 nf_nat,nft_nat,nft_masq
nf_tables             135168  8 nft_nat,nft_masq,nft_chain_nat

root@forwardtest:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

root@forwardtest:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

請記住lsmod | grep "iptable"什麼都沒退回。我也嘗試過創建postrouting優先級為 1 的鏈,但這沒有任何區別。

轉發伺服器Ubuntu 20.04 LTS在核心上執行5.4.0-26-generic

在這種情況下我有什麼遺漏嗎?話雖如此,我是 NFTables 的新手。因此,如果我遺漏了一些明顯的東西,我深表歉意。

如果您需要更多資訊,請告訴我!

非常感謝任何幫助!

感謝您的時間。

我解決了這個問題。我將轉發伺服器的核心從5.4.0-26-genericto升級了5.6.11-050611-generic,它開始正常工作。話雖如此,我確實嘗試在舊核心上重新啟動轉發伺服器,並且在重新啟動後問題仍然存在。因此,我確實相信核心實際上是這裡的問題。

絕對是一個奇怪的問題。我將設置另一個很快執行的測試伺服器5.4.0-26-generic來確認。

謝謝!

引用自:https://serverfault.com/questions/1017041