私のシステムが新しいIPv6アドレスを受け取ったら、systemd oneshotサービスをどのように実行しますか?

私のシステムが新しいIPv6アドレスを受け取ったら、systemd oneshotサービスをどのように実行しますか?

systemdを実行したいワンタイムサービス私のシステムがネットワークルーターから新しいIPv6アドレスを割り当てられるたびに(これは起動時に発生し、稼働時間中に定期的に発生します)

理想的には、このイベントはIPv6アドレスの更新にのみ適用され、潜在的なIPv4アドレスの変更は含まれません。

そのようなイベントのネットワークdbusアクティビティを監視するためにsystemdを使用できますか?

私の究極の目標は、これが発生したときに動的DNSエンドポイントに到達し、システムのIPv6 DNSレコードが古くならないようにすることです。

答え1

私は数年前(想像力の欠如)というタイトルの記事を書いた。自動ドメイン名

systemdサービスを呼び出しませんが(その時点でsystemdが存在しなかったようです!)、DNS更新を実行するために外部プロセスを呼び出します(修正する)。ただし、IPアドレスの追加と削除をネットワークリンクレベルで直接監視します。つまり、発生方法(手動管理構成、SLAAC、DHCP、ネットワーク管理者)に関係なく、その項目を選択します。変化が発生するとすぐに反応します。フィルタ(リンク - ローカルアドレスなどの項目を自動的に除外するように設計されています)をサポートしているため、必要に応じてIPv6アドレスの変更に準拠し、IPv4アドレスの変更を無視することができます。

たぶんあなたはそれを使用するか、必要に応じて修正することができます。 IPアドレス変更を検知し、対応する魔法の大半はwatchip.c、私の思考に。

答え2

使い捨てサービスの代わりに継続的なシステムサービスを使用してください。

[Unit]
Description=Dynamic DNS updater
DefaultDependencies=no
Wants=local-fs.target
After=local-fs.target
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=exec
ExecStart=/usr/local/sbin/ddns-updater

[Install]
WantedBy=sysinit.target

パッケージのツールを使用する対応する/usr/local/sbin/ddns-updaterデーモンスクリプト:ipiproute2

#!/bin/sh -e

ip -o -6 monitor address |
    while read index iface proto addr dummy scope temporary dummy; do
        case "$iface:$proto:$scope:$temporary" in
            enp2s0:inet6:global:dynamic)
                addr="${addr%/*}"
                if [ "$addr" != "$current" ]; then
                    nsupdate -k /etc/network/nsupdate/Kyour.dyn.domain.name.+157+58882.private <<EOF
update delete your.dyn.domain.name AAAA
update add your.dyn.domain.name 300 AAAA $addr
send
EOF
                    echo "AAAA record set to $addr"
                    current="$addr"
                fi;;
        esac
    done

これにより、頻繁に変更されるランダムな(プライバシーの強化、一時的な)アドレスをDNSサーバーに書き込むことを防ぐことができますが、一時的ではないグローバルアドレス(静的に設定されたアドレスやSLAAC用のアドレスなど)が複数ある場合に問題になります。できます。必要に応じて調整します(インターフェース名、ドメイン名、キーファイルパス、追加ロジック、TTL...)

関連情報