Ipv6
nftables ip6 路由到 localhost/ipv6 nat 到環回
我正在嘗試將傳入的 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 和 iptablessudo sysctl -w net.ipv4.conf.all.route_localnet=1
,也許有一個類似的 IPv6 標誌?
不幸的是,您無法使用 nftables 實現您想要的。
在 dnat 目標之後,目標地址被重寫為環回地址 (
::1
),然後傳入的數據包由路由程式碼處理。但是任何從外部接收到的帶有環回目標地址的傳入數據包都必須被RFC 4291 2.5.3丟棄。沒有任何sysctl
變數可以改變這種行為。您可以執行一些代理應用程序,它將接受外部地址上的連接並連接到偵聽環回地址的應用程序。