坑边闲话:中国高效的校园网 IPv6 分配一般基于 DHCP/SLAAC,且百分之九十九的情况下都不会给 ipv6-pd 前缀,因此在宿舍内网里分配 IPv6 同时兼容 IPv4 NAT 一直是一个老大难的问题。中继模式看似可行,但是 OpenWrt 支持度并不高;NAT66 过于野蛮,也没有太好的用武之地。

本文介绍的方案可将路由器变成一个 IPv6 交换机,同时保持 IPv4 内网功能不变。

1. 警告·

注意,虽然通过 ebtables-legacy 命令在以太网层次实现校园网 IPv6 接入很棒,效果非常稳定。然而,这里面存在安全隐患。这种方式相当于把外网接到内网里,因为该方案利用了 IPv6、IPv4 双栈分离的特性,因此,OpenWrt 的防火墙对 IPv6 的入侵流量没有任何防护能力,所有的基于转发的过滤规则都不起作用。

这必然给骇客攻击留下了后门,毕竟 LAN Zone 是我们的后花园,允许另一个属性的流量自由出入,肯定不是好事情。虽然现在还不清楚有什么隐患,但是应该提醒读者,这并不是最佳实践。

图 1:可以看到,对于 IPv6 作用域,特别是频繁的 ICMPv6 流量,防火墙无能为力。

最后,如果你确实对校园网 IPv6 分配有需求,而且需要用到软路由,那么本文将把命令提供给你,有需要自己研究即可。同时要特别注意混杂模式环路问题

2. 固件配置·

首先固件需要支持 ebtables 命令或者 ebtables-legacy 命令。随后,找到你接入到校园网交换机的那个网卡的 id. 因为这套方案基于 ESXi 或者 Proxmox VE 虚拟化,所以我先把使用场景描述一下:

  • ESXi 有两个网口,一个接校园网,一个接内网交换机
  • 两个网卡分别配置到两个虚拟交换机上充当上行链路

OpenWrt 软路由要配置两个校园网网卡,如图 2 所示。其中一个网卡给 OpenWrt 自己用,接在 WAN6 防火墙下;另一个接入 br-lan.

接入 br-lan 的校园网网卡,要主动丢掉所有 IPv4 数据包,这是基于 ebtabls 实现的。ebtables 可以在链路层工作并处理以太网数据帧。命令如下:

1
2
ebtables-legacy -t broute -A BROUTING -i eth2 -p ! ipv6 -j DROP
ebtables-legacy -t filter -A OUTPUT -o eth2 -p ! ipv6 -j DROP

务必要把 eth2 改成你自己的网卡 id.

图 2:OpenWrt 接入了两个虚拟网卡。UCAS 是我们学校的英文缩写,这里用来指校园网。

图 3:br-lan 接入的第二个校园网网卡,注意对比图 2 里的 MAC 地址。

最后,ebtables 开机失效,所以要在启动项里添加:

1
2
ebtables-legacy -t broute -A BROUTING -i eth2 -p ! ipv6 -j DROP
ebtables-legacy -t filter -A OUTPUT -o eth2 -p ! ipv6 -j DROP

图 4:启动项添加命令。

如果最后,因为有很多广播包是漫无目的发送的,而且校园网 IPv6 分配是基于 SLAAC(至少我们学校是这样),所以要开启 ESXi 端口组的混杂模式:

图 5:混杂模式。其他两个可以开也可以不开。

如果你采用了这个方案,那我就不保证网络安全了。之前我说 IPv6 是安全的,那是因为有基于转发的防火墙策略,现在你将裸奔在广阔的 IPv6 世界。

3. 操作原理·

3.1 Linux bridge 网络基础·

Linux 对于网卡的配置非常灵活,单网卡可以直接配置 IP 地址并接入网络。此外,Linux 内核还提供一种名为 bridge 的桥网络。桥网络的应用场景很多,特别是在虚拟化和容器领域。

Linux 内核的 bridge 设备提供了以下功能:

  • 数据包转发:根据数据包的目的 MAC 地址在不同的网络接口之间转发数据包;
  • MAC地址学习:自动学习和维护一个 MAC 地址表,以便高效转发数据包;
  • 广播和组播处理:处理广播和组播数据包,将其发送到所有相关接口;
  • 生成树协议(STP)支持:支持 STP 协议,以防止网络环路;
  • VLAN 支持:可以创建和管理 VLAN,隔离不同的网络流量;
  • 防火墙规则:与 ebtables 结合使用,可以在桥接设备上应用链路层的防火墙规则。

3.2 ebtables 实现的内核网络行为·

在 OpenWrt 系统上,br-lan 指的就是处于 LAN Zone 防火墙下的接入内网的桥网络类型的接口。

注意,我们使用的是网络接口一词,而非网卡。在 Linux 中,可以创建虚拟接口接口别名来实现多个逻辑接口共用一个物理网卡。如 wanwan6 指代的可能都是 eth1 网卡。一般我们的软路由有三个及以上数量的网口,因此可将一个网口设置为公网接口,其余网口并入到一个桥网络(br-lan)并接入局域网(这些物理网口可以接内网设备),以统一的 MAC 地址和 IP 地址与内网中的其他设备通信并提供内网数据转发。

那么如本文所述,如果将校园网接入了 br-lan,系统内的流量会发生什么变化呢?

eth2br-lan 桥接设备中且 br-lan 连接到内网,则内网的 IPv4 广播流量会通过 eth2 发送到校园网。这是因为桥接设备在默认情况下会转发广播和组播流量到所有端口,包括 eth2. 如果学校那边的交换机做了下游 DHCP 流量阻断,我们内网中的信息广播出去也问题不大。然而,如果学校的网管没有做配置,我们的路由器就会对校园网造成网络攻击。此外,mDNS 等服务也会被广播带出去,造成内网的服务泄露,导致内网安全问题。总之,我们希望仅仅对 IPv6 做桥接,IPv4 流量进不来也出不去。

可以使用 ebtables 来阻止通过 eth2 的所有 IPv4 广播流量:

1
2
3
4
5
# 过滤所有通过 eth2 的非 IPv6 广播流量
sudo ebtables-legacy -t broute -A BROUTING -i eth2 -d ff:ff:ff:ff:ff:ff -p ! ipv6 -j DROP

# 过滤所有通过 eth2 的非 IPv6 流量
sudo ebtables-legacy -t broute -A BROUTING -i eth2 -p ! ipv6 -j DROP

以下规则将阻止所有从 br-lan 接口进入 eth2 的 IPv4 流量:

1
2
# 阻止从 br-lan 到 eth2 的非 IPv6 流量
sudo ebtables-legacy -t filter -A FORWARD -i br-lan -o eth2 -p ! ipv6 -j DROP

如此,可以保证我们不侵入校园网

总结·

通过将 IPv6 模式配置为“交换机”,可以实现校园网 IPv6 流量的内网透入。该操作要求路由器支持 ebtables,同时也要自己承担安全风险。

后续可能会出一些与 netfilter 技术相关的文章,敬请期待。