Ipv6

nftables ip6 路由到 localhost/ipv6 nat 到環回

  • July 19, 2019

我正在嘗試將傳入的 http 網際網路流量路由到

$$ ::1 $$:8080 這是我的 http 伺服器綁定的位置。我在僅 IPv6 的設備上使用 nftables。如果我添加以下規則:

 sudo nft flush ruleset
 sudo nft add table ip6 nat
 sudo nft add chain ip6 nat prerouting { type nat hook prerouting priority 0 \; }
 sudo nft add chain ip6 nat postrouting { type nat hook postrouting priority 100 \; }

 sudo nft add rule ip6 nat prerouting ip6 daddr [global-ip6] tcp dport 80 dnat to ::1 :8080

 sudo nft list ruleset

結果規則集:

table ip6 nat {
 chain prerouting {
   type nat hook prerouting priority 0; policy accept;
   ip6 daddr [global-ip6] tcp dport http dnat to [::1]:http-alt
 }

 chain postrouting {
   type nat hook postrouting priority 100; policy accept;
 }
}

然後請求

$$ global-ip6 $$:80 被吞下(沒有連接被拒絕錯誤)但沒有建立連接。 如果我使用其中一條規則

sudo nft add rule ip6 nat prerouting tcp dport 80 redirect to 8080

或者

sudo nft add rule ip6 nat prerouting ip6 daddr [global-ip6] tcp dport 80 dnat to [global-ip6] :8080

並將我的程序綁定到[global-ip6]:8080,然後通信按預期工作。

你知道我錯過了什麼嗎?postrouting我在和鏈中嘗試了一些規則,input但無法讓它發揮作用。回到我必須做的 IPv4 和 iptables sudo sysctl -w net.ipv4.conf.all.route_localnet=1,也許有一個類似的 IPv6 標誌?

不幸的是,您無法使用 nftables 實現您想要的。

在 dnat 目標之後,目標地址被重寫為環回地址 ( ::1),然後傳入的數據包由路由程式碼處理。但是任何從外部接收到的帶有環回目標地址的傳入數據包都必須被RFC 4291 2.5.3丟棄。沒有任何sysctl變數可以改變這種行為。

您可以執行一些代理應用程序,它將接受外部地址上的連接並連接到偵聽環回地址的應用程序。

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