释放小七猫的分享欲

全平台开启 EUI64 功能,实现防火墙单设备放行

categories: 技术 tags: 网络
@ 17/09/2025

全平台开启 EUI64 功能,实现防火墙单设备放行

我的家庭网络一直实行“路由器严防死守,下级设备裸奔”的策略。简单来说,就是路由器来管理所有的入站、转发需求,下级设备关闭防火墙但不会直接暴露到公网。这样做有几个好处:

  1. 网络结构简单。所有的服务、应用入口都在路由器上,只需要开放路由器的入站就可以了,路由器反代其他设备上的服务。
  2. 照顾到各类型设备。智能家居设备的不可控,直接暴露到公网比较危险,可以把智能家居设备当跳板机来攻击内网设备。

但是最近出现了一些问题,家里有一个台式机,直接对它的访问只是简单的做了个 3389 端口转发,用于访问远程桌面,但是最近想用它串流玩游戏,我给整懵了。

因为 OpenWRT 的转发功能似乎只能指定 IP 地址,但这 IPv6 地址随时可能发生变化……总不可能让我每天去调整一次放行设备 IP 吧。

后面使用固定 SLAAC 的方法解决了这一问题。

SLAAC(无状态地址自动配置)

SLAAC(Stateless Address Autoconfiguration)是 IPv6 中的一种地址自动配置机制,它允许设备在没有 DHCP 服务器的情况下自动配置 IPv6 地址。其工作原理如下:

  1. 路由器发现:设备发送路由器请求(Router Solicitation)消息
  2. 路由器通告:路由器响应路由器通告(Router Advertisement)消息,包含网络前缀信息
  3. 地址生成:设备使用接收到的网络前缀和接口标识符(IID)生成完整的 IPv6 地址

在默认情况下,现代操作系统为了隐私保护,会使用随机化的接口标识符,这导致 IPv6 地址的后缀部分会频繁变化,给防火墙规则配置带来困难。

EUI-64 地址生成原理

EUI-64 是一种基于 MAC 地址生成 IPv6 接口标识符的方法:

  1. 将 48 位 MAC 地址分成两部分:OUI(24 位)和 NIC 部分(24 位)
  2. 在中间插入 FFFE(16 位)
  3. 将第 7 位(Universal/Local 位)取反

例如,MAC 地址 00:11:22:33:44:55 生成的 EUI-64 接口标识符为 0211:22FF:FE33:4455

通过 EUI-64 固定各系统设备的 IPv6 后缀

Windows 11

用管理员权限打开 PowerShell,输入 Get-NetIPv6Protocol。

PS C:\Users\sukipai> Get-NetIPv6Protocol


DefaultHopLimit               : 128
......
RandomizeIdentifiers          : Enabled
AddressMaskReply              : Disabled
UseTemporaryAddresses         : Enabled
......

注意到以下两个参数

RandomizeIdentifiers:网络配置参数,用于控制 Windows 操作系统在生成接口标识符(Interface Identifier,IID)时是否使用随机值。

UseTemporaryAddresses:设置使用临时地址。

输入以下命令使用 EUI-64 固定 IPv6 后缀

Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
Set-NetIPv6Protocol -UseTemporaryAddresses Disabled

执行后,IP 可能会瞬间发生变化导致断连,建议做好充分准备再操作。

变化后的 IPv6 后缀会包含你的网卡 MAC 地址。

Linux

在 Linux 系统中,可以通过 sysctl 配置来禁用随机化标识符:

# 查看当前配置
sysctl net.ipv6.conf.all.use_tempaddr
sysctl net.ipv6.conf.default.use_tempaddr
sysctl net.ipv6.conf.eth0.use_tempaddr

# 禁用临时地址和随机化标识符
sudo sysctl -w net.ipv6.conf.all.use_tempaddr=0
sudo sysctl -w net.ipv6.conf.default.use_tempaddr=0
sudo sysctl -w net.ipv6.conf.eth0.use_tempaddr=0

# 永久生效(以Ubuntu/Debian为例)
echo "net.ipv6.conf.all.use_tempaddr = 0" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.default.use_tempaddr = 0" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.eth0.use_tempaddr = 0" | sudo tee -a /etc/sysctl.conf

# 应用配置
sudo sysctl -p

重启网络服务或重新连接网络后,系统将使用基于 MAC 地址的 EUI-64 标识符。

macOS

在 macOS 中,可以通过以下命令配置:

# 查看当前网络接口配置
networksetup -listallnetworkservices

# 对于每个网络接口(如Wi-Fi、Ethernet),禁用隐私扩展
sudo networksetup -setv6privacy Wi-Fi off

# 验证配置
networksetup -getv6privacy Wi-Fi

或者使用 sysctl 方法:

# 临时禁用
sudo sysctl -w net.inet6.ip6.use_tempaddr=0

# 永久生效
echo "net.inet6.ip6.use_tempaddr=0" | sudo tee -a /etc/sysctl.conf

验证配置

配置完成后,可以通过以下命令验证 IPv6 地址是否使用 EUI-64 格式:

# Windows
ipconfig /all

# Linux
ip -6 addr show

# macOS
ifconfig en0 | grep inet6

查找包含网卡 MAC 地址信息的 IPv6 地址(通常以fe80::开头的链路本地地址和全局单播地址)。

防火墙配置示例

以 OpenWRT 防火墙为例,配置基于 EUI-64 地址的放行规则:

首先获取设备的 EUI-64 地址后缀,假设 MAC 地址为 00:11:22:33:44:55,生成的 EUI-64 后缀为 ::211:22ff:fe33:4455

在放行设备那填写 ::211:22ff:fe33:4455/-64 即可

注意

使用 EUI-64 会暴露设备的 MAC 地址,可能带来隐私风险。建议仅为需要放行 IPv6 转发的设备启用这一功能。

这种方法适用于家庭网络环境,既保持了 IPv6 的安全优势,又解决了动态地址带来的管理难题。