全平台开启 EUI64 功能,实现防火墙单设备放行
tags: 网络全平台开启 EUI64 功能,实现防火墙单设备放行
我的家庭网络一直实行“路由器严防死守,下级设备裸奔”的策略。简单来说,就是路由器来管理所有的入站、转发需求,下级设备关闭防火墙但不会直接暴露到公网。这样做有几个好处:
- 网络结构简单。所有的服务、应用入口都在路由器上,只需要开放路由器的入站就可以了,路由器反代其他设备上的服务。
- 照顾到各类型设备。智能家居设备的不可控,直接暴露到公网比较危险,可以把智能家居设备当跳板机来攻击内网设备。
但是最近出现了一些问题,家里有一个台式机,直接对它的访问只是简单的做了个 3389 端口转发,用于访问远程桌面,但是最近想用它串流玩游戏,我给整懵了。
因为 OpenWRT 的转发功能似乎只能指定 IP 地址,但这 IPv6 地址随时可能发生变化……总不可能让我每天去调整一次放行设备 IP 吧。
后面使用固定 SLAAC 的方法解决了这一问题。
SLAAC(无状态地址自动配置)
SLAAC(Stateless Address Autoconfiguration)是 IPv6 中的一种地址自动配置机制,它允许设备在没有 DHCP 服务器的情况下自动配置 IPv6 地址。其工作原理如下:
- 路由器发现:设备发送路由器请求(Router Solicitation)消息
- 路由器通告:路由器响应路由器通告(Router Advertisement)消息,包含网络前缀信息
- 地址生成:设备使用接收到的网络前缀和接口标识符(IID)生成完整的 IPv6 地址
在默认情况下,现代操作系统为了隐私保护,会使用随机化的接口标识符,这导致 IPv6 地址的后缀部分会频繁变化,给防火墙规则配置带来困难。
EUI-64 地址生成原理
EUI-64 是一种基于 MAC 地址生成 IPv6 接口标识符的方法:
- 将 48 位 MAC 地址分成两部分:OUI(24 位)和 NIC 部分(24 位)
- 在中间插入 FFFE(16 位)
- 将第 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 的安全优势,又解决了动态地址带来的管理难题。