web-dev-qa-db-ja.com

Systemd-networkd:DHCPクライアントが新しいアドレスを取得した後にスクリプトを実行する

私はubuntu 18.04サーバーにいます。 CloudFlareのIPアドレスを更新するスクリプト(DynDNSスクリプトの一種)を実行する必要があります。以前のバージョンでは、インターフェイスenp1s0のDHCLIENT出口フックを使用してこれを行うことができました。

ただし、systemdは独自の組み込みDHCPクライアントを使用するようになりました。新しいIPアドレスがDCHPクライアントに提供されるとすぐにbashスクリプトを実行するsystemdユニットを作成するにはどうすればよいですか?

Systemdはインターフェースenp1s0を管理しています:

#Sudo  systemctl status systemd-networkd
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled-runtime; vendor preset: enabled)
   Active: active (running) since Tue 2018-09-18 01:54:16 +08; 10h ago
     Docs: man:systemd-networkd.service(8)
 Main PID: 878 (systemd-network)
   Status: "Processing requests..."
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/systemd-networkd.service
           └─878 /lib/systemd/systemd-networkd

Sep 18 01:54:27 xxx systemd-networkd[878]: enp1s0: Configured
1
alexander

Systemdの解決策はわかりませんが、ip monitorを使用してインターフェースへの変更を効率的に監視し、関心のある変更を探すスクリプトに出力をパイプすることができます。たとえば、私がする場合

$ ip monitor address dev enp3s0

次に、新しいエイリアスアドレスをインターフェイスenp3s0に追加します。

2: enp3s0    inet 192.168.77.77/24 brd 192.168.77.255 scope global enp3s0:1
       valid_lft forever preferred_lft forever

DHCPの変更についても同様のことが見られると思います。

必要に応じて、同じことを行うCプログラムを作成できます。これを参照してください ipevent.c

3
meuh

Networkd-dispatcherを見てください。これは、さまざまなネットワークイベントで/etc/networkd-dispatcher/*.dからスクリプトを実行するデーモンです。イベントに関する詳細は、環境変数を介してスクリプトに渡されます。

1
Josef Kufner

多くのパッケージはsystemd-networkd...ではまだ機能しません。 ( LaunchPadのバグレポートを参照

今のところ、ISC DHCPクライアント(dhclient)は、特に多くのISPのDHCPサーバー(私はあなたを見ています、ジュニパーネットワークス)が必要とするカスタムDHCPオプションで、OSスクリプトをサポートするだけでなく、依然として最高の地位を占めています。

したがって、/etc/systemd/networkに移動して、動的IPアドレス指定を処理する構成ファイルを編集し、以下でsystemdのDHCPを無効にします。

[Match]
Name=eth1
[Network]
# Using ISC DHCP client (dhclient) instead of systemd-networkd
# Better support of DHCP-Options and OS-specific script supports
DHCP=no

次に、/etc/network/interfacesのISCDHCPクライアント(dhclient)について次のことを確認します。

auto eth0
iface eth0 inet dhcp

そして/etc/dhcp/dhclient.confの場合:

send Host-name "Wireless_Broadband_Router";
send domain-name "home";
request subnet-mask, broadcast-address, time-offset, routers,
    domain-name, domain-name-servers, time-servers, log-servers,
    default-ip-ttl, dhcp-requested-address, dhcp-lease-time,
    dhcp-server-identifier,dhcp-parameter-request-list,
    vendor-class-identifier,dhcp-client-identifier,
    www-server,
    dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, 
    dhcp6.sntp-servers,
    interface-mtu,
    ntp-servers;

最後のステップは、systemdにISCDHCPクライアントをデーモンとして起動させることです。 /etc/systemd/system/[email protected]にファイルを作成します。

# cat /etc/systemd/system/[email protected] 
[Unit]
Description=dhclient on %I
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
# ExecStart=/sbin/dhclient -4 -q %I
ExecStart=/sbin/dhclient -4 -v -pf /run/dhclient.%I.pid -lf /var/lib/dhcp/dhclient.%I.leases %I

[Install]
WantedBy=multi-user.target

また、シェルから実行して、ISCDHCPクライアントをsystemdデーモンで使用できるようにします。

Sudo systemctl daemon-reload   #makes the [email protected] available
Sudo systemctl enable [email protected]
Sudo systemctl start [email protected]
1
John Greene

networkd-dispatcher

スクリプトをいつ実行するかをさらに細かく制御するために使用できます。

スクリプトを実行する状態に応じて、スクリプトを配置するフォルダーを決定する必要があります。

例:

私たちはフォルダroutable.dを使用します。これは リンクにキャリアとルーティング可能なアドレスが設定されている の場合です。

スクリプトファイルを/usr/lib/networkd-dispatcher/routable.dにコピーします

cp path/to/my/ipchange_script.sh /usr/lib/networkd-dispatcher/routable.d

ipchange_script.sh

#!/bin/bash


if [[ $IFACE == "eth0" && $AdministrativeState == "configured" ]]; then
    echo "IP Address has changed to: $ADDR"  >> /tmp/iplog.txt
fi

exit 0

IP(dhclient -r eth0 && dhclient -v eth0)を更新してから、スクリプトの出力を確認するか、スクリプトにエラーがあるかどうかを確認するには、次のコマンドで確認できます。

Sudo service networkd-dispatcher status

追伸私は何ヶ月もオンとオフを検索してきましたが、networkd-dispatcherの操作方法の例はどこにもありません。今日はそれを理解することができました。楽しい!

0
Tek