本文介绍了如何在爱快路由设备上配置 IPV6 网络防火墙,我们设置该防火墙的主要原因有以下几点:

  • 内网设备需要访问纯 IPV6 资源,例如观看 IPTV;
  • 某些内网设备缺乏防火墙保护,如果这些设备暴露在外网,将面临严重的安全风险。
  • 事实上只有部分内网设备需要外网访问权限,例如 NAS 和虚拟机,其他设备并不需要被外网访问。
  • 为了方便使用,在内网部署了 DDNS,将动态 IP 地址绑定到易于记忆的域名,这也存在外泄的潜在风险。

我们将从两个角度完成内网 IPV6 防火墙的设定:

  • 只给指定设备分发公网 IPV6 地址;
  • 只开放指定地址和指定端口的访问权限;

IPV6 地址获取

ipv6地址获取有两种方式:路由器通告前缀 + 设备自己的后缀[1];DHCP 给一个 /128 的地址。

需要明确:无状态和有状态,仅仅指的是 IPV6 地址的获取方式。前者实现方式是 SLAAC,后者是 DHCPv6,由于 SLAAC 只能获取到地址,无法获取到 DNS 等信息,亦存在一种组合搭配,所有方式如下:

方式地址前缀网关DNSAMO
SLAAC(无状态)RARARA-100
Stateless DHCPv6(无状态 DHCPv6)RARARADHCPv6101
Stateful DHCPv6(有状态 DHCPv6)DHCPv6DHCPv6RADHCPv601~
有状态 + 无状态111

原则上,出于易于管理的角度,我们推崇使用有状态 DHCPv6。在这种方式下,所有信息由路由器统一下发管理。然而,谷歌曾明确表示,安卓设备将只支持 SLAAC 的 IPv6 地址获取方式[2],因此,在有状态或者无状态的选取上根据个人需求而定[3]

对于爱快系统,有状态可与 DHCPv6 黑白名单 搭配使用,以便完成对指定设备(依据 MAC 地址)的 IPv6 地址分配。而无状态则通过设置 RA 通告绑定,与 前缀静态分配 搭配使用,实现对指定设备的地址分配,在前缀静态分配中填写本地链接 IPV6 地址(形如 fe80::8a35:2de7:e6f3:7582)。

ACL 规则

一些基本知识:

  • 允许的优先级大于阻断的优先级;
  • 方向中的转发/进所描述的对象为路由器,进指内网/外网访问路由,一般只需要使用转发;
  • 连接方向匹配中原始方向为发起方发起访问的报文,可以是内网发起,也可以是外网发起,应答亦是;
  • 后缀匹配:由于前缀动态变化,而后缀固定[4],所以匹配内网设备时使用后缀地址进行匹配;

假设运营商分配的 PD 前缀为 /60(aaaa:bbbb:cccc:ddd0::/60),即可划分 16 个 /64 子网(aaaa:bbbb:cccc:ddd0::/64 ~ aaaa:bbbb:cccc:dddf::/64),无状态下最小子网前缀要求便是 /64。

IPV6 禁入

全局 IPV6 禁入[5]

协议栈协议动作方向连接方向匹配进接口出接口
IPV6任意阻断转发原始方向wanlan

效果:阻断了外网对内网的 IPV6 访问。

隐私地址禁出

协议栈协议动作方向连接方向匹配源地址进接口出接口
IPV6任意阻断转发原始方向::ff:feff:0/::ff:ff00:0lanwan

禁止通过 EUI-64 生成的无状态 IPV6 地址发起的出流量,结合上条做到该类地址完全的禁入禁出。

EUI-64 根据设备 MAC 地址生成网络后缀,故存在 MAC 地址泄露风险[6],算法流程如下:

  • dc:50:e6:d0:3b:d0 => dc:50:e6:d0:3b:d0
  • dc => 11011100 => 11011110 => de
  • de:50:e6:d0:3b:d0 => de:50:e6: d0:3b:d0
  • de:50:e6: d0:3b:d0 => de:50:e6:ff:fe:d0:3b:d0
  • de:50:e6:ff:fe:d0:3b:d0 => de50:e6ff:fed0:3bd0
  • de50:e6ff:fed0:3bd0 => fe80::de50:e6ff:fed0:3bd0

允许外网访问内网指定端口

协议栈协议动作方向连接方向匹配目的地址目的端口进接口出接口
IPV6tcp允许转发原始方向::abcd/::ffff8443wanlan

关于目的地址:数据包实际从 WAN 到 LAN,走向目的地址,可以根据后缀匹配填写目的地址。

假设设备 IPV6 地址为:240e:aaaa:bbbb:cccc:0000:0000:0000:0001,简写为 240e:aaaa:bbbb:cccc::1,用后缀表示该地址变 ::1/::ffff,无状态随机地址不可控。

检测

可以在 IPv6 Port Checker 处完成端口外网检测,按照实际情况,运营商已经把 80, 443, 8080 等端口阻断了。


  1. EUI-64:根据自身 MAC 地址生成的全球 IPV6 地址;随机生成:为了保护隐私生成的临时 IPV6 地址 ↩︎

  2. 安卓设备在获取 IPV6 地址时必须使用无状态配置,且子网前缀要求大于等于 64。 ↩︎

  3. 由于无状态需要通过设备 MAC 地址计算得出,所以相比有状态地址,无状态地址长的多。 ↩︎

  4. 有状态地址后缀一定固定,无状态地址后缀需选用永久地址中的接口标识部分。 ↩︎

  5. TIP:未提及项保持默认值不做改动,下同。 ↩︎

  6. 有状态 IPV6 便于管理,但安卓设备不支持,在爱快中可以两种协议都开启。 ↩︎

评论