我的局域网中有一些家庭服务器,通过 adsl 连接到互联网 我的路由器是基于linux的x86服务器,我在上面写了脚本 几个月前我将脚本更新为 nftables...
在 ipv4 下一切正常......
有一天,我发现我的ISP通过dhcp-pd提供ipv6 由于ipv6地址可能会发生变化,因此很难在服务器上设置静态的全局ipv6地址。 然后我正在考虑使用唯一的本地地址。 我需要类似的东西: ip6tables -t nat -A POSTROUTING -o eth0 -s fc00::/64 -j NETMAP --to 2006::/64 将地址 nat 为全局地址(并使用适当的 dnat 规则) 但我在 nftables 中找不到类似的东西......
我查了官方wiki: nft_nat
但是我不明白如何使用nft_nat。
如果是 ipv4 中的 /24 块,甚至可以将所有地址枚举到映射中。但在 ipv6 中枚举 /64 块确实是不可能的...
那么有没有办法通过nftables来做netmap呢? 或者我必须恢复到 ip(6)tables? 或者还有什么建议吗?
谢谢你。
对于像我这样寻找最新答案的人,可以使用
nftables
完成状态网络前缀转换(又名 NPT/NPTv6/NAT66)。有一个常规用例 – RFC 7157,无需网络地址转换的 IPv6 多宿主。
只需将以下
ip6 snat
规则放入 nat postrouting 挂钩中(使用您的前缀大小),如下例所示:
table inet mytable {
chain srcnat {
type nat hook postrouting priority srcnat; policy accept;
ip6 saddr <local-prefix>::/64 snat ip6 prefix to <public-prefix>::/64
}
}
您可以通过指定仅匹配从特定接口发出的数据包:
oifname "<outgoing-interface>" ip6 saddr <local-prefix>::/64 snat ip6 prefix to <public-prefix>::/64