适用于家用场景的电信 IPv6 网络和防火墙配置
imbushuo
Please mind the gap
听说有些地方电信 PPPoE 能拿到一大段 IPv6 了,也听说最近电信联通都有领导要派人检查 IPv6 部署情况,那么是时候写个 CPE 设备的配置教程了。本文第一部分由 James Swineson 完成,第二部分由我完成。
首先确定你的设备是不是支持 IPv6 配置。如果你的设备是电信给的光猫,而且你没有开桥接/二层模式,那么在区域 BRAS 支持 IPv6 后,电信应该会给你推配置。这种情况下你可以关掉这个网页了,因为这篇文章对你的意义不大。
如果你开了光猫的桥接/二层模式,且你的设备支持 DHCPv6-PD 和 Router Advertisement,那么你可以继续。如果你用的是 TP-Link 之流的设备,那么你可以不用看这篇文章了,立即出门左转购买 Cisco ISR。
现在国际通行的家宽 IPv6 部署方法是采取 DHCP Prefix Delegation 的形式,即 ISP 给用户分发一个略大于 /64 的 IPv6 地址块,并将整个地址块路由给 CPE 设备。CPE 设备使用地址块中的任意一个 /64 地址块向下游设备发送 Router Advertisement。下游客户端设备使用 Router Advertisement 进行无状态自动地址配置并获得 IPv6 连接能力。
本文配置以一台 MikroTik Router OS 设备,以及一台 Cisco IOS 设备为例。
MikroTik
首先确认 PPPoE 拨号用的 Profile 启用了 IPv6 功能:
/ppp profile add change-tcp-mss=yes use-ipv6=yes name=pppoe
/interface pppoe-client add interface=GigabitEthernet0/1 profile=pppoe user=xxx password=yyy name=Dialer0
然后在 PPPoE 端口上开一个 DHCPv6 PD 客户端,把收到的 IPv6 Prefix 扔进一个地址池:
/ipv6 dhcp-client add interface=Dialer0 request=prefix pool-name=pppoe
最后给每个桥分配一段地址用作 SLAAC:
/ipv6 address
add address=::1/64 from-pool=pppoe interface=Vlan1 advertise=yes
add address=::1/64 from-pool=pppoe interface=Vlan2 advertise=yes
这里要注意的是如果 from-pool 配了池子,那么地址段会按顺序从 pool(也就是从DHCPv6客户端拿到的段)里面分配。所以address 不需要填完整地址,而只需要填你希望该路由器在该段里用的地址后缀。举个例子:如果 DHCP 拿到了 2001:db8:1234:5670::/60,你第一个address 填::5,那么你的路由器会自动从pool里面取出第一段即 2001:db8:1234:5670::/64 做 SLAAC,然后路由器自己配置 2001:db8:1234:5670::5 这个 IP。
Cisco IOS
ipv6 cef
ipv6 unicast-routing
ipv6 dhcp pool ChinaTelecom
prefix-delegation pool CT-IPv6
interface Dialer0
...
ipv6 address autoconfig default
ipv6 enable
ipv6 dhcp client pd CT-IPv6
ipv6 dhcp client request vendor
ipv6 nd ra suppress
interface Vlan100
...
ipv6 address CT-IPv6 ::/64 eui-64
ipv6 enable
ipv6 nd other-config-flag
ipv6 nd ra interval 180
ipv6 dhcp server ChinaTelecom rapid-commit
别的问题
已知电信的 ME60 的配置上,DHCP Renewing 很可能不工作,这会导致 MikroTik 重启时 DHCPv6 Client 卡住。Workaround 是在开机时执行一个脚本,禁用再启用一次 DHCPv6 Client 来把 Prefix 放掉。
对于非路由器角色的 Cisco 设备,在接入本地 IPv6 网络后,最好关掉默认发送的 RA,以免造成不必要的麻烦。
bc-sw0#conf t
Enter configuration commands, one per line. End with CNTL/Z.
bc-sw0(config)#int vlan250
bc-sw0(config-if)#ipv6 nd ra suppress all
bc-sw0(config-if)#end
bc-sw0#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
[OK]
bc-sw0#
推荐的客户端和防火墙配置
打开 SLAAC 隐私扩展
因为 SLAAC 和 EUI-64 使用的地址计算方法可以泄露设备的 MAC 地址,因此在需要高保密的个人设备上最好打开它。服务器和网络设备则无所谓,因为它们更需要固定的 IPv6 地址。现代操作系统一般都默认打开了 SLAAC 隐私扩展,所以一般在这一步不需要做任何操作。对于 Linux 发行版,请参见发行版的指南。
不要在任何地方阻断 ICMPv6 入站和出站
ICMPv6 报文在 IPv6 网络里扮演了非常重要的角色,因此不应该在任何客户端和网络设备上阻断 ICMPv6 报文的出入站。注意 ICMPv6 不只是 Echo (ping)。
打开设备的防火墙
Windows 和 macOS 的默认防火墙配置一般对于普通 IPv6 网络是够用的。很多 Android 设备默认没有配置防火墙,所以我们需要在 CPE 设备上对其进行一些配置。
CPE 设备的防火墙简单配置
以下以一台 MikroTik 设备为例,配置有状态防火墙,使得 CPE 网内设备主动发起的连接始终可用,而默认阻断未知的外部连接。
/ipv6 firewall filter
add action=accept chain=input comment="Allow established connections" connection-state=established disabled=no
add action=accept chain=input comment="Allow related connections" connection-state=related disabled=no
add action=accept chain=input comment="Allow ICMP" disabled=no protocol=icmpv6
add action=accept chain=input comment="Allow UDP" disabled=no protocol=udp
add action=drop chain=input comment="" disabled=no
add action=accept chain=forward comment="Allow any to internet" disabled=no out-interface=Dialer0
add action=accept chain=forward comment="Allow established connections" connection-state=established disabled=no
add action=accept chain=forward comment="Allow related connections" connection-state=related disabled=no
add action=drop chain=forward comment="" disabled=no
对于有其他入站需求的设备来说,可以对防火墙进行一些调整。