我正在尝试将传入的http internet流量路由到*1:8080,这是我的http服务器绑定到的地方。我在IPv6 6专用设备上使用nftable。如果我加上以下规则:
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 get吞食(没有连接拒绝错误),但没有建立连接。
如果我使用其中一条规则
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标志?
发布于 2019-07-19 09:42:40
不幸的是,您无法用nftable实现您想要的结果。
在dnat目标之后,目标地址被重写到回送地址(::1),然后由路由代码处理传入的数据包。但是,任何具有环回目标地址的传入数据包都必须由RFC 4291 2.5.3丢弃。根本就没有sysctl变量来更改此行为。
您可以运行一些代理应用程序,它将接受外部地址上的连接,并连接到侦听环回地址的应用程序。
https://serverfault.com/questions/975558
复制相似问题