私はUbuntu 18.04サーバーを使用しています。 CloudFlareでIPアドレスを更新するスクリプト(DynDNSスクリプト)を実行する必要があります。以前のバージョンでは、enp1s0インターフェースのDHCLIENT出口フックを使用してこれを実行できました。
ただし、systemd は独自の組み込み DHCP クライアントを使用します。 DCHPクライアントに新しいIPアドレスを提供した後、すぐにbashスクリプトを実行するシステムデバイスを作成するにはどうすればよいですか?
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
ネットワークスケジューラ
スクリプトを実行したい時点をより詳細に制御するために使用できます。
スクリプトを実行する状態に応じて、スクリプトを配置するフォルダを決定する必要があります。
- ネットワークスクリプトフォルダのリスト:https://gitlab.com/craftyguy/networkd-dispatcher#usage
- ネットワークフォルダの定義:https://www.freedesktop.org/software/systemd/man/networkctl.html#missing
- ネットワークスクリプトフォルダ if-up/if-down/etc 対応するテーブル:https://github.com/canonical-web-and-design/netplan.io/blob/master/faq.md#use-pre-up-post-up-etc-hook-scripts
例:
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
PS数ヶ月間検索してみましたが、使い方については何も見つからなかったので、networkd-dispatcher
今日でしか見つけませんでした。楽しむ!
答え2
私は体系的な解決策を知りませんが、インターフェイスの変更を効果的に監視し、出力をスクリプトにパイプ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
多くのパッケージがまだsystemd-networkd
動作していません...(LaunchPadのバグレポートを見る)
現在、ISC DHCPクライアント(dhclient
)は、特に多くのISPのDHCPサーバー(Juniper Networksを探しています)が必要とするカスタムDHCPオプションとオペレーティングシステムスクリプトのサポートによってまだ最高です。
したがって、/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
dhclient
次に、ISC DHCPクライアント()で次のことを確認します/etc/network/interfaces
。
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;
最後のステップは、システムにISC DHCPクライアントをデーモンとして起動させることです。からファイルを作成します。/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
systemd
そして、シェルで実行して、ISC DHCP クライアントをデーモンで使用できるようにします。
sudo systemctl daemon-reload #makes the [email protected] available
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
答え4
ネットワーク管理者の使用
networkd-dispatcher
Ubuntu Server 20.04ではdhcpの変更に応答できませんが、ネットワーク管理者systemd-networkd
(Ubuntu Desktopで置き換えられます)はい。
- インストールするネットワーク管理者
sudo apt install network-manager
次の設定ファイルを編集します/etc/netplan/
。
network:
version: 2
renderer: NetworkManager
sudo netplan generate
構成ファイルの生成ネットワーク管理者
- 無効
systemd-networkd
と再起動
sudo systemctl mask systemd-networkd
sudo reboot now
- 以下にスクリプトを入れてください
/etc/NetworkManager/dispatcher.d
ネットワーク管理者$ 1 =インターフェイス、$ 2 =タスク(例:dhcp-change
、up
)で実行され、いくつかの環境変数が設定されます。ドキュメントを読むhttps://developer.gnome.org/NetworkManager/stable/NetworkManager.html