新购买的 H3C NX30Pro 路由器,默认防火墙是关闭 IPv6 的, 即外网不能通过 IPv6 地址访问内部设备。

官方售后提供开启 IPv6 版本的固件,但是没有关闭开关,即对外全部开放。

对需要某些服务通过 IPv6 对外提供服务,但是又不想内网其它设备全部曝露在互联网之下的人来说,可以指定对外开放某台设备,比如设备A ,其它保持默认的禁止外网访问,这样是最好的。

联通宽带出于安全考虑,分配给用户的 IPv6 地址是动态的,每隔一段时间内网设备的 IPv6 地址会变化,观察如下:

# 真实数据
2023/12/17 05:57:01 2408:9174:678b:2fc5:7sd:61ff:fa9e:2a84
2023/12/10 11:45:06 2408:9174:678b:5baa:7sd:61ff:fa9e:2a84
2023/12/03 14:03:01 2408:9174:6786:18b8:7sd:61ff:fa9e:2a84

如上可见,IPv6 前四段是动态变化,后四段内网每台机器是固定不变的。

我们可以通过设置路由器防火墙规则,默认对外关闭 IPv6 访问,当访问的是设备A,即地址是 xxxx:xxxx:xxxx:xxxx:7sd:61ff:fa9e:2a84 时,放行通过。

# 默认防火墙是关闭 IPv6 的,只需要添加放行指定设备即可
ip6tables -I FORWARD -d ::7sd:61ff:fa9e:2a84/::ffff:ffff:ffff:ffff -j ACCEPT

telnet 到路由器后执行命令,就会允许转发数据包到指定的 IPv6 地址范围内的任意地址。具体来说,它会允许通过路由器的 IPv6 防火墙来转发到目标地址在 ::7sd:61ff:fa9e:2a84::ffff:ffff:ffff:ffff 范围内的 IPv6 数据包。

解决完动态地址后,重启路由器,更改的配置不会保存,还需要处理:

  • 设置路由器开机启动执行指定的脚本
  • 路由器不能直接执行备份固件区脚本,需要把脚本保存在备份区,然后开机从备份区还原覆盖到系统
# 注意两个路径的差异
/mnt/config/script/forward.sh   # <------ 备份固件区
/etc/config/script/forward.sh   # <------ 开机启动从备份区还原到的目录

完整的处理如下:

# 远程 telnet
telnet 192.168.0.1 99
NX30Pro login: H3C
Password: xxxxxxxx

BusyBox v1.30.1 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 21.02-SNAPSHOT, r16802-295c612a4a
 -----------------------------------------------------

# 查看已有规则
iptables -nL --line
ip6tables -nL --line

# 查询
ip6tables -nL | grep 2a84
# 开放端口
ip6tables -I FORWARD -d ::7sd:61ff:fa9e:2a84/::ffff:ffff:ffff:ffff -j ACCEPT
# 关闭端口
ip6tables -D FORWARD -d ::7sd:61ff:fa9e:2a84/::ffff:ffff:ffff:ffff -j ACCEPT

## 永久保存方法1:/etc/rc.local,此方法测试失败
cat  /etc/rc.local
sleep 3
ip6tables -I FORWARD -d ::7sd:61ff:fa9e:2a84/::ffff:ffff:ffff:ffff -j ACCEPT
exit 0

## 永久保存方法2:uci+shell,成功
mkdir /mnt/config/script && vi /mnt/config/script/forward.sh

# !/bin/sh
gateway_ipv6=`ip6tables -nL | grep "7sd:61ff:fa9e:2a84" | wc -l`
if [ $gateway_ipv6 -lt 1 ]; then
    echo `date`" ip6tables add ipv6" > /root/1.txt
    ip6tables -I FORWARD -d ::7sd:61ff:fa9e:2a84/::ffff:ffff:ffff:ffff -j ACCEPT
else
    echo `date`" ip6tables allowed ipv6" > /root/1.txt
fi

# shell 逐行复制粘贴执行
uci set firewall.custom='include'
uci set firewall.custom.type='script'
uci set firewall.custom.path='/etc/config/script/forward.sh'
uci set firewall.custom.family='any'
uci set firewall.custom.reload='1'
uci commit firewall

root@NX30Pro:~# cat 1.txt 
Sun Nov 26 03:25:46 CST 2023 ip6tables allowed ipv6

开放指定设备 IPv6 后,如何被外网更好的访问,可以查看《家庭宽带 IPv6 公网地址被外网访问》