私は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
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 。
Networkd-dispatcherを見てください。これは、さまざまなネットワークイベントで/etc/networkd-dispatcher/*.d
からスクリプトを実行するデーモンです。イベントに関する詳細は、環境変数を介してスクリプトに渡されます。
多くのパッケージは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]
スクリプトをいつ実行するかをさらに細かく制御するために使用できます。
スクリプトを実行する状態に応じて、スクリプトを配置するフォルダーを決定する必要があります。
私たちはフォルダroutable.d
を使用します。これは リンクにキャリアとルーティング可能なアドレスが設定されている の場合です。
スクリプトファイルを/usr/lib/networkd-dispatcher/routable.d
にコピーします
cp path/to/my/ipchange_script.sh /usr/lib/networkd-dispatcher/routable.d
#!/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
の操作方法の例はどこにもありません。今日はそれを理解することができました。楽しい!