如何在 16.04 中获取稳定的 IPv6 地址?

如何在 16.04 中获取稳定的 IPv6 地址?

我有一个指向我家服务器的域名。在 Ubuntu 的每个版本(直到 Wily)下,默认情况下我都有一个稳定的 EIU-64 地址,可用于我的 AAAA 记录。但是,安装 Xenial 后,我似乎默认没有获得稳定的地址。

joejoe@myserver:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:24:1d:d2:e3:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.101/24 brd 192.168.0.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 2601:280:3068:2945:74ed:b303:6474:6e29/64 scope global temporary dynamic
       valid_lft 6965sec preferred_lft 3363sec
    inet6 2601:280:3068:2945:ac34:ea15:4340:29a4/64 scope global temporary deprecated dynamic
       valid_lft 6965sec preferred_lft 0sec
    inet6 2601:280:3068:2945:bdfd:6253:b07e:1308/64 scope global mngtmpaddr noprefixroute dynamic
       valid_lft 6965sec preferred_lft 6965sec
    inet6 fe80::dc3e:6127:bd4e:18b/64 scope link
       valid_lft forever preferred_lft forever

如您所见,所有inet6地址的scope global生命周期都是有限的。有没有办法找回我的 EIU-64 地址,或者有没有其他方法可以获取可以在域名记录中使用的稳定地址?

答案1

我刚刚明白了这一点。对于 中的每个连接/etc/NetworkManager/system-connections/,您需要设置以下属性:

[ipv6]
addr-gen-mode=eui64

16.04 中的 NetworkManager 似乎stable-privacy为该addr-gen-mode设置设置了默认值。

答案2

这里的其他答案有点不完整:如果你不这样做,更改 NetworkManager 配置是没有帮助的一个(这实际上是问题所在,见下文),而禁用 IPv6 隐私扩展实际上有点不相关(同样,如果您所谓的稳定 IPv6 地址在每次启动时都会发生变化,则删除额外的隐私地址无济于事)。

详情此主题,如果您使用有线连接,默认新安装的 16.04 会略有疏忽。NetworkManager 会自动生成一个“临时”配置,虽然效果很好,但很短暂。这意味着用于散列到据称一致的 IPv6 地址的 GUID 不会被存储,因此每次启动时您都会获得一个新的。只需进入 NetworkManager,在有线连接上按“编辑”,然后不做任何更改地保存它,就会生成一个实际的 NM 配置,并保存一个已保存的 GUID,因此每次启动时您都会获得相同的 IPv6 地址。

此地址是 RFC7217 地址(GUID、前缀等的加密哈希值)——因此,尽管每次启动时它都是稳定的,但它不是直接将您的 MAC 地址包含在地址中的那种。如果您想要其中一个 EUI64 地址,关于这个问题的另一个答案详细说明如何改变这一点。

答案3

Ubuntu 16.04 及之前的版本对我来说始终默认为 EIU-64,因此对于服务器,我必须禁用它。我很高兴在我的桌面上使用隐私地址。

所以你需要类似这样的东西:

    sysctl -w net.ipv6.conf.all.use_tempaddr=0
    sysctl -w net.ipv6.conf.default.use_tempaddr=0
    sysctl -w net.ipv6.conf.default.use_tempaddr=0
    sysctl -w net.ipv6.conf.<devname>.use_tempaddr=0

然后是 ifdown/ifup。对我来说,结果是,请注意 MAC/IPv6 关系:

$ ifconfig enp3s0 | egrep 'HWaddr|Global'
enp3s0    Link encap:Ethernet  HWaddr 74:d0:2b:90:8b:90  
          inet6 addr: 2501:300:d008:61c8:76d0:2bff:fe90:8b90/64 Scope:Global

如果您需要在某些接口上启用此功能,则可以命名特定接口。您可以使用以下命令查看列表:

$ sysctl -a | grep tempaddr

我不建议将网络管理器用于生产服务。例如,它不能很好地与其他服务配合使用,例如 /etc/sysctl.conf。如果您想这样做,您需要在 /etc/networking/interfaces 中输入静态地址或自动配置的地址。我只是使用:

auto enp3s0 
iface enp3s0 inet dhcp
iface enp3s0 inet6 auto
pre-up modprobe ipv6

当然要根据口味进行调整。

相关内容