Como posso garantir que a eth1 obtenha seu endereço IPv6 fe80 imediatamente na inicialização, mesmo que não esteja fisicamente conectada?

Como posso garantir que a eth1 obtenha seu endereço IPv6 fe80 imediatamente na inicialização, mesmo que não esteja fisicamente conectada?

Estou trabalhando em um dispositivo Linux x86 incorporado que executa Debian (Linux 3.8.13). Este dispositivo possui duas portas Ethernet, eth0 e eth1.

Se eu inicializar este dispositivo com apenas eth0 conectado a um switch, fazer ssh nele e fazer um 'ifconfig', recebo o seguinte:

root@msli-DCP-11234772:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:1c:ab:00:0a:60
          inet6 addr: fe80::21c:abff:fe00:a60/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5659 errors:0 dropped:4102 overruns:0 frame:0
          TX packets:1071 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1313254 (1.2 MiB)  TX bytes:224889 (219.6 KiB)
          Interrupt:16 Memory:fc500000-fc520000

eth1      Link encap:Ethernet  HWaddr 00:1c:ab:00:0a:61
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:17 Memory:fc520000-fc540000

Observe que eth0 possui um "endereço inet6" atribuído a ela, enquanto eth1 não.

Se/quando eu conectar a eth1 em um switch de rede, uma linha "inet6 addr" aparecerá na saída do ifconfig naquele momento (e permanecerá presente mesmo se eu desconectar o cabo Ethernet da eth1 novamente).

Portanto, parece que o Linux não se preocupa em associar um dispositivo Ethernet ao seu endereço IPv6 até a primeira vez que o dispositivo Ethernet está realmente conectado a alguma coisa.

Isso funciona, mas eu tenho alguns programas que deveriam enviar pacotes multicast IPv6 de ambas as portas o tempo todo, e eles não podem fazer isso em uma porta que não tenha um endereço IPv6 atribuído a ela.

Então, o que eu gostaria de fazer é encontrar uma maneira de forçar o Linux a associar o endereço IPv6 auto-atribuído do dispositivo (ou seja, fe80::blah, onde blá é derivado do endereço MAC no chip Ethernet) durante a inicialização, em vez de esperar até que a porta Ethernet esteja realmente conectada. Existe uma maneira de fazer isso?

(A vantagem seria que meus programas poderiam apenas escanear a lista de dispositivos de rede durante a inicialização e usá-los - atualmente eles precisam configurar um soquete AF_NETLINK para serem notificados sobre alterações na configuração da rede, o que funciona, mas é mais complicado do que eu gostaria, e também um pouco lento para reagir)

Responder1

ifconfignão mostra informações suficientes aqui. A chave geral é se olinké acima. iproute2mostrará ip addro status de nível inferior, bem como o tempo de vida dos endereços, conforme aplicável.

Os endereços locais de link só devem estar presentes se o próprio link estiver ativo. Sem link, sem endereço. Há também vários outros casos em que ele não aparecerá, como subinterfaces em conjunto vinculado (grupo/equipe/mestre etc., dependendo da escolha de palavras que você deseja usar)

O comportamento que você observou de um endereço local de link não sendo removido após a remoção de um cabo, acho que é um erro, ele deveria ter sido removido quando nada mais o estava usando e o contador de vida útil expira, e suspeito que tenha sido corrigido em kernels mais recentes (Não estou em condições de testar agora).

Além disso, você se importa se é o kernel ou o espaço do usuário que cria o fe80::endereço? Se isso não importa, você pode criá-lo a partir do espaço do usuário e o kernel não o removerá.

Responder2

Como as interfaces são configuradas /etc/network/interfaces? Presumo que eles estejam configurados para allow-hotplugativar a interface quando um link é detectado. Tente alterá-lo para autoque sua configuração fique assim:

auto eth0
iface eth0 ....
    ....

auto eth1
iface eth1 ....
    ....

informação relacionada