首先,系统运行正常并成功协商 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)
当您看到上述错误消息时:
有没有链路本地地址主机的 (
FE80::/10
)?您还可以检查相关地址的格式是否正确EUI-64(分割 mac + fffe + 第 7 位翻转)?参考
你可以吗
ping6
路由器和主机的(ping 本身) 链接本地地址?您是否尝试过使用静态链接本地地址?
如果仍然不清楚出了什么问题,请检查是否无状态地址自动配置(SLAAC) 未设置,只是为了确保它不会中断 DHCP6 客户端:
- 如果使用的话
netctl
,确定没有stateless
配置参数吗? - 如果没有
iface eth0 inet6 auto
设置的话可以检查一下主机的接口配置吗?
选修的:
- 您在路由器日志中看到什么 IPv6 消息?是否有反映主机的链路本地或全局/本地单播地址的任何通信?
- 您能否分享 Wireshark 捕获您的主机尝试实际发送的与 IPv6 相关的内容?
虽然还有另一种在主机上使用 IPv6 地址配置的方法,称为 SLAAC,所以您根本不需要使用 DHCP,并且通过使用它,您还可以减少地址配置时的网络利用率(对于具有主机负载的网络)。但是,如果您需要获取 DHCP 选项值(例如 DNS),您仍然需要 DHCP 服务器。