我想要一个至少有两个IPv6地址的工作站。一个地址是静态手动配置的IPv6地址,另一个地址是从SLAAC自动生成的地址(可能还有更多的地址)。
我成功地通过/etc/network/interfaces文件实现了这一点,方法是在auto上设置接口,但使用以下行添加另一个IP地址:
up ip -6 addr add 2001:db8::10/64 dev enp0s3(有意使用文档地址空间,而不是实际使用的ULA。)
现在,我可以用ULA地址访问我的内部基础设施,用SLAAC地址访问互联网。这个很好用。
但是,我希望通过GUI设置来实现这一点,因为我现在必须在工作站上为用户创建另一个连接,这样他就可以通过几次单击就可以打开这个连接。
如果我创建二级连接,它就能工作。当我创建上面描述的连接时,我不能用GUI向它添加一个静态地址。
我将如何实现两个可互换的连接,其中一个将拥有自动IPv6地址获取和一个静态IPv6地址?
发布于 2018-06-06 13:08:12
我自己设法解决了这个问题。
我四处寻找通过Network配置文件向连接添加额外地址的各种方法。我无法找到任何方法来正确地做到这一点,但是在位于ipv6文件夹中的连接配置文件中有一个不推荐的/etc/NetworkManager/system-connections范围配置选项。" addresses“配置指令,据称用于设置要添加到接口中的地址列表。这个值应该是一个IPv6地址结构数组,每个地址结构依次是一个由3个属性组成的结构。包含地址的字节数组、包含掩码的uint32编号和包含网关地址的另一个字节数组。这是描述在“nm-设置”手册页。不幸的是,我无法找到所需格式的任何示例,也无法使其工作,因此我放弃了通过Network配置找到解决方案。
接下来,我查看了运行后置脚本的选项,同时仍然使用网络管理器。这应该是由/etc/network/if-up.d/目录中的脚本完成的,但是由于它没有完全集成到Network中,并且可能会暴露出不一致的地方(根据一些消息来源),所以我不得不继续查找。就在那时我发现了这个帖子!它解释了如何使用内置在dispatcher中的Network运行脚本。接着,又出现了另一个问题。应该位于/etc/NetworkManager/dispatcher.d/目录中的自定义dispatcher脚本可以在网络管理器执行的各个阶段运行,它们的执行顺序由文件名开头的2位数控制,但它们总是在给定的阶段运行。因此,如果我有一个脚本应该是后续运行的(或者根据Network在up阶段),它总是在Network的"up“阶段执行。因此,无论我在GUI中单击哪个连接,Network都将运行脚本。这不是我想要的,因为我只需要在我必须设置的一个连接中添加一个额外的IPv6地址,而不是其他的连接。由于脚本将始终运行,所以我必须找到一种方法来确定调用该脚本的连接,"NetworkManager“手册页在哪里派上用场。它说,正在传递自定义dispatcher脚本的两个参数(接口/设备和操作/阶段),但是环境中包含额外的变量。其中之一是"CONNECTION_UUID“变量。这包含正在调用该脚本的连接的uuid,连接的uuid可以在“/etc/NetworkManager/system/”目录中的连接配置文件中找到。因此,在我的dispatcher脚本中,我只需检查变量是否包含所需连接的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部分需要注意在dispatcher脚本中使用。为了清晰起见,示例配置文件"/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下一步是创建dispatcher脚本。示例dispatcher脚本"/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右上角网络连接下拉列表中的活动连接(Ubuntu14.04在GUI中的特定位置)。每当选择"extra_ipv6_con“连接时,在获得IPv4和IPv6的自动配置之后,将运行后期/向上阶段网络管理器脚本,并为接口分配额外/静态的IPv6地址。如果单击任何其他连接,则网络配置将更改为选定的连接,dispatcher脚本将再次运行,但由于UUID中的不匹配,不会产生任何效果。
只要在GUI中单击就可以让NetworkManager执行位于"/etc/NetworkManager/dispatcher.d/“目录中的脚本。这可以作为后置脚本或任何其他类型的TBH,并且只对通过匹配连接UUID所选择的单个连接产生影响。此脚本可以包含问题中提到的命令,并为此添加IPv6地址。
https://askubuntu.com/questions/1039324
复制相似问题