一般情况下,不建议对IPV6使用nat,但如果有分流之类的需求,则可以对IPV6设置NAT。
共享一个IP
所有内网设备共享一个IP
首先登录到openwrt的后台页面
1.在网络→接口
设置中将所有WAN口的高级设置
中的委托 IPv6 前缀
与IPv6 源路由
取消选中
2.在网络→接口→全局网络选项
中Pv6 ULA 前缀
的第一个f改为d
3.点击网络→防火墙→区域
,点击wan的编辑,进入高级设置
,勾选IPv6 Masquerading
,部分较老版本的openwrt无此选项,则可在网络→防火墙→自定义规则中添加ip6tables -t nat -I POSTROUTING -s `uci get network.globals.ula_prefix` -j MASQUERADE
并保存。
可能需要重启路由器使配置生效。
1:1 NAT
使用netmap可以将内网的IPV6地址一一对应的翻译为公网IPV6地址,实现每一个内网设备都拥有不同的IPV6,要实现这样的nat只需要将上面操作的最后一步改为如下操作。
新版本的openwrt使用nft工具进行配置
以下命令需要通过ssh或者ttyd登录后台执行
nft add table ip6 myrule6 nft create chain ip6 myrule6 srcnat { type nat hook postrouting priority srcnat \; } nft add rule ip6 myrule6 srcnat oifname "WAN口实际名称" ip6 saddr != $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 snat ip6 prefix to ip6 saddr map { $(uci get network.globals.ula_prefix) : $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 } nft add rule ip6 myrule6 srcnat oifname "wan口实际名称" ip6 saddr != $(uci get network.globals.ula_prefix) snat ip6 prefix to ip6 saddr map { $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 : $(uci get network.globals.ula_prefix) }
部分网段可能不是/64的,需要根据实际情况进行修改。
老版本的openwrt使用ip6tables进行配置
ip6tables -t nat -A PREROUTING -d $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 -j NETMAP --to $(uci get network.globals.ula_prefix) ip6tables -t nat -A POSTROUTING -s $(uci get network.globals.ula_prefix) -o WAN口实际名称 -j NETMAP --to $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64
如此设置后,可以测试IPV6 NAT是否已经生效,若未生效,可能需要针对对应的设备设置路由
ip -6 route add default via `ip -6 route | grep -i '^default.*via' | grep -i -o 'via.*' | cut -d ' ' -f 2 | head -n 1` dev WAN口实际名称 metric 128
重启后,这些设置就会失效,可以将设置保存在/etc/hotplug.d/iface
,以ip6tables为例。
#!/bin/sh [ "$INTERFACE" = IPV6的WAN口名称 ] && [ "$ACTION" = ifup ] || exit 0 sleep 20s ip6tables -t nat -A PREROUTING -d $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 -j NETMAP --to $(uci get network.globals.ula_prefix) ip6tables -t nat -A POSTROUTING -s $(uci get network.globals.ula_prefix) -o WAN口实际名称 -j NETMAP --to $(ifstatus IPV6的WAN口名称 | jsonfilter -e '@["ipv6-prefix"][0].address')/64 ip -6 route add default via `ip -6 route | grep -i '^default.*via' | grep -i -o 'via.*' | cut -d ' ' -f 2 | head -n 1` dev WAN口实际名称 metric 128
该脚本会在IPV6的wan口启动20秒后设置相应规则,如果对脚本和网络配置没有足够了解,不要盲目使用脚本。
参考链接:
NPT6 as a core feature
https://www.right.com.cn/forum/thread-8291704-1-1.html