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

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,然后通信按预期工作。

你知道我遗漏了什么吗?我尝试了postroutinginput链中的一些规则,但无法使其工作。回到 IPv4 和 iptables,我必须这样做sudo sysctl -w net.ipv4.conf.all.route_localnet=1,也许有一个类似的 IPv6 标志?

答案1

不幸的是,你无法通过 nftables 实现你想要的效果。

在 dnat target 之后,目标地址被重写为环回地址 ( ::1),然后路由代码处理传入数据包。但是,任何带有环回目标地址的传入数据包都必须被丢弃RFC 4291 2.5.3没有任何sysctl变量可以改变这种行为。

您可以运行一些代理应用程序,它将接受外部地址上的连接并连接到监听环回地址的应用程序。

相关内容