总结:

总结:

我正在尝试让工作站拥有 (至少) 2 个 IPv6 地址。一个地址是静态手动配置的 IPv6 地址,另一个地址是 SLAAC 自动生成的地址(可能还有更多)。

/etc/network/interfaces我通过将接口设置为自动但使用以下行添加另一个 IP 地址,成功地通过文件实现了这一点:

up ip -6 addr add 2001:db8::10/64 dev enp0s3

(故意使用文档地址空间,而不是实际使用的 ULA。)

现在我可以使用 ULA 地址访问我的内部基础设施,使用 SLAAC 地址访问互联网。一切正常。

但是,我想通过 GUI 设置来实现这一点,因为我现在必须在工作站为用户创建另一个连接,以便他可以通过几次单击来打开连接。

如果我创建辅助连接,它就可以工作。当我创建上述连接时,我无法使用 GUI 向其添加静态地址。

我该如何拥有两个可互换的连接,其中一个具有自动 IPv6 地址获取功能和一个静态 IPv6 地址?

答案1

我已经设法自己解决了这个问题。

我正在寻找各种通过网络管理器配置文件向连接添加额外地址的方法。我找不到任何正确执行此操作的方法,但文件夹中的连接配置文件中有一个针对 ipv6 范围的已弃用配置选项/etc/NetworkManager/system-connections。“addresses”配置指令,据称用于设置要添加到接口的地址列表。该值应该是 IPv6 地址结构的数组,每个结构又是一个包含 3 个属性的结构。一个包含地址的字节数组、一个包含掩码的 uint32 数字和另一个包含网关地址的字节数组。这在“nm-settings”手册页中有描述。不幸的是,我找不到所需格式的任何示例,也无法让它工作,所以我放弃了通过网络管理器配置寻找解决方案。

接下来,我查看了运行后续脚本的选项,同时仍使用网络管理器。这应该由目录中的脚本完成/etc/network/if-up.d/,但由于它与网络管理器没有完全集成,可能会出现不一致(根据一些来源),我不得不继续寻找。就在那时,我发现了这个邮政!它解释了如何使用网络管理器内置的调度程序运行脚本。然后另一个问题开始显现。应该位于目录中的自定义调度程序脚本/etc/NetworkManager/dispatcher.d/可以在网络管理器执行的各个阶段运行,它们的执行顺序由文件名开头的 2 位数字控制,但它们始终在给定阶段运行。因此,如果我有一个应该在启动后运行的脚本(或根据网络管理器在启动阶段运行),它将始终在网络管理器的“启动”阶段执行。因此,无论我在 GUI 中单击哪个连接,网络管理器最终都会运行该脚本。这不是我想要的,因为我只需要向我必须设置的连接之一添加一个额外的 IPv6 地址,而不是其余的。由于脚本将始终运行,我必须找到一种方法来确定调用此脚本的连接,这时“NetworkManager”手册页就派上用场了。它表示自定义调度程序脚本被传递了 2 个参数(接口/设备和操作/阶段),但环境包含额外的变量。其中一个是“CONNECTION_UUID”变量。它包含调用此脚本的连接的 uuid,连接的 uuid 可以在“/etc/NetworkManager/system-connections/”目录中的连接配置文件中找到。因此,在我的调度程序脚本中,我只需检查变量是否包含我所需连接的 uuid,如果是,则仅执行所需的命令。

不需要额外地址“/etc/NetworkManager/system-connections/regular_connection”的连接的示例连接配置文件:

[802-3-ethernet]
duplex=full
mac-address=00:00:00:11:11:11

[connection]
id=regular_connection
uuid=12345678-90ab-cdef-0123-4567890abcde
type=802-3-ethernet

[ipv6]
method=auto

[ipv4]
method=auto

特殊连接需要在 SLAAC 生成的地址之上添加额外的静态 IPv6 地址,其配置文件与常规配置文件类似,但需要注意 uuid 部分在调度程序脚本中的使用。为清晰起见,示例配置文件为“/etc/NetworkManager/system-connections/extra_static_ipv6_connection”:

[802-3-ethernet]
duplex=full
mac-address=00:00:00:11:11:11

[connection]
id=extra_ipv6_con
uuid=88888888-4444-4444-4444-cccccccccccc
type=802-3-ethernet

[ipv6]
method=auto

[ipv4]
method=auto

下一步是创建调度程序脚本。示例调度程序脚本“/etc/NetworkManager/dispatcher.d/99_super_connection_post_up_script”:

#!/bin/sh -e
# Script to add static local IPv6 address when connected to super network
# Runs a single command on appropriate circumstances
# $0 is command. $1 is interface. $2 is action.  $UUID is the uuid of current connection.
if [ -z "$1" ]; then
    echo "$0: called with no interface" 1>&2
    exit1;
fi

# Set reader friendly environment
export IFACE="$1"

# Check for action and on "up" action (post-up) add IPv6 address if connection uuid matches
case "$2" in
     up)
        if [ "$CONNECTION_UUID" = "88888888-4444-4444-4444-cccccccccccc" ]; then
          ip -6 addr add 2001:db8::10/64 dev $IFACE
        fi;
        ;;
    *)
        echo "$0: called with unknown action \'$2'" 1>&2
        exit 1
        ;;
esac

现在,只需在 GUI 右上角的网络连接下拉列表中切换活动连接(Ubuntu 14.04 在 GUI 中的特定位置)。每当选择“extra_ipv6_con”连接时,在获得 IPv4 和 IPv6 的自动配置后,将运行启动/启动阶段后网络管理器调度程序脚本,并为接口分配一个额外的/静态 IPv6 地址。如果单击任何其他连接,网络配置将更改为所选配置,调度程序脚本将再次运行,但由于 UUID 不匹配,因此不起作用。

总结:

每当通过单击 GUI 启用连接时,都可以让网络管理器执行位于“/etc/NetworkManager/dispatcher.d/”目录中的脚本。这可以用作后续脚本或任何其他类型的 TBH,并且仅对通过匹配连接 UUID 选择的单个连接有效。此脚本可以包含问题中提到的命令,从而添加 IPv6 地址。

相关内容