文章

openwrt设置ipv6 nat

  编辑于:2024-03-30
文章目录

一般情况下,不建议对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

评论加载中