当我有一个监听特定IPv6地址的服务时,它在启动时失败,声称地址仍然不可用。 每个正在侦听特定地址的服务都会发生这种情况。
为了避免这种情况,我为服务创build了一个After=... network.target通过After=... network-online.target更改After=... network.target ,这样可以解决IPv4地址绑定问题,而不是IPv6。 我尝试了一些接口的特定目标没有成功,他们等待IPv6的IPv4位号为止。
作为解决方法,我也添加到服务部分:
[Service] Restart=on-failure RestartSec=10s StartLimitInterval=1min
这似乎是大家都在解决这个问题,但是我对此并不满意,似乎是允许systemd等待IPv6地址的一种方法。
我的系统是CentOS 7.2 ,禁用了NetworkManager和firewalld,启用了networking和iptables,使用静态IP,所有networking在接口充满IPv4 / IPv6后正在工作IN / OUT。
我的ifcfg-eth0:
DEVICE=eth0 BOOTPROTO=none NM_CONTROLLED="no" ONBOOT=yes IPADDR=XXXX PREFIX=24 GATEWAY=XXXX DNS1=XXXX DNS2=8.8.8.8 SEARCH=xxx.xxx IPV6INIT=yes IPV6_AUTOCONF=no IPV6ADDR="X:X:X:X::X"
我也注意到在一些双栈IPv4 / IPv6部署的系统中,IPv6需要一些时间来初始化静态地址,这是由路由设置以及其他一些新的IPv6内容引起的。
所以我的问题是,如何确保服务单元只在将IPv6链路全局分配给接口后启动?
编辑:经过一些评论指向我的爸爸,我认为systemd-networkd已合并DAD等待,但只在主分支,不存在系统220(Centos 7.2有systemd 219)。 NetworkManager似乎有一些补丁,但我没有使用任何。
我在阅读后发现了可接受的时间解决scheme,并进行了一些testing,对于我的情况,在服务器上的IP是固定的,不能分配另一个,这篇文章告诉我解决scheme:
https://www.agwa.name/blog/post/beware_the_ipv6_dad_race_condition
我还基于乐观的DAD RFC4429testing了评论的DAD解决scheme,这并不能解决我的绑定问题。 最后在界面上禁用DAD,服务正常启动。 :d。
net.ipv6.conf.eth0.accept_dad = 0
随着IPv6的发展,我会把目光投向这个引导DAD的问题。 我只看到这个服务绑定到特定的IPv6地址。