IPv6 Wide-dhcpv6-client 以随机间隔失败

IPv6 Wide-dhcpv6-client 以随机间隔失败

首先,系统运行正常并成功协商 IPv6 地址并按预期运行。

一段时间后,系统停止发送 DHCP 请求,并且 IPv6 在租约超时后失败,但 IPv4 继续运行。重启wide-dhcpv6-client服务即可恢复系统。这表明问题出在该服务上,但我的互联网搜索尚未找到根本原因。记录以下消息:

dhcp6c[]: client6_send: transmit failed: Network is unreachable

我还没有发现任何其他相关的错误消息。

虽然错误消息表明网络层出现故障,但重新启动服务以清除问题则表明情况并非如此。随着 IPv4 继续运行,目前尚不清楚这种情况发生的频率,因为几乎所有 IPv6 服务都是双堆栈的。今天手动恢复,最后一次恢复是在两周前,但日志显示在短短 5 天内就失败了。

System Description:    Debian GNU/Linux 11 (bullseye)
DHCPc6 version: wide-dhcpv6-client/stable,now 20080615-23 amd64 

看来这个问题的根本原因是如果网络层未准备好,那么服务将无法应对并出错。可以通过重新启动服务来解决该问题,然后恢复正常运行:

systemctl restart wide-dhcpv6-client.service

网上关于这方面的报道似乎很少。

此外,如果服务在网络准备就绪之前启动,则会出现不同的错误,该错误更加终端并吸引更多关注和更明显的修复:

wide-dhcpv6-client[]:  failed!
systemd[1]: wide-dhcpv6-client.service: Control process exited, code=exited, status=1/FAILURE
systemd[1]: wide-dhcpv6-client.service: Failed with result 'exit-code'.

答案1

虽然不是修复,但这是我实施的解决方法,直到维护人员修复此问题。这是非常初级的,但暂时就可以了。我在系统启动时将此脚本作为服务运行。

import time
import subprocess
import select

filename="/var/log/syslog"

action_map = {
    "client6_send: transmit failed: Network is unreachable": {"action": "sudo systemctl restart wide-dhcpv6-client.service",
                                                              "cooldown": 5},
    "wide-dhcpv6-client.service: Control process exited, code=exited, status=1/FAILURE": {"action": "sudo systemctl start wide-dhcpv6-client.service",
                                                              "cooldown": 5}
}


def monitor(filename):
        f = subprocess.Popen(['tail','-F',filename],\
                        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        p = select.poll()
        p.register(f.stdout)
        while True:
                if p.poll(1):
                        check_output(str(f.stdout.readline()))


def check_output(syslog_line):
    for action_key in action_map.keys():
        if action_key in syslog_line:
            subprocess.Popen([action_map[action_key]['action'].split()],\
            stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            time.sleep(action_map[action_key]['cooldown'])
            print("Ran:", action_map[action_key]['action'])

print("Starting syslog_actioner")
monitor(filename)

答案2

如果 IPv6 的网络无法访问,则可能存在问题链路本地地址,因为即使没有全球单播或者唯一的本地地址尚未分配,主机应使用其与路由器建立连接链路本地地址(由主机自动配置,主要使用 EUI-64)

当您看到上述错误消息时:

  1. 有没有链路本地地址主机的 ( FE80::/10)?

  2. 您还可以检查相关地址的格式是否正确EUI-64(分割 mac + fffe + 第 7 位翻转)?参考

  3. 你可以吗ping6路由器和主机的(ping 本身) 链接本地地址?

  4. 您是否尝试过使用静态链接本地地址?

如果仍然不清楚出了什么问题,请检查是否无状态地址自动配置(SLAAC) 未设置,只是为了确保它不会中断 DHCP6 客户端:

  • 如果使用的话netctl,确定没有stateless配置参数吗?
  • 如果没有 iface eth0 inet6 auto设置的话可以检查一下主机的接口配置吗?

选修的:

  • 您在路由器日志中看到什么 IPv6 消息?是否有反映主机的链路本地或全局/本地单播地址的任何通信?
  • 您能否分享 Wireshark 捕获您的主机尝试实际发送的与 IPv6 相关的内容?

虽然还有另一种在主机上使用 IPv6 地址配置的方法,称为 SLAAC,所以您根本不需要使用 DHCP,并且通过使用它,您还可以减少地址配置时的网络利用率(对于具有主机负载的网络)。但是,如果您需要获取 DHCP 选项值(例如 DNS),您仍然需要 DHCP 服务器。

相关内容