家里装了OpenWrt路由器的朋友可能都遇到过这样的困扰:好不容易申请到了公网IPv6地址,结果每次重新拨号,运营商分配的前缀都会变化。这就好比你家门牌号天天变,快递员根本找不到地方送货。更头疼的是,OpenWrt防火墙规则默认需要写死IP地址,每次前缀一变,规则就失效了。
我去年给父母家部署智能家居时就踩过这个坑。当时设置了IPv6远程访问摄像头,结果三天两头失效,排查半天才发现是前缀变化导致的。传统IPv4时代的防火墙配置思路在这里完全行不通,必须理解IPv6地址的结构特性才能破局。
IPv6地址由128位组成,通常表示为8组4位十六进制数(如2409:8a20:5678:d000::f27)。关键要掌握两个特征:
我们先用实际命令观察下IPv6地址。在OpenWrt终端输入:
bash复制ifconfig br-lan | grep inet6
你会看到类似输出:
code复制inet6 2409:8a20:5678:d000::f27 prefixlen 64 scopeid 0x0<global>
这里2409:8a20:5678:d000就是动态前缀,::f27是设备后缀。为了验证后缀的固定性,可以:
bash复制# 重新拨号
ifdown wan && ifup wan
# 检查新IP
ifconfig br-lan | grep inet6
你会发现前缀变了,但后缀保持不变。
后缀的固定性源于EUI-64规范。以MAC地址"00:11:22:33:44:55"为例:
这就是为什么说后缀最后四位对应MAC地址后四位。我在树莓派上实测过,即使重装系统,只要不换网卡,这个后缀就不会变。
OpenWrt的防火墙配置文件位于/etc/config/firewall。我们需要修改的是"rule"段,关键语法是:
code复制list ip6src '::aaaa:bbbb:cccc:dddd/::ffff:ffff:ffff:ffff'
这表示:
假设要放行NAS设备(后缀::f27),配置示例如下:
bash复制config rule
option name 'Allow-NAS-IPv6'
option src 'wan'
option dest_port '5000'
option proto 'tcp'
option target 'ACCEPT'
list ip6dest '::f27/::ffff:ffff:ffff:ffff'
当需要管理多个设备时,可以创建地址组:
bash复制config ip6addrgroup
option name 'SmartHome'
list ip6addr '::f27/::ffff:ffff:ffff:ffff'
list ip6addr '::1a2b/::ffff:ffff:ffff:ffff'
config rule
option name 'Allow-SmartHome'
option src 'wan'
option dest_port '80,443'
option proto 'tcp'
option target 'ACCEPT'
list ip6dest '@SmartHome'
确认后缀正确性:
bash复制ip -6 neigh show
检查目标设备的实际后缀
验证防火墙加载:
bash复制ubus call firewall reload
iptables -L -n -v | grep -i ipv6
测试端口连通性:
bash复制nc -6zv [前缀]:[后缀] 端口号
大量使用::/::ffff:ffff:ffff:ffff规则可能增加防火墙负担。我的经验是:
bash复制fw3 -6 flush
fw3 -6 restart
虽然EUI-64后缀具有固定性,但攻击者可能伪造。建议配合:
bash复制config rule
option name 'Anti-Spoofing'
option src 'wan'
option dest 'lan'
option ip6proto 'icmpv6'
option icmp_type 'neighbour-solicitation'
option target 'DROP'
记录IPv6连接尝试:
bash复制config rule
option name 'Log-IPv6-Attempt'
option src 'wan'
option dest 'lan'
option ip6proto 'tcp udp'
option target 'LOG'
option log_level '4'
option log_prefix 'IPv6访问: '
然后在系统日志中就能看到类似记录:
code复制IPv6访问: IN=wan OUT= MAC=... SRC=2409:... DST=::f27 PROTO=TCP DPT=22
这套配置方案在我管理的30+家庭网络中稳定运行超过两年。最近帮朋友部署时,发现部分新版本OpenWrt已经内置动态IPv6支持,但理解底层原理仍然必要。遇到特别顽固的兼容性问题时,可以尝试降级到21.02稳定版。