Systemd-networkd: Executar script após o cliente DHCP aqcuires novo endereço

0

Eu estou no servidor do Ubuntu 18.04. Eu preciso executar um script que atualiza um endereço IP no CloudFlare (tipo de script DynDNS). Em versões anteriores, eu poderia fazer isso com os ganchos de saída DHCLIENT para a interface enp1s0.

No entanto, o systemd agora usa seu próprio cliente DHCP incorporado. Como posso escrever uma unidade systemd que execute meu script bash assim que um novo endereço IP for fornecido ao cliente DCHP?

O Systemd está gerenciando a interface 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
    
por alexander 18.09.2018 / 07:18

2 respostas

1

Não conheço nenhuma solução systemd, mas você pode monitorar alterações em interfaces com eficiência com ip monitor e canalizar a saída em um script que procura as alterações que lhe interessam. Por exemplo, se eu fizer

$ ip monitor address dev enp3s0

adicione um novo endereço de alias à interface enp3s0 Eu recebo a linha

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

Eu presumo que você veria algo semelhante para alterações no DHCP.

Se preferir, você pode escrever um programa em C para fazer o mesmo, veja este ipevent.c .

    
por 18.09.2018 / 17:01
0

Muitos pacotes não funcionam com systemd-networkd ... ainda. ( veja o relatório de erros no LaunchPad )

Por enquanto, o cliente ISC DHCP ( dhclient ) ainda reina supremo, particularmente na opção DHCP personalizada, necessária para muitos servidores DHCP do provedor (estou olhando para você, Juniper Networks), além de suportar scripts de sistema operacional.

Então, vá para /etc/systemd/network para editar o arquivo de configuração que lida com o endereçamento IP dinâmico e desabilite o DHCP do systemd da seguinte maneira:

[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

Em seguida, verifique o seguinte para o cliente ISC DHCP ( dhclient ) em /etc/network/interfaces :

auto eth0
iface eth0 inet dhcp

E para /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;

O último passo é fazer com que o sistema ative o cliente ISC DHCP como um daemon. Crie um arquivo em /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

E disponibilize o cliente ISC DHCP para o systemd daemon executando a partir de um shell:

sudo systemctl daemon-reload   #makes the [email protected] available
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
    
por 14.10.2018 / 03:01