EUI-64 是一种根据网卡的 MAC 地址 生成 IPv6 地址后 64 位(即后缀)的算法。一般MAC地址都是固定的,那生成的后64位后缀就是固定的。
现在默认openwrt上已经设置好ipv6
了,但是LAN
下设备都还是动态的ipv6
怎么查看ipv6是否是EUI-64的
EUI-64 简要原理
EUI-64 是一种根据网卡的 MAC 地址 生成 IPv6 地址后 64 位(即后缀)的算法。其原理如下:
-
将 48 位的 MAC 地址分成两部分(前 24 位 + 后 24 位);
-
插入
FF:FE
到中间,使之变为 64 位; -
反转第 7 位(U/L 位,即从左往右数第 7 位)来标记是否是全球唯一地址。
举个例子:
-
MAC 地址:
00:1A:2B:3C:4D:5E
-
插入 FF:FE:
00:1A:2B:FF:FE:3C:4D:5E
-
将第一个字节(
00
)的第 7 位(U/L 位)反转:变成02
(因为00
->00000000
,反转第 7 位后为00000010
=02
)
最终的 Interface Identifier 是:021A:2BFF:FE3C:4D5E
脚本自动判断(Python 示例)
python
复制代码
def is_eui64(ipv6_suffix, mac_address):
mac_parts = mac_address.lower().split(":")
# 反转第 7 位
first_byte = int(mac_parts[0], 16) ^ 0x02
mac_parts[0] = f"{first_byte:02x}"
eui64 = mac_parts[:3] + ['ff', 'fe'] + mac_parts[3:]
eui64_str = ''.join(eui64)
ipv6_suffix_str = ipv6_suffix.replace(":", "").lower()
return ipv6_suffix_str.endswith(eui64_str)
print(is_eui64("021a:2bff:fe3c:4d5e", "00:1a:2b:3c:4d:5e")) # True
命令行工具(Linux 示例)
1. 查看 IPv6 地址
bash复制代码ip -6 addr show
输出示例:
plain
复制代码
inet6 2001:db8:abcd:12:021a:2bff:fe3c:4d5e/64 scope global dynamic
看后缀是否有 dynamic
, temporary
, stable-privacy
等标记。
这类 IPv6 地址可能来自:
-
随机生成的临时地址(Privacy Extensions)
-
DHCPv6 分配
-
手动配置
-
Stable Interface Identifier(RFC 7217) — 基于哈希生成,不依赖 MAC
分析关键字:
字段 | 含义 |
---|---|
global |
全局可路由地址 |
dynamic |
动态生成的地址(通常由 SLAAC 或 DHCPv6 分配) |
noprefixroute |
不会自动创建路由项(多用于网络配置或容器网络) |
重点在 dynamic
,这表示该地址不是手动设置的,而是通过 SLAAC(无状态地址自动配置) 或 DHCPv6 动态生成。
SLAAC + RFC 7217 生成的 Stable Privacy Address
-
基于接口、网络前缀、主机名等多因素 + 哈希计算出一个稳定但非公开的接口标识
-
不暴露 MAC 地址,防止隐私泄露
-
稳定性比临时地址高
Linux 默认开启 RFC 7217 特性,如果你使用的是较新的系统(如 Ubuntu 18+ 或 CentOS 8+),很可能你现在看到的这个地址就是通过它生成的。
用如下命令验证生成方式:
bash
复制代码
cat /proc/sys/net/ipv6/conf/enp2s0-ovs/use_tempaddr
-
值为
0
:不会生成临时地址(可能是 stable) -
值为
1
:生成 stable address -
值为
2
:生成 stable + temporary address
修改成eui64
在 /etc/NetworkManager/system-connections/
中编辑 .nmconnection
文件,将 addr-gen-mode
设置为 eui64
,这是完全有效、推荐且持久化的一种方式,适用于基于 NetworkManager 管理网络配置的系统(如多数基于 GUI 的 Linux 发行版或使用 NetworkManager 的服务器配置)。
重启NetworkManager
bash
复制代码
sudo systemctl restart NetworkManager
注意:generic
类型接口特殊
generic
类型接口,通常这种类型用于 OVS、桥接等情况,可能无法直接使用 NetworkManager 管理 IPv6 SLAAC 行为,或只起到桥接辅助作用。建议检查它上层桥(比如 br-xxxx
)是否才是真正启用 SLAAC 的接口。
参考
手把手教你使用OpenWrt固定IPv6_哔哩哔哩_bilibili
OpenWrt 开启 IPv6 公网访问全指南 - 晨鹤部落格
留言 (0)