我正在尝试将传入的 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 标志?
答案1
不幸的是,你无法通过 nftables 实现你想要的效果。
在 dnat target 之后,目标地址被重写为环回地址 ( ::1
),然后路由代码处理传入数据包。但是,任何带有环回目标地址的传入数据包都必须被丢弃RFC 4291 2.5.3。没有任何sysctl
变量可以改变这种行为。
您可以运行一些代理应用程序,它将接受外部地址上的连接并连接到监听环回地址的应用程序。