家用宽带目前很多都部署了IPv6,家用路由器目前Padavan/Openwrt等系统都能较好地支持了IPv6。不过要充分利用IPv6链接设备,有些坑。
动态变化的IPv6地址
首先是IPv6地址,不同设备(操作系统)获取的IPv6地址有区别,较为通用的是【无状态EUI-64地址】,操作系统通过网卡的mac地址生成一个64位固定后缀,以及路由器下发的64位前缀,合成一个固定的IPv6地址。作为服务端,【无状态EUI-64地址】是较为适合的,Linux发行版很多组件(systemd-netword,dhcpcd等)默认都采用EUI-64地址。
另外还有通过DHCPv6下发的地址,这个就不大可控,跟DHCPv6服务器和终端客户有关,特点是生成的后缀较短。
此外,家用宽带ISP提供的IPv6前缀是不定期变化的。可见要访问家庭宽带内网的设备,光是地址就存在了蛮多的变化因素。
IPv6的【隐私扩展地址】
终端设备,比如手机、工作站版本Windows等设备,则使用【隐私扩展】的方式随机生成64位后缀,这样终端的地址每次链接时候都会随机改变,访问外部资源时候可避免被追踪。
如果要连接Windows远程桌面,安装的是工作站版本,系统默认已经启用【隐私扩展】,主机地址就是随机变化的,想要连接3389就很麻烦了,不过这个特性可以关闭。服务器版本的Windows默认不启用隐私扩展,而家庭版Windows不支持远程桌面[doge]。
管理员权限的CMD下执行
- netsh interface ipv6 set global randomizeidentifiers=disabled store=active
- netsh interface ipv6 set global randomizeidentifiers=disabled store=persistent
- netsh interface ipv6 set privacy state=disabled store=active
- netsh interface ipv6 set privacy state=disabled store=persistent
IPv6防火墙ip6tables
要从外网通过IPv6访问家里路由器下的设备,最关键一点是路由器上的防火墙要允许这样的转发。
Padavan/Openwrt都是基于Linux – ip6tables的防火墙。默认情况下,ip6tables只允许了v6子网内的设备被ping,只允许特定类型的ICMPv6报文通过,其他通信报文一律丢弃了。所以虽然IPv6下每个设备都有公网地址,但是还不至于不安全到每个设备都可让人随便连。
动态匹配EUI-64后缀
考虑到前缀变化因素,要访问特定设备,就是让IPTABLES匹配特定设备的EUI-64后缀放通这个地址:
- ip6tables -I FORWARD -d ::abcd:1234:5678:90ef/::ffff:ffff:ffff:ffff -j ACCEPT
可见iptables对v6地址的匹配掩码可以非常灵活,不像v4下只按前缀适配。坑的就是这个特征是没有文档的,目前文档中写的mask解释还是适配IPv4的内容,有人专门发邮件去netfilter列表问了才知道。IPv6地址中,双冒号::的写法代表是前/后均为0位,双冒号只能出现一次。
Openwrt中配置转发规则

Padavan中设置转发规则
其实padavan中的防火墙功能并没有配置地址匹配转发规则的功能界面,只能在自定义脚本中写原始的iptables命令。截图中使用的padavan是增加了QOS组件的老毛子版本。

以上。
参考文章:
现在家庭宽带的运营商,都已经提供 ipv6 了。
当你拨号上网后,运营商给你的路由器分配一个 ipv6 的同时,还会给你分配一个 ipv6 的前缀。
这样,你路由器后面的所有设备都会得到一个公网的 ipv6 地址。
但是,你会发现,内网的设备,虽然有公网ipv6地址,但无法从外网访问它们。仅能从外网ping通它们。
这是因为路由器的缺省设置。为了保护内网设备,缺省没有把内网设备暴露到公网上,仅仅允许从公网ping它们。
如果你内网有一台机器,提供了https或别的什么的服务,需要允许从公网访问它。
就需要修改路由器防火墙的设置,允许从公网访问这台机器的指定端口。
OpenWRT 的防火墙设置:
添加一个规则:
返回后,可以看到有一个”未命名的规则”,编辑它:
按需设置:
- 内网设备的ipv6地址,
前半部分是ipv6前缀,是运营商分配的。重拨后会变化。
后半部分,如果不是eui64,就是随机生成的,也会变。如果是eui64,则与mac地址相关,不会变化,除非换网卡。 - 如果整个ipv6都会变,防火墙规则就没办法写了。除非全网放行(内网目标地址掩码填
::/0或any)。 - 所以配置内网设备的ipv6地址为eui64,防火墙的内网目标地址掩码填
::xxxx:xxxx:xxxx:xxxx/::FFFF:FFFF:FFFF:FFFF, 这样就比较安全了。
(ipv6地址掩码比v4灵活,v6可以掩前面,也可以掩后面。v4就只能掩前面)比如: 你的ipv6地址为,2408:ebcd:ebcd:ebcd:5678:5678:5678:5678
则目标地址掩码填, 0:0:0:0:5678:5678:5678:5678/0:0:0:0:FFFF:FFFF:FFFF:FFFF
连续的 0 简写为两个冒号,即,::5678:5678:5678:5678/::FFFF:FFFF:FFFF:FFFF - 设置Linux的ipv6为eui64模式,请参考:(Linux ipv6 无状态 设置为 eui64)
- 获取本机ipv4/ipv6,更新ddns,请参考:(Linux中获取本机的最新IPv6地址_更新ddns的脚本)

—end—