Deixe o ifconfig aguardar o endereço IPv6 para não ser provisório

5

Eu reivindico um endereço IPv6 usando ifconfig em um script. Este endereço é imediatamente usado para escutar em uma porta TCP.

Quando escrevo o script dessa forma, ele falha porque o serviço não pode escutar:

ifconfig igb0 inet6 2001:db8::10/64 add
service my_service start #fails

No entanto, é bem-sucedido quando faço assim:

ifconfig igb0 inet6 2001:db8::10/64 add
sleep 1
service my_service start

Eu tentei gravar a saída de ifconfig diretamente após executar a operação add . Parece que ifconfig reporta o endereço IP como tentativo , o que aparentemente impede que um serviço o ouça.

Naturalmente, esperar exatamente um segundo e esperar que o endereço se torne disponível não é uma maneira muito boa de lidar com isso. Como posso esperar que um endereço provisório se torne disponível, ou faça com que ifconfig retorne mais tarde para que o endereço esteja todo configurado?

    
por jornane 03.07.2016 / 19:56

2 respostas

2

Um endereço pode estar em vários estados, tentativa é um deles. Ter ifconfig espera que um endereço deixe a tentativa do estado simplesmente não está de acordo com o design.

Você pode configurar o uso do DAD otimista, conforme definido na RFC 4429 . O objetivo é disponibilizar um endereço para os aplicativos, mesmo se o DAD ainda não estiver concluído. Você pode precisar reconfigurar o kernel para utilizar este recurso.

Uma vez que o kernel é construído para fornecer um DAD otimista, você pode ter certas configurações sysctl para habilitá-lo. De ip-sysctl.txt :

/proc/sys/net/ipv6/* Variables:
...

conf/interface/*:
        Change special settings per interface.

        The functional behaviour for certain settings is different
        depending on whether local forwarding is enabled or not.

...

optimistic_dad - BOOLEAN
        Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
                0: disabled (default)
                1: enabled

use_optimistic - BOOLEAN
        If enabled, do not classify optimistic addresses as deprecated during
        source address selection.  Preferred addresses will still be chosen
        before optimistic addresses, subject to other ranking in the source
        address selection algorithm.
                0: disabled (default)
                1: enabled

Ou seja, faça algo como

sysctl -w net.ipv6.conf.enp2s6.optimistic_dad=1
sysctl -w net.ipv6.conf.enp2s6.use_optimistic=1

no momento da inicialização.

    
por 12.02.2017 / 19:03
2

Depois de perguntar a um desenvolvedor do NetBSD e verificar se o mesmo se aplica ao FreeBSD, descobri a solução (que se aplica em ambos os sistemas operacionais):

A Detecção de Endereços Duplicados (DAD) usará algum tempo para detectar se o endereço já está em uso. A quantidade de tempo que será usada para isso é definida em segundos no valor de sysctl (3) net.inet6.ip6.dad_count . Na /etc/rc.d/network do NetBSD, a função network_start_ipv6_autoconf , o script espera por esse valor mais um segundo.

Quando o DAD descobrir que o endereço já está em uso na rede, o ifconfig (8) mostrará o endereço como duplicated . Nesse estado, não é possível vincular-se ao endereço, semelhante a quando o endereço é tentative .

Uma solução mais completa e corretiva seria assim:

ifconfig igb0 inet6 2001:db8::10/64 add
dadcount=$(/sbin/sysctl -n net.inet6.ip6.dad_count 2>/dev/null)
sleep $dadcount
sleep 1
ifconfig igb0 | grep 2001:db8::10/64 | egrep '(duplicated|tentative)$' >&2 && exit 1
service my_service start

Eu observei que o FreeBSD e o NetBSD se comportam de maneira diferente ao adicionar um endereço que está atualmente em duplicated state:

  • O FreeBSD 11 removerá imediatamente o estado duplicated , permitindo que o endereço seja usado, possivelmente causando conflitos.
  • O NetBSD 7 marcará o endereço como tentative e não alterará o estado de lá, pelo menos por alguns minutos. O endereço deve ser removido e adicionado novamente para ser usado.
por 10.02.2017 / 16:13