Eu tenho uma máquina Debian executando vários endereços IPv4 e IPv6 estáticos gerenciados por systemd
em /etc/systemd/network/10-static-eth0.network
da seguinte forma:
[Match]
Name=eth0
[Network]
Address=2a04:----::149/64
Address=2a04:----::242/64
Address=2a04:----::243/64
Gateway=2a04:----:0001
Address=5.----.149/25
Address=5.----.242/25
Address=5.----.243/25
Gateway=5.----.129
DNS=89.----.4
DNS=46.----.104
Eu tenho vários processos que começam com o sistema através de systemd
de unidades como o OpenVPN, Bind9 etc. Eles estão todos configurados para se vincular a IPs específicos da interface eth0
. No entanto, eles não conseguem iniciar porque não podem se vincular aos endereços IPv6
após a inicialização.
Como eu sei disso?
Eu fiz duas unidades de teste que usam ping
e ping6
para testar a rede logo após os alvos network.target
e network-online.target
e isso acontece:
Resultado do teste IPv4:
server.example:~# systemctl status abootping.service
● abootping.service - A boot-time ping for network testing
Loaded: loaded (/lib/systemd/system/abootping.service; enabled)
Active: inactive (dead) since Thu 2015-11-26 11:01:58 CET; 45s ago
Main PID: 433 (code=exited, status=0/SUCCESS)
Nov 26 11:01:54 server.example ping[433]: PING test-ping-host.example (89.-----.8) from 5.----.149 : 56(84) bytes of data.
Nov 26 11:01:54 server.example ping[433]: 64 bytes from test-ping-host.example (89.-----.8): icmp_seq=1 ttl=59 time=4.92 ms
Nov 26 11:01:55 server.example ping[433]: 64 bytes from test-ping-host.example (89.-----.8): icmp_seq=2 ttl=59 time=4.92 ms
Nov 26 11:01:56 server.example ping[433]: 64 bytes from test-ping-host.example (89.-----.8): icmp_seq=3 ttl=59 time=4.84 ms
Nov 26 11:01:57 server.example ping[433]: 64 bytes from test-ping-host.example (89.-----.8): icmp_seq=4 ttl=59 time=5.41 ms
Nov 26 11:01:58 server.example ping[433]: 64 bytes from test-ping-host.example (89.-----.8): icmp_seq=5 ttl=59 time=4.95 ms
Nov 26 11:01:58 server.example ping[433]: --- test-ping-host.example ping statistics ---
Nov 26 11:01:58 server.example ping[433]: 5 packets transmitted, 5 received, 0% packet loss, time 4007ms
Nov 26 11:01:58 server.example ping[433]: rtt min/avg/max/mdev = 4.843/5.010/5.414/0.209 ms
Resultado do teste IPv6:
server.example:~# systemctl status abootping6.service
● abootping6.service - A boot-time ping6 for network testing
Loaded: loaded (/lib/systemd/system/abootping6.service; enabled)
Active: failed (Result: exit-code) since Thu 2015-11-26 11:01:54 CET; 56s ago
Main PID: 436 (code=exited, status=2)
Nov 26 11:01:54 server.example ping6[436]: ping: bind icmp socket: Cannot assign requested address
Nov 26 11:01:54 server.example systemd[1]: abootping6.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Nov 26 11:01:54 server.example systemd[1]: Failed to start A boot-time ping6 for network testing.
Nov 26 11:01:54 server.example systemd[1]: Unit abootping6.service entered failed state.
Como você pode ver, o IPv4 está funcionando perfeitamente após a inicialização, embora o IPv6 não esteja e todos os processos de inicialização que precisam do IPv6 falhem.
Sobre o meu network-online.target
Para realmente garantir que minhas unidades de inicialização só iniciem depois que a rede estiver realmente funcionando, adicionei After=network.target network-online.target
a todas elas.
network-online.target
em si tem esse wants
:
Issoinclui:
[Unit]Description=WaitforNetworktobeConfiguredDocumentation=man:systemd-networkd-wait-online.service(8)DefaultDependencies=noConflicts=shutdown.targetRequisite=systemd-networkd.serviceAfter=systemd-networkd.serviceBefore=network-online.target[Service]Type=oneshotExecStart=/lib/systemd/systemd-networkd-wait-onlineRemainAfterExit=yes[Install]WantedBy=network-online.target
Deacordocoma
systemd-networkd-wait-online is a one-shot system service that waits for the network to be configured. By default, it will wait for all links it is aware of and which are managed by systemd-networkd.service(8) to be fully configured or failed, and for at least one link to gain a carrier.
O efeito real desta espera de serviço é perceptível na inicialização, e meu teste ping
services respeita:
O ping
após o Login SSH
Antes que todos saibam que minha rede IPv6 não está configurada corretamente, aqui estão algumas provas:
Se eu fizer SSH na máquina logo após a inicialização e tentar usar ping6
, ele funciona:
server.example:~# ping6 -I 2a04:-----::242 test-ping-host.example -c 5
PING test-ping-host.example(test-ping-host.example) from 2a04:-----::242 : 56 data bytes
64 bytes from test-ping-host.example: icmp_seq=1 ttl=59 time=7.41 ms
64 bytes from test-ping-host.example: icmp_seq=2 ttl=59 time=7.41 ms
64 bytes from test-ping-host.example: icmp_seq=3 ttl=59 time=7.31 ms
^C
--- test-ping-host.example ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 7.314/7.381/7.415/0.047 ms
Se eu reiniciar, por exemplo, lighttpd
é vinculado corretamente ao IPv6 e eu posso abrir sites hospedados usando um cliente IPv6 ou ping6
de outra máquina.
Aqui está minha pergunta : isso é normal? O IPv6 não deveria funcionar porque systemd-networkd-wait-online
garantiu que estava disponível? Ou ... at least one link to gain a carrier.
realmente significa que depois que eu tiver um IPv4 funcional ele irá parar de esperar e os endereços IPv6 ainda não serão roteados? Como posso consertar isso?
Tags boot networking ipv6 systemd