O fim está próximo
Este não é um artigo teológico, é uma introdução ao IPv6. Descrevo os motivos que levaram à sua criação, suas características e como começar a implantar o IPv6 na sua empresa, usando um equipamento com GNU/Linux.
Parte 5: Pondo a mão na massa
Agora que sabemos o básico, vamos começar a pôr a mão na massa.
Verifique se seu sistema tem suporte ao IPv6.
Antes de prosseguirmos, verifique se o teu equipamento tem o suporte ao IPv6. O IPv6 está incluído nos seguintes sistemas operacionais:
No GNU/Linux, para ver a versão do kernel, digite:
uname -r
3.2.0-4-686-pae
Se a versão for superior a 2.2.0, então seu sistema Linux já tem suporte. Agora, precisamos verificar se os módulo do IPv6 estão carregados.
sysctl net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0
Se estiver zerado, então o suporte está habilitado. Caso contrário, execute como root, o seguinte comando:
# sysctl net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.disable_ipv6 = 0
Você pode forçar essa configuração alterando o arquivo /etc/sysctl.conf. Inclua a seguinte linha:
Isso fará com que o seu sistema operacional tenha suporte ao IPv6, habilitado após o boot.
O protocolo ICMP está no coração do IPv6. É ele quem cuida das resoluções de endereços de MAC address. Bloquear o ICMP, fará com que o protocolo IPv6 simplesmente não funcione. A regra padrão, é permitir o tráfego ICMP, a menos que você saiba exatamente o que está fazendo.
Para ver o endereço físico da interface de rede, você pode executa o ifconfig. Porém, vamos nos acostumar a usar o comando ip, pois ele já tem suporte ao IPv6 e incorpora as funções dos comandos ifconfig, ARP, route, entre outros.
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT
link/sit 0.0.0.0 brd 0.0.0.0
4: teredo: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 500
link/none
Podemos notar, que a máquina que estou usando tem uma interface de rede real (eth0), duas virtuais (teredo e sit0) e a de loopback (lo).
Quando uma máquina com suporte a IPv6 entra na rede, ela escolhe um endereço IP aleatório do range Link Local (FE80::/64) e manda um pacote Neighbor Solicitation (NS) para a rede, perguntando se alguma estação já possui esse endereço.
Caso alguma máquina responda com um Neighbor Advertisement (RA), então, a estação terá que usar outro endereço IP. Se ela estiver usando uma configuração manual, então ela não entrará na rede.
Portanto, não haverá um conflito de IP. Você não precisará procurar pelas máquina conflitantes na rede, pois a segunda não vai funcionar, enquanto a primeira, funcionará normalmente.
Para ver qual IP a estação pegou, digite:
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
link/sit 0.0.0.0 brd 0.0.0.0
Se quiser ver o endereço apenas de uma interface, você pode digitar o seguinte comando:
ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
Para checar os endereços físicos já resolvidos, você pode usar o seguinte comando:
ip neigh
fe80::5aa2:b5ff:fea3:9611 dev eth0 lladdr 58:a2:b5:a3:96:11 STALE
fe80::230:48ff:fe62:329f dev eth0 lladdr 00:30:48:62:32:9f router STALE
fe80::cba:37c8:a52e:2590 dev eth0 lladdr e8:03:9a:4a:9a:ff STALE
172.20.1.32 dev eth0 lladdr 00:1c:c4:c2:06:b8 REACHABLE
172.20.18.85 dev eth0 lladdr 00:1b:11:b0:e1:c2 REACHABLE
172.20.1.146 dev eth0 lladdr 00:25:90:2b:35:de STALE
Reparem que o comando arp, não mostra os dados referentes ao IPv6:
arp -na
? (172.20.1.32) em 00:1c:c4:c2:06:b8 [ether] em eth0
? (172.20.18.85) em 00:1b:11:b0:e1:c2 [ether] em eth0
? (172.20.1.146) em 00:25:90:2b:35:de [ether] em eth0
ping6 fe80::230:48ff:fe62:329f
connect: Invalid argument
Por que deu erro?
Vamos entender: A máquina em questão, contém uma interface eth0 com suporte a IPv6, e uma interface virtual teredo, também com suporte a IPv6. Ambas possuem a rede FE80::/64, e isso é normal. Para pingarmos um endereço Link Local (FE80::/64), precisamos definir por qual interface vamos tentar a conexão.
ping6 -c 1 -I eth0 fe80::230:48ff:fe62:329f
PING fe80::230:48ff:fe62:329f ( fe80::230:48ff:fe62:329f ) from fe80::230:48ff:fe62:329f eth0: 56 data bytes
64 bytes from fe80::230:48ff:fe62:329f : icmp_seq=1 ttl=64 time=0.514 ms
--- fe80::230:48ff:fe62:329f ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.514/0.514/0.514/0.000 ms
O endereço Link Local não deve ser usado para algo "útil". Se você quer uma rede local IPv6, é necessário configurar uma rede Unique Local. Em uma estação, eu digito:
# ip addr add fc00:470:db7e:8000::1/64 dev eth1
# ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:30:48:62:32:9f brd ff:ff:ff:ff:ff:ff
inet 172.20.1.124/16 brd 172.20.255.255 scope global eth1
inet6 fc00:470:db7e:8000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 2001:470:db7e:8000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::230:48ff:fe62:329f/64 scope link
valid_lft forever preferred_lft forever
Em minha estação de trabalho, digito o mesmo comando substituindo o IP.
# ip addr add fc00:470:db7e:8000::2/64 dev eth0
# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fc00:470:db7e:8000::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
Agora, posso pingar a outra estação sem problemas.
# ping6 -c 1 fc00:470:db7e:8000::1
PING fc00:470:db7e:8000::1(fc00:470:db7e:8000::1) 56 data bytes
64 bytes from fc00:470:db7e:8000::1: icmp_seq=1 ttl=64 time=0.525 ms
--- fc00:470:db7e:8000::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.525/0.525/0.525/0.000 ms
Reparem que, se digitarmos o comando ipconfig, veremos a interface com vários IPv6.
# ifconfig eth0
eth0 Link encap:Ethernet Endereço de HW 50:e5:49:fc:de:9b
inet end.: 172.20.120.4 Bcast:172.20.255.255 Masc:255.255.0.0
endereço inet6: fe80::52e5:49ff:fefc:de9b/64 Escopo:Link
endereço inet6: fc00:470:db7e:8000::4/64 Escopo:Global
UP BROADCASTRUNNING MULTICAST MTU:1500 Métrica:1
RX packets:21300365 errors:0 dropped:0 overruns:0 frame:0
TX packets:4442303 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:1000
RX bytes:5514033851 (5.1 GiB) TX bytes:452512661 (431.5 MiB)
IRQ:20 Memória:fe400000-fe420000
Diferentemente do que acontece no IPv4, a interface responde por vários IPv6, sem a necessidade de IP virtuais.
Para configurar o endereço IPv6 no arquivo /etc/network/interfaces, adicione as seguintes linhas:
Pela linha de comando, podemos utilizar o comando abaixo:
# ip -6 route add ::/0 via 2001:db8:8000:1080:: dev eth0
Analisando o roteador no topo da hierarquia, podemos notar que basta apenas uma entrada na tabela de roteamento, para que este consiga se comunicar com a estação 2001:db8:8000:1080::2002.
Se esse roteador for um GNU/Linux, o comando seria o seguinte:
# ip route add 2001:db8:8000:1000::/56 from 2001:db8:8000::1 dev eth0
Dessa forma, a tabela de roteamento fica menor. Pensando nos roteadores principais da Internet, os backbones, ter uma tabela menor melhora o desempenho.
Para checar a tabela de roteamento da estação de trabalho, digite:
ip -6 route
2001:db8:8000:1000::/56 dev eth0 proto kernel metric 256
fc00:db8:8000:1000::/56 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev vboxnet0 proto kernel metric 256
default via 2001:db8:8000:1080:: dev eth0 metric 1024
Para apagar uma rota, digite:
# ip route delete 2001:db8:8000:1000::/56 from 2001:db8:8000:1 dev eth0
Verifique se seu sistema tem suporte ao IPv6.
Antes de prosseguirmos, verifique se o teu equipamento tem o suporte ao IPv6. O IPv6 está incluído nos seguintes sistemas operacionais:
- Windows XP sp1 (simplificado) ou mais recente (completo)
- Mac OS X 10.2 Jaguar
- Linux kernel a partir do 2.1.8 (simplificado) ou a partir do 2.2 (completo)
- FreBSD 4.0
- NetBSD 1.5
- OpenBSD 2.7
No GNU/Linux, para ver a versão do kernel, digite:
uname -r
3.2.0-4-686-pae
Se a versão for superior a 2.2.0, então seu sistema Linux já tem suporte. Agora, precisamos verificar se os módulo do IPv6 estão carregados.
sysctl net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 0
Se estiver zerado, então o suporte está habilitado. Caso contrário, execute como root, o seguinte comando:
# sysctl net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.disable_ipv6 = 0
Você pode forçar essa configuração alterando o arquivo /etc/sysctl.conf. Inclua a seguinte linha:
net.ipv6.conf.all.disable_ipv6=0
Isso fará com que o seu sistema operacional tenha suporte ao IPv6, habilitado após o boot.
O ARP morreu
No IPv6 não existe mais o ARP. Quem cuida das funções que eram do ARP, é o ICMP. Isso mesmo, o ping.O protocolo ICMP está no coração do IPv6. É ele quem cuida das resoluções de endereços de MAC address. Bloquear o ICMP, fará com que o protocolo IPv6 simplesmente não funcione. A regra padrão, é permitir o tráfego ICMP, a menos que você saiba exatamente o que está fazendo.
Para ver o endereço físico da interface de rede, você pode executa o ifconfig. Porém, vamos nos acostumar a usar o comando ip, pois ele já tem suporte ao IPv6 e incorpora as funções dos comandos ifconfig, ARP, route, entre outros.
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT
link/sit 0.0.0.0 brd 0.0.0.0
4: teredo: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 500
link/none
Podemos notar, que a máquina que estou usando tem uma interface de rede real (eth0), duas virtuais (teredo e sit0) e a de loopback (lo).
Quando uma máquina com suporte a IPv6 entra na rede, ela escolhe um endereço IP aleatório do range Link Local (FE80::/64) e manda um pacote Neighbor Solicitation (NS) para a rede, perguntando se alguma estação já possui esse endereço.
Caso alguma máquina responda com um Neighbor Advertisement (RA), então, a estação terá que usar outro endereço IP. Se ela estiver usando uma configuração manual, então ela não entrará na rede.
Portanto, não haverá um conflito de IP. Você não precisará procurar pelas máquina conflitantes na rede, pois a segunda não vai funcionar, enquanto a primeira, funcionará normalmente.
Para ver qual IP a estação pegou, digite:
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
link/sit 0.0.0.0 brd 0.0.0.0
Se quiser ver o endereço apenas de uma interface, você pode digitar o seguinte comando:
ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
Para checar os endereços físicos já resolvidos, você pode usar o seguinte comando:
ip neigh
fe80::5aa2:b5ff:fea3:9611 dev eth0 lladdr 58:a2:b5:a3:96:11 STALE
fe80::230:48ff:fe62:329f dev eth0 lladdr 00:30:48:62:32:9f router STALE
fe80::cba:37c8:a52e:2590 dev eth0 lladdr e8:03:9a:4a:9a:ff STALE
172.20.1.32 dev eth0 lladdr 00:1c:c4:c2:06:b8 REACHABLE
172.20.18.85 dev eth0 lladdr 00:1b:11:b0:e1:c2 REACHABLE
172.20.1.146 dev eth0 lladdr 00:25:90:2b:35:de STALE
Reparem que o comando arp, não mostra os dados referentes ao IPv6:
arp -na
? (172.20.1.32) em 00:1c:c4:c2:06:b8 [ether] em eth0
? (172.20.18.85) em 00:1b:11:b0:e1:c2 [ether] em eth0
? (172.20.1.146) em 00:25:90:2b:35:de [ether] em eth0
Teste a conectividade
No GNU/Linux, para testar se uma máquina está conseguindo se comunicar com outra via IPv6, você pode usar o ping6.ping6 fe80::230:48ff:fe62:329f
connect: Invalid argument
Por que deu erro?
Vamos entender: A máquina em questão, contém uma interface eth0 com suporte a IPv6, e uma interface virtual teredo, também com suporte a IPv6. Ambas possuem a rede FE80::/64, e isso é normal. Para pingarmos um endereço Link Local (FE80::/64), precisamos definir por qual interface vamos tentar a conexão.
ping6 -c 1 -I eth0 fe80::230:48ff:fe62:329f
PING fe80::230:48ff:fe62:329f ( fe80::230:48ff:fe62:329f ) from fe80::230:48ff:fe62:329f eth0: 56 data bytes
64 bytes from fe80::230:48ff:fe62:329f : icmp_seq=1 ttl=64 time=0.514 ms
--- fe80::230:48ff:fe62:329f ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.514/0.514/0.514/0.000 ms
O endereço Link Local não deve ser usado para algo "útil". Se você quer uma rede local IPv6, é necessário configurar uma rede Unique Local. Em uma estação, eu digito:
# ip addr add fc00:470:db7e:8000::1/64 dev eth1
# ip addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:30:48:62:32:9f brd ff:ff:ff:ff:ff:ff
inet 172.20.1.124/16 brd 172.20.255.255 scope global eth1
inet6 fc00:470:db7e:8000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 2001:470:db7e:8000::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::230:48ff:fe62:329f/64 scope link
valid_lft forever preferred_lft forever
Em minha estação de trabalho, digito o mesmo comando substituindo o IP.
# ip addr add fc00:470:db7e:8000::2/64 dev eth0
# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 50:e5:49:fc:de:9b brd ff:ff:ff:ff:ff:ff
inet 172.20.120.4/16 brd 172.20.255.255 scope global eth0
inet6 fc00:470:db7e:8000::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::52e5:49ff:fefc:de9b/64 scope link
valid_lft forever preferred_lft forever
Agora, posso pingar a outra estação sem problemas.
# ping6 -c 1 fc00:470:db7e:8000::1
PING fc00:470:db7e:8000::1(fc00:470:db7e:8000::1) 56 data bytes
64 bytes from fc00:470:db7e:8000::1: icmp_seq=1 ttl=64 time=0.525 ms
--- fc00:470:db7e:8000::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.525/0.525/0.525/0.000 ms
Reparem que, se digitarmos o comando ipconfig, veremos a interface com vários IPv6.
# ifconfig eth0
eth0 Link encap:Ethernet Endereço de HW 50:e5:49:fc:de:9b
inet end.: 172.20.120.4 Bcast:172.20.255.255 Masc:255.255.0.0
endereço inet6: fe80::52e5:49ff:fefc:de9b/64 Escopo:Link
endereço inet6: fc00:470:db7e:8000::4/64 Escopo:Global
UP BROADCASTRUNNING MULTICAST MTU:1500 Métrica:1
RX packets:21300365 errors:0 dropped:0 overruns:0 frame:0
TX packets:4442303 errors:0 dropped:0 overruns:0 carrier:0
colisões:0 txqueuelen:1000
RX bytes:5514033851 (5.1 GiB) TX bytes:452512661 (431.5 MiB)
IRQ:20 Memória:fe400000-fe420000
Diferentemente do que acontece no IPv4, a interface responde por vários IPv6, sem a necessidade de IP virtuais.
Para configurar o endereço IPv6 no arquivo /etc/network/interfaces, adicione as seguintes linhas:
iface eth0 inet6 static
address fc00:470:db7e:8000::4
netmask 64
address fc00:470:db7e:8000::4
netmask 64
Roteamento
Vamos agora, entender um pouco sobre o roteamento hierárquico do IPv6. Veja a figura abaixo: Para adicionarmos rota padrão na máquina 2001:db8:8000:1080::2001:64, devemos abrir o arquivo /etc/network/interfaces a adicionar a linha abaixo:
gateway 2001:db8:8000:1080::
Pela linha de comando, podemos utilizar o comando abaixo:
# ip -6 route add ::/0 via 2001:db8:8000:1080:: dev eth0
Analisando o roteador no topo da hierarquia, podemos notar que basta apenas uma entrada na tabela de roteamento, para que este consiga se comunicar com a estação 2001:db8:8000:1080::2002.
Se esse roteador for um GNU/Linux, o comando seria o seguinte:
# ip route add 2001:db8:8000:1000::/56 from 2001:db8:8000::1 dev eth0
Dessa forma, a tabela de roteamento fica menor. Pensando nos roteadores principais da Internet, os backbones, ter uma tabela menor melhora o desempenho.
Para checar a tabela de roteamento da estação de trabalho, digite:
ip -6 route
2001:db8:8000:1000::/56 dev eth0 proto kernel metric 256
fc00:db8:8000:1000::/56 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev vboxnet0 proto kernel metric 256
default via 2001:db8:8000:1080:: dev eth0 metric 1024
Para apagar uma rota, digite:
# ip route delete 2001:db8:8000:1000::/56 from 2001:db8:8000:1 dev eth0
Hilário! :)