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 서비스가 듀얼 스택이기 때문에 이러한 일이 얼마나 자주 발생할지는 확실하지 않습니다. 오늘 수동으로 복원했습니다. 마지막 복원은 2주 전이었지만 로그에는 단 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와 호스트(핑 자체) 링크 로컬 주소?

  4. 정적 링크 로컬 주소를 사용해 보셨나요?

아직도 무엇이 잘못되었는지 모른다면, 확인해 보세요.상태 비저장 주소 자동 구성(SLAAC)은 DHCP6 클라이언트를 중단시키지 않도록 설정되지 않았습니다.

  • 사용하는 경우 구성 매개변수 netctl가 없는 것이 확실합니까 ?stateless
  • 설정 되어 있지 않은 경우 iface eth0 inet6 auto호스트의 인터페이스 구성을 확인할 수 있나요?

임의로 선택할 수 있는:

  • 라우터 로그에 어떤 IPv6 메시지가 표시됩니까? 호스트의 링크-로컬 또는 글로벌/로컬 유니캐스트 주소를 반영하는 트래픽이 있습니까?
  • IPv6와 관련하여 호스트가 실제로 보내려고 하는 내용에 대한 Wireshark 캡처를 공유할 수 있습니까?

SLAAC라고 하는 호스트에서 IPv6 주소 구성을 사용하는 또 다른 방법이 있지만 DHCP를 전혀 사용할 필요가 없으며 이를 사용하면 주소가 구성될 때 네트워크 사용량을 줄일 수도 있습니다(네트워크 부하가 있는 호스트의 경우). ). 그러나 DHCP 옵션 값(예: DNS)을 얻으려면 여전히 DHCP 서버가 필요합니다.

관련 정보