No Linux, como posso atribuir automaticamente um endereço IPv6 a uma interface baseada em seu endereço IPv4 no momento da inicialização?

4

Em uma máquina do CentOS 6, eu tenho um servidor com 2 NICs, eth0 e eth1. eth0 tem endereço 192.168.0.1.

Eu gostaria de criar um script que analise o endereço IP da eth0 e atribua um endereço IPv6 de aparência semelhante à eth1 no momento da inicialização.

Neste caso, gostaria que a eth1 tivesse o endereço fc00 :: 192: 168: 0: 1/64.

Eu sei que para atribuir este endereço, eu tenho que executar o comando

ip address add fc00::192:168:0:1/64 dev eth1

No entanto, estou tentando encontrar uma maneira de calcular o IP a ser atribuído a eth1 com base no IP de eth0 e ter esse script executado no momento da inicialização.

O motivo pelo qual estou fazendo isso em vez de atribuir estaticamente os endereços a ambas as interfaces é que estou tentando transformar esse servidor em um modelo de VM e implantá-lo automaticamente com novas configurações de IP. Infelizmente, a ferramenta que estou usando não tem realmente nenhum suporte para IPv6.

Então, acho que minha pergunta tem duas partes:

  • Como faço para calcular o endereço IPv6 a ser atribuído?
  • Como eu tenho esse endereço calculado e atribuído a eth1 no momento da inicialização?
por reedog117 07.05.2014 / 21:39

4 respostas

3

Não tenho certeza se isso é uma boa ideia, mas, tomando cuidado ao vento, eu faria algo como:

hexip='fe80::'
ip=$(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1 | sed 's/\./:/g')
hexip="${hexip}${ip}"

ip address add "$hexip/64" dev eth1 

Você precisa dele em algum arquivo de inicialização que é executado após o nível de execução 3. Acho que /etc/rc.local faria isso?

    
por 07.05.2014 / 21:58
1

Não é uma resposta à sua pergunta, mas alguns conselhos de alguém com muita experiência em IPv6 ...

Esta ideia pode parecer útil, mas na prática é muito mais fácil, p. apenas pegue a última parte do endereço IPv4 e configure-a manualmente em ifcfg-eth0 .

Uma de minhas máquinas é 83.247.10.7 , e a sub-rede IPv6 em que ela está é 2001:9e0:803::/64 . Este mecanismo lhe daria 2001:9e0:803:0:83:247:10:7 . Eu apenas dou 2001:9e0:803::7 manualmente. Muito mais fácil :) Aqui está o meu ifcfg-eth0 :

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

IPADDR=83.247.10.7
NETMASK=255.255.255.224

IPV6INIT=yes
IPV6ADDR=2001:9e0:803::7/64

Essas duas linhas extras não vão te matar, e são muito melhores do que alguns scripts que tentam fazer algo tão trivial automaticamente.

Seu exemplo na pergunta usa fc00:: , que é uma sub-rede inexistente que você não vê na vida real, o que faz com que a ideia pareça boa. Com endereços reais, essa ideia não vai ajudar muito, talvez até piorar ...

    
por 07.05.2014 / 22:35
1

Você pode, na verdade, simplesmente sufixar seu endereço IPv4 com um prefixo IPv6; O IPv6 suporta essa notação mista. 2001: 0DB8 :: 192.168.1.1 é um endereço IPv6 perfeitamente válido, não há necessidade de convertê-lo em hexadecimal ou substituir os pontos.

Claro, você quer testar isso - só porque é um IP válido não significa que o CentOS o manipule corretamente.

    
por 08.11.2015 / 07:14
0

Uma sugestão para possível melhoria.

Extraia os bits de sub-rede e os bits de ID do host do endereço IPv4. Use os bits de ID do host como um deslocamento para o host IPv6; use os bits de sub-rede como uma pesquisa de algum mapa para o prefixo IPv6 apropriado a ser usado. Dessa forma, você pode ter a flexibilidade de fazer a correspondência da topologia da sua rede.

Mas realmente isso deve ser parte de uma solução IPAM, e as VMs devem estar usando DHCP e DHCPv6 para receber seu endereçamento. Mas, como esse é um appliance virtual, talvez ele esteja confiando em uma infraestrutura que você não pode esperar ter.

    
por 07.05.2014 / 23:00