Firewall

使用 nftables 進行埠轉發和 NAT

  • April 6, 2022

我有一個 OpenWRT 網關(自建 19.07,核心 4.14.156),它位於我的專用網路前面的公共 IP 地址上。我正在使用 nftables(不是iptables)。

我想在公共地址上公開一個非標準埠,並將其轉發到網關後面機器上的標準埠。我認為這曾經被稱為埠轉發:看起來您的網關機器正在提供例如 http 服務,但它實際上是網關後面的私有地址上的機器。

這是我的 nftables 配置。出於這些目的,我的“標準服務”在埠 1234 上,我希望允許公眾在 gateway:4321 上訪問它。

#!/usr/sbin/nft -ef
# 
# nftables configuration for my gateway
#

flush ruleset

table raw {
       chain prerouting {
               type filter hook prerouting priority -300;
               tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
       }
}

table ip filter {
       chain output {
               type filter hook output priority 100; policy accept;
               tcp dport { 1234, 4321 } log prefix "output ";
       }

       chain input {
               type filter hook input priority 0; policy accept;
               tcp dport { 1234, 4321 } log prefix "input " accept;
       }

       chain forward {
               type filter hook forward priority 0; policy accept;
               tcp dport { 1234, 4321 } log prefix "forward " accept;
       }
}

table ip nat {
       chain prerouting {
               type nat hook prerouting priority 0; policy accept;
               tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
       }

       chain postrouting {
               type nat hook postrouting priority 100; policy accept;
               tcp dport { 1234, 4321 } log prefix "nat-post ";
               oifname "eth0" masquerade;
       }
}

使用此設置,外部機器可以訪問位於 的私有機器gateway:1234。日誌顯示nat-pre從外部到網關 IP 的 SYN 數據包,然後forward從外部到內部 IP,然後nat-post從外部到內部,“現有連接”處理其餘的數據包。

連接到gateway:4321log as的外部機器raw,其中 4321 更改為 1234。然後 SYN 數據包被轉發到內部伺服器,回复 SYN 數據包回來,然後……什麼都沒有!

我認為,問題在於我沒有進行 nftables 配置,該配置會改變遠端機器所期望的internal:1234back 。gateway:4321即使masquerade更改internal:1234gateway:1234,遠端機器也不會期待,並且可能會轉儲它。

這個配置有什麼想法嗎?

您沒有翻譯埠號。當外部連接到埠 1234 時,這不是問題。但是到4321時,dnat會通過內部伺服器上的4321埠,而不是1234埠。嘗試

tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;

您不需要翻譯從內部伺服器返回的回複數據包。這是使用在第一個同步數據包上創建的連接跟踪表中的條目自動完成的。

引用自:https://unix.stackexchange.com/questions/555465