Enviando netmask e gateway / route com dhcp para ipv6

1

Eu configurei um servidor DHCP para atribuir ipv6 aos meus clientes. No entanto, as opções "roteadores" e "sub-rede" são ignoradas.

Eu li que o ipv6 não recebe o mesmo do DHCP, e sim do broatcast do roteador.

No entanto, acho isso muito estranho. Por que ele obtém um IP estático do DHCP, mas a máscara de rede do roteador? Arquitetura estranha.

De qualquer forma, estou querendo saber se existe uma maneira de adicionar facilmente esses recursos "ausentes" ao DHCPv6 ou a qualquer outra solução alternativa. O resultado final deve ser que eu posso definir o "ip6", "netmask" e "gateway" de um lugar central, com base no endereço MAC do cliente, assim como eu posso fazer com o ipv4.

Eu não quero mexer com coisas de autoconfiguração e stateless do ipv6.

O problema de gateway que eu poderia resolver de uma maneira "ruim", definindo coisas no evento "up" na configuração de rede, mas não consigo encontrar uma maneira de mudar a máscara de rede da interface depois de ter sido criada .

    
por Daniele Testa 03.08.2013 / 01:29

1 resposta

3

Normalmente, o IPv6 deve obter as informações de ip, netmask e route / gateway do próprio roteador através de "Anúncio do roteador" usando o "Protocolo de descoberta de vizinhos".

Isso difere completamente do modo como o IPv4 funciona. Existe algo chamado DHCPv6 que deve funcionar como DHCP para o ipv6, mas não possui muitos recursos. Muito provavelmente devido ao modo como o IPv6 deve funcionar.

No entanto, muitos de nós querem poder atribuir o IPv6 aos nossos clientes da mesma maneira que faríamos com o IPv4 e o DHCP. Isso é possível, mas requer um pouco de ajustes.

A primeira coisa que você precisa fazer é adicionar 3 parâmetros OPTION personalizados ao seu servidor DHCP.

Se você estiver usando o servidor ISC DHCP no Linux, seu arquivo de configuração deve se parecer com isto:

authoritative;
default-lease-time 86400;
max-lease-time 86400;
log-facility local7;
use-host-decl-names on;

option ipv6-address code 214 = ip6-address;
option ipv6-netmask code 215 = unsigned integer 8;
option ipv6-gateway code 216 = ip6-address;

subnet 88.xxx.xxx.128 netmask 255.255.255.224 {
  option domain-name "example.com";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  option routers 88.xxx.xxx.128;
  option subnet-mask 255.255.255.255;
  option ipv6-netmask 112;
}

host ip-88-xxx-xxx-129.example.com {
  hardware ethernet 16:xx:xx:xx:b3:8d;
  fixed-address 88.xxx.xxx.129;
  option host-name "ip-88-xxx-xxx-129.example.com";
  option ipv6-address 2a01:xxx:xxx:2464::1:1;
  option ipv6-gateway 2a01:xxx:xxx:2464::1:0;
}

host ip-88-xxx-xxx-130.example.com {
  hardware ethernet 16:xx:xx:xx:af:aa;
  fixed-address 88.xxx.xxx.130;
  option host-name "ip-88-xxx-xxx-130.example.com";
  option ipv6-address 2a01:xxx:xxx:2464::2:1;
  option ipv6-gateway 2a01:xxx:xx:2464::2:0;
}

host ip-88-xxx-xxx-131.example.com {
  hardware ethernet 16:xx:xx:xx:7a:73;
  fixed-address 88.xxx.xxx.131;
  option host-name "ip-88-xxx-xxx-131.example.com";
  option ipv6-address 2a01:xxx:xxx:2464::3:1;
  option ipv6-gateway 2a01:xxx:xxx:2464::3:0;
}

Como você pode ver, adicionei 3 novas opções chamadas "ipv6-address", "ipv6-netmask" e "ipv6-gateway". Você os define da mesma forma que faria normalmente com o IPv4.

Não se esqueça de reiniciar o servidor DHCP depois de fazer as alterações.

Agora, os clientes precisam ser instruídos a incluir essas 3 OPÇÕES personalizadas quando estiverem fazendo uma solicitação DHCP.

Isso difere dependendo de qual cliente DHCP você está usando. Debian / Ubuntu está usando "dhclient" e sua configuração precisa ser algo como isto:

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

option ipv6-address code 214 = ip6-address;
option ipv6-netmask code 215 = unsigned integer 8;
option ipv6-gateway code 216 = ip6-address;

request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, domain-name-servers, domain-search, host-name,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers,
        dhcp6.domain-search, dhcp6.fqdn,
        dhcp6.name-servers, dhcp6.sntp-servers,
        ipv6-address, ipv6-netmask, ipv6-gateway;

Como você pode ver, adicionei as 3 definições OPTION personalizadas na parte superior e depois informei ao DHCP para incluí-las na solicitação.

Agora tente reiniciar o seu cliente e veja se ele ainda obtém um IPv4 corretamente como antes (como deveria).

Após a reinicialização, você pode dar uma olhada no arquivo de concessão que o DHCP criou. Ele contém as informações coletadas do servidor DHCP. Em um sistema Debian / Ubuntu, ele pode ser encontrado em "/var/lib/dhcp/dhclient.eth0.leases". Se você procurar no arquivo, verá algo assim:

lease {
  interface "eth0";
  fixed-address 88.xxx.xxx.136;
  option subnet-mask 255.255.255.255;
  option routers 88.xxx.xxx.128;
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 8.8.8.8,8.8.4.4;
  option dhcp-server-identifier 88.xxx.xxx.128;
  option ipv6-address 2a01:xxx:xxx:2464::8:1;
  option ipv6-netmask 112;
  option host-name "ip-88-xxx-xxx-136.example.com";
  option ipv6-gateway 2a01:xxx:xxx:2464::8:0;
  option domain-name "example.com";
  renew 6 2013/08/03 23:32:53;
  rebind 0 2013/08/04 09:04:30;
  expire 0 2013/08/04 12:04:30;
}

Como você pode ver, as 3 OPÇÕES personalizadas encontraram o caminho para o cliente corretamente.

Agora, a última coisa que você precisa fazer é adicionar um script que use esses valores para configurar sua interface ipv6.

O dhclient está usando um sistema de gancho especial no qual ele executa scripts durante determinados estágios. Precisamos fazê-lo funcionar quando uma resposta do servidor DHCP for recebida.

Crie um arquivo em "/etc/dhcp/dhclient-exit-hooks.d/ipv6" com o seguinte conteúdo:

#**************************************
# This script sets ipv6 based on custom options
#**************************************

# To enable this script set the following variable to "yes"
RUN="yes"

if [ "$RUN" != "yes" ]; then
    exit 0
fi

if [ "$reason" != "BOUND" ]; then
    exit 0
fi

if [ ! -n "$new_ipv6_address" ] || [ ! -n "$new_ipv6_netmask" ] || [ ! -n "$new_ipv6_gateway" ]; then
    exit 0
fi

ip addr add $new_ipv6_address/$new_ipv6_netmask dev $interface

ip -6 route add default via $new_ipv6_gateway dev $interface

Agora reinicie seu cliente e veja a mágica acontecer!

UPDATE 1: movido o ipv6 de "ifup.d" para rodar no limite DHCP para torná-lo mais limpo.

    
por 03.08.2013 / 14:33