Rede do Systemd: rede IPv6 não disponível durante a inicialização

2

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 documentação :

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:

  1. 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
    
  2. 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?

    
por TCB13 26.11.2015 / 11:33

0 respostas