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)

おすすめ記事