Debian/Ubuntu 中的静态 IPv6 地址广告和 IPv6 自动配置

Pas*_*cal 6 networking ubuntu debian ipv6

我有一个通过 IPv6 自动配置通告 IPv6 地址的网络。为了允许 DNS 查找并拥有花哨的 IP 地址,我们通过 /etc/network/interfaces 设置“静态”IPv6 地址:

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
    address a:b:c:d:e::f 
    netmask 64
Run Code Online (Sandbox Code Playgroud)

每当我们现在通过 IPv6 连接时,Linux 都会使用 IPv6 自动配置地址:

 a:b:c:d:21d:60ff:fe4a:479
Run Code Online (Sandbox Code Playgroud)

而不是静态 IPv6 地址:

 a:b:c:d:e::f
Run Code Online (Sandbox Code Playgroud)

另一端的服务器只能看到自动配置地址。

有没有办法强制 linux (Debian/Ubuntu) 将静态地址用于传出数据包?这对于反向 DNS 和防火墙设置尤其有趣。

我不想禁用 IPv6 自动配置,因为我无法控制路由器公布的设置。

Cel*_*ada 7

当然,防止使用 autoconf 地址的最简单方法是通过执行以下操作来防止内核创建它们:

echo 0 >/proc/sys/net/ipv6/conf/eth0/autoconf
Run Code Online (Sandbox Code Playgroud)

请注意,这不需要您重新配置路由器,以便它停止为前缀发出广告。

注意在评论中,您谈论的是/etc/gai.conf,但这不适用。这是glibc的配置文件,不是内核,影响的是目的地址选择,而不是源地址选择。

如果您仍然希望存在 autoconf 地址,但又不想使用它们,请继续阅读...

用于同一网络上的主机之间的通信

我找不到强制地址选择更喜欢静态地址而不是自动配置地址的好方法。通过查看RFC 3484 的所有规则,它们都没有真正的帮助。

您可以尝试更改已连接子网的路由表中的 /64 路由,使其具有“src”属性,但是当将子网中的任何地址添加到接口时内核会自动生成它,而我是事后编辑失败。

用于与 Internet 其余部分上的主机通信

您可以通过多种方式影响出站连接的地址选择。最明显的是src在路由上使用该属性。例如:

ip route add ::/0 via <gateway> src <desired-source-IP-address>
Run Code Online (Sandbox Code Playgroud)

但也许您的默认路由来自路由器广告消息并由内核自动插入。在这种情况下,您不可能为路由提供“src”属性。所以这里有另一种方法,基于配置地址标签。

默认情况下,在 Linux 中,内核的地址标签表如下所示:

prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 2002::/16 label 2
prefix fc00::/7 label 5
prefix ::/0 label 1
Run Code Online (Sandbox Code Playgroud)

这个想法是,当向带有标签的目标地址发起数据包时x,内核更喜欢使用带有相同标签的源地址x。因此,例如,如果您向具有 6to4 地址(即 2002::/16 中的地址)的主机发送数据包,则其标签为 2,内核将更愿意为传出数据包选择 6to4 源地址,如果有的话。

通用 IPv6 目标获得标签 1(::/0,匹配所有内容)。这是您想要执行的操作:

  • 覆盖本地子网的标签分配,以便本地子网上的地址获得“martian”标签(其他任何东西都不使用的标签)。此规则将匹配整个子网,因此它将是 /64。
  • 重新覆盖所需静态地址的标签分配以将其设置回 1(即,与其余 Internet 地址获得的标签相同)。此规则将仅匹配特定的所需地址,因此它将是 /128。

这样,本地子网上的所有 autoconf 地址都将获得一个火星标签,该标签与互联网上其他任何东西的标签都不匹配,因此它们不会被首选,而所需源地址的标签将是1,所以它将与目标地址匹配并被选中。

如果您的前缀是 2001:db8::/64 并且您选择的静态地址是 2001:db8::aaaa/128 那么:

ip addrlabel add prefix 2001:db8::/64 label 99
ip addrlabel add prefix 2001:db8::aaaa/128 label 1
Run Code Online (Sandbox Code Playgroud)

您可以将这两个命令添加为up命令,/etc/network/interfaces以便在每次出现界面时执行它们。