1. 1 IPv6 - Linux Luiz Arthur
IPv6 é o novo protocolo da camada de rede (no modelo OSI), ou a camada de
Inter-rede (no modelo TCP/IP) o qual sucede o IPv4 (conhecido apenas como IP).
O IPv4 foi projetado a muito tempo atrás e seu endereçamento esta deixando a
desejar na Internet atual. Por isto, a maior diferença entre o IPv6 quanto ao IPv4
é com certeza o aumento do tamanho de representação de hosts dentro do
cabeçalho IPv6 que passa de 32 bits para 128 bits. Isto possibilita endereças
bilhares de máquinas sem se preocupar com a falta de endereços representados
na rede.
O Linux começou a tratar o IPv6 em novembro de 1996 com o Kernel 2.1.8, mas
foram códigos experimentais nada muito sério, sendo então tratado com mais
rigor em outubro de 2000, no Kernel 2.4 e 2.6.
Formato do endereçamento do IPv6
Um número de 128 bits é muito longo, e se fosse representado em decimal, tal
como o IPv4 seriam necessário ~39 dígitos. Isto tornaria o endereço IPv6 difícil
de se memorizar.
Assim, o IPv6 adotou um esquema de endereçamento em hexadecimal, neste
esquema endereçamos representamos de uma só vez 4 bits (conhecidos como
nibble) que são representados por dígitos 0-9 ou caracteres a-f (10-15). Este
formato reduz o endereçamento para 32 caracteres.
2. 2 IPv6 - Linux Luiz Arthur
Para melhorar o aspecto esses números foram separados de 16 em 16 bits tal
como:
2001:0db8:0100:f101:0210:a4ff:fee3:9566
Uma seqüência de blocos de 16 bits contento apenas zeros podem ser
representado por “::”, mas somente uma vez.
2001:0bd8:100:f101:0:0:0:1
é igual a
2001:bd8:100:f101::1
Uma boa redução de um endereço IPv6 seria:
0000:0000:0000:0000:0000:0000:00000:0001
a forma abreviada seria
::1
Esta forma de endereçamento é chamada de compacta (compact, ou codificada
na base85).
3. 3 IPv6 - Linux Luiz Arthur
Endereços especiais
De todo espaço de endereçamento IPv6, apenas 15% estão previamente alocado
para uso, ficando os 85% restantes reservados para o futuro.
O endereço IPv6 que representa a interface de loopback, similar ao 127.0.0.1
do IPv4 é:
0000:0000:0000:0000:0000:0000:0000:0001
ou comprimido:
::1
Endereços de mapeamento entre IPv4 e IPv6
A terceira forma de representação, mais conveniente quando em ambientes
mistos com hosts IPv4 e IPv6, é da forma x:x:x:x:x:x:d:d:d:d, onde os "x" são
números hexadecimais (16 bits) e os "d" são valores decimais de 8 bits
referentes à representação padrão já bem conhecida do IPv4.
4. 4 IPv6 - Linux Luiz Arthur
Espera-se que o IPv6 conviva por muito tempo com o IPv4, desta forma, criou-se
um esquema de endereço IPv6 para fazer mapeamentos aos endereços IPv4, tal
como:
0:0:0:0:0:ffff:a.b.c.d/96
na forma comprimida o formato é:
::ffff:a.b.c.d/96
Por exemplo, o endereço IPv4 192.168.1.100 ficaria no IPv6 com:
::ffff:192.168.1.100
O contrário também é possível ou seja IPv4 no IPv6 tal endereço é representado
da seguinte forma:
0:0:0:0:0:0:a.b.c.d/96
no formato comprimido:
::a.b.c.d/96
5. 5 IPv6 - Linux Luiz Arthur
Endereço não especificado
Em IPv4 “0.0.0.0” ou “any” é representado no IPv6 por:
0000:0000:0000:0000:0000:0000:0000:0000 ou ::
Prefixos (tipos de endereços IPv6)
Especificamente, o prefixo definido pelos primeiros bits do endereço indica cada
tipo de endereço IPv6. O campo variável que compreende esses bits é
denominado Format Prefix (FP).
Aggregatable Global Unicast Addresses
Este é o endereço unicast que será globalmente utilizado na Internet. Seu novo
formato possui sete campos: o prefixo de 3 bits (001), um identificador TLA
(Top-Level Aggregation), um campo RES reservado, um identificador NLA (Next-
Level Aggregation), um identificador SLA (Site-Level Aggregation) e o
identificador da interface:
bits: 3 13 8 24 16 64
FP TLA ID RES NLA ID SLA ID InterfaceID
6. 6 IPv6 - Linux Luiz Arthur
Local-Use IPv6 Address
Existem dois de endereços para uso local: link-local e site-local.
Link-local : endereço identificado por um prefixo de 10 bits (1111111010),
definido para uso interno num único enlace para funções como auto-
configuração de endereços, descoberta do vizinho (neighbor discovery) ou
quando não há roteador. Estações ainda não configuradas, ou com um endereço
global unicast ou com um site-local, poderão utilizar um endereço link-local. Os
roteadores não devem repassar pacotes com endereço fonte ou destino deste
tipo;
Um endereço de link local tem os seguintes prefixos: fe8X: (o mais utilizado),
fe9X:, feaX: e febX:. Onde “X” é um caracter hexadecimal normalmente o “0”
Site-local: endereço identificado pelo prefixo de 10 bits (1111111011), definido
para uso interno numa organização que não se conectara à Internet, e não há
necessidade de uso de um prefixo global. Os roteadores não devem repassar
pacotes cujos endereços origem ou destino sejam endereços site-local.
Um endereço site-local é identificado pelos prefixos: fecX: (o mais utilizado),
fedX:, feeX: e fefX. Onde “X” deve ser subustituido por um caracter
hexadecimal, sendo normalmente o “0”.
7. 7 IPv6 - Linux Luiz Arthur
Os endereços IPv6 unicast foram projetados assumindo que os sistemas de
roteamento da Internet repassam pacotes baseado num algoritmo de cálculo do
prefixo mais longo, sem nenhum conhecimento da estrutura interna do endereço
IPv6. O tipo específico de endereço IPv6 é indicado pelos primeiros bits do
endereço (FP).
Dentre os tipos de endereços unicast apresentados anteriormente, foram
apresentados os endereços Aggregatable Global Unicast Addresses a serem
globalmente utilizados na Internet e definidos pelo formato de prefixo (FP =
001) para suportar a agregação provider-based, definida inicialmente pela RFC
1884, e um novo tipo de agregação denominada como exchange-based. Esta
combinação permitirá uma agregação eficiente de rotas, tanto para sites
conectados a provedores, quanto para aqueles conectados aos pontos de troca
de tráfego (exchanges).
3 13 8 24 16 64
FP TLA ID RES NLA ID SLA ID InterfaceID
sendo:
FP - Format Prefix de 3 bits, neste caso igual a 001;
TLA ID - Identificador Top-Level Aggregation de 13 bits;
RES - 8 bits reservados para uso futuro, e deve ter todos os bits zerados;
NLA ID - Identificador Next-Level Aggregation de 24 bits;
SLA ID - Identificador Site-Level Aggregation de 16 bits;
Interface ID - Identificador da interface de 64 bits.
8. 8 IPv6 - Linux Luiz Arthur
Em termos de topologia, essa estrutura permite uma organização em três níveis
hierárquicos: pública, site e identificador de interface. A topologia pública
(campos TLA, RES, e NLA) reflete o conjunto de provedores de serviços
Internet, provedores de trânsito e pontos de troca de tráfego. A topologia site
(campos SLA) tem abrangência local, uma organização específica que não provê
serviços de trânsito para outras organizações ou sites. Já o identificador de
interface (campos Interface ID), como o próprio nome indica, identifica a
interface do node.
Top-Level Aggregation ID
Os identificadores TLA são o topo da hierarquia de roteamento. Este formato
suporta 8.192 (213) identificadores TLA, que podem ser aumentados ou através
do aumento do tamanho do campo TLA, utilizando os bits reservados do campo
RES, ou utilizando um prefixo de formato adicional.
Os roteadores default-free devem ter uma entrada na tabela de roteamento para
cada TLA ID ativo, e podem ter entradas adicionais para otimizar o roteamento
de suas topologias específicas. Mas, em todos os níveis, a topologia de
roteamento deve ser projetada para minimizar a quantidade de entradas na
tabela de roteamento. Está sendo produzido um documento específico para o
campo TLA.
9. 9 IPv6 - Linux Luiz Arthur
Site-Level Aggregation ID
O identificador SLA é utilizado por uma organização individual, que é
responsável para definir a estrutura de endereços do espaço SLA. Dentro deste
espaço, a organização pode criar localmente sua própria estrutura de
endereçamento hierárquica, num procedimento similar às divisão em sub-redes
do IPv4, só que com um número muito maior de sub-redes.
Interface ID
Os identificadores de interface (Interface ID), como o próprio nome indica, são
utilizados para identificar interfaces de um enlace específico e devem ser únicos
para esse link. Também devem ser únicos num escopo mais abrangente. Em
muitos casos, o identificador de interface será o endereço de interface da
camada de enlace ou obtido a partir deste.
Endereços IPv6 de Produção
Atualmente, já estão sendo oferecidos endereços IPv6 de produção pelos três
Regional Internet Registries (RIR): ARIN, RIPE NCC e APNIC.
Inicialmente, foi reservado pela IANA o prefixo TLA 2001::/16 para
endereçamento de produção. Sob esse prefixo, são alocados os identificadores
para backbones, utilizando para isso o campo Sub-TLA. O tamanho do prefixo
mínimo alocado é de 35 bits.
10. 10 IPv6 - Linux Luiz Arthur
O processo de alocação utiliza um procedimento chamado slow start. Ao se obter
um identificador Sub-TLA, os 6 bits seguintes são reservados pelo RIR que fez a
alocação. O RIR só fará alocações subseqüentes desse espaço reservado quando
a organização tiver utilizado pelo menos 80% do espaço previamente alocado.
Endereçamento no 6Bone
Com o propósito de utilizar o mínimo do espaço de endereçamento de produção
IPv6, a IANA alocou ao Projeto 6Bone o prefixo TLA 3FFE::/16. Esse endereço
é especificado no RFC 2471 - IPv6 Testing Address Allocation.
Sob esse prefixo, o 6Bone criou um formato próprio para o particionamento de
seu espaço endereços. Esse formato é baseado no utilizado em endereços de
produção, especificado no RFC 2374 - An IPv6 Aggregatable Global Unicast
Address Format.
O suporte ao IPv6 no Kernel Linux
Para que seu computador de suporte ao novo protocolo IPv6 é necessário que
este esteja sendo executado pelo Kernel (núcleo do Sistema Operacional), uma
forma de verificar se este está ou não no Kernel e verificando a existência do
arquivo /proc/net/if_inet6, para tanto é possível executar o seguinte comando:
# test -f /proc/net/if_inet6 && echo "O Kernel está executando IPv6”
11. 11 IPv6 - Linux Luiz Arthur
Se tudo estiver bem, será apresentado a mensagem "O Kernel está
executando IPv6”, caso contrário não será apresentada mensagem alguma e o
Kernel não esta dando suporte ao Ipv6.
Carregando modulo IPv6 no Kernel Linux
Uma forma simples de dar suporte ao IPv6, é carregando o modulo do IPv6 no
kernel. Para tanto basta executar o seguite comando:
#modprobe ipv6
Agora para ter a certeza que este modulo foi atribuído ao Kernel Linux basta
executar o seguinte comando:
# lsmod |grep -w 'ipv6' && echo "O IPv6 foi carregado corretamente”
Caso seja mostrado a mensagem "O IPv6 foi carregado corretamente” o
Linux estará pronto para trabalhar com o IPv6, caso contrário será necessário
re-compilar o Kernel.
Caso queira-se trabalhar com freqüência com o IPv6 é melhor carregar o modulo
do IPv6 sempre que o Linux for iniciado no computador, para tanto basta editar
os arquivos /etc/modules.conf ou /etc/conf.modules, e acrescentar a
seguinte linha:
alias net-pf-10 ipv6 # automatically load IPv6 module on demand
12. 12 IPv6 - Linux Luiz Arthur
Verificando se as ferramentas de configuração de rede estão prontas
para o IPv6
Os pacotes de programas que tratam de aspectos de rede devem dar suporte ao
IPv6 para que possamos configurar corretamente os serviços, para tanto
podemos executar os seguinte comandos:
# ifconfig -? 2>& 1|grep -qw 'inet6' && echo "ifconfig pronto para o IPv6"
# route -? 2>& 1|grep -qw 'inet6' && echo "route pronto para o IPv6"
# ip 2>&1 |grep -qw 'inet6' && echo "ip pronto para o IPv6"
Caso exista uma saída para os comandos anteriores o IPv6 está pronto para ser
implementado, caso contrário você precisará reinstalar tais ferramentas com
suporte a Ipv6.
O comando ip é atualmente o comando que dá mais suporte a configuração de
redes, este por exemplo, substitui os comandos ifconfig e route,
implementando ainda funções avançadas de configuração de redes (que não
estão disponíveis nos comandos ifconfig e route), porém as distribuições Linux
mais antigas podem não possuir tal ferramenta de rede.
13. 13 IPv6 - Linux Luiz Arthur
Configurando Interfaces com IPv6
Para configurar a interfaces de rede com IPv6 podemos utilizar o tanto o
comando ifconfig quanto o ip.
Usando o ifconfig:
Vamos dar uma olhada na interface lo, e ver se o endereço IPv6 está correto:
#ifconfig lo
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:760 (760.0 b) TX bytes:760 (760.0 b)
Bem a saída anterior é apresentada antes do modulo IPv6 ser carregada no
Kernel, o comando a seguir mostra o mesmo comando já com a adição de
suporte do IPv6 no Kernel.
14. 14 IPv6 - Linux Luiz Arthur
# ifconfig lo
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:760 (760.0 b) TX bytes:760 (760.0 b)
Agora podemos observar no comando anterior a existência de uma nova linha à:
inet6 addr: ::1/128 Scope:Host. Tal linha indica a presença do endereço
localhost ::1 atribuído a uma interface local via IPv6.
Logo após iniciar o modulo IPv6 no Kernel Linux, podemos ligar, por exemplo, a
primeira placa de rede Ethernet do computador, para isto iremos apenas
executar o comando:
#ifconfig eth0 up
15. 15 IPv6 - Linux Luiz Arthur
Em seguida podemos verificar o status desta placa de rede com o comando
ifconfig e a saída será algo como:
#ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:6E:0D:A6:DF
inet6 addr: fe80::20c:6eff:fe0d:a6df/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:238 (238.0 b)
Interrupt:11 Base address:0xe000
Podemos observar que existe um endereço inet6 (IPv6) atribuído a interface, tal
endereço é atribuído automaticamente pelo IPv6, baseado no endereço físico da
placa de rede. Está prática pode ser utilizada para substituir servidores DHCP.
Atribuindo endereços IPv6 com o ifconfig:
#ifconfig <interface> inet6 add <ipv6address>/<prefixlength>
Exemplo:
#ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64
16. 16 IPv6 - Linux Luiz Arthur
Já para remover um endereço IPv6 utilize as seguintes opções:
#ifconfig <interface> inet6 del <ipv6address>/<prefixlength>
Exemplo:
#ifconfig eth0 inet6 del 2001:0db8:0:f101::1/64
Usando o comando ip:
Para ligar ou desligar as interfaces de rede com o comando ip, utilize os
seguintes comando respectivamente:
# ip link set dev <interface> up
# ip link set dev <interface> down
Exemplo:
# ip link set dev eth0 up
# ip link set dev eth0 down
17. 17 IPv6 - Linux Luiz Arthur
Já para verificar o status das interfaces utilize as seguintes opções:
# /sbin/ip -6 addr show dev <interface>
Exemplo:
#ip -6 addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> qlen 1000
inet6 fe80::20c:6eff:fe0d:a6df/64 scope link
Atribuindo endereços IPv6 via comando ip:
#ip -6 addr add <ipv6address>/<prefixlength> dev <interface>
Exemplo:
#ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0
Removendo endereços IPv6 com o comando ip:
#ip -6 addr del <ipv6address>/<prefixlength> dev <interface>
Exemplo:
#ip -6 addr del 2001:0db8:0:f101::1/64 dev eth0
18. 18 IPv6 - Linux Luiz Arthur
Configurando rotas com IPv6
Exibindo rotas existentes, para tanto você pode utilizar o ip ou o route:
#ip -6 route show [dev <device>]
Exemplo:
ip -6 route show dev eth0
2001:0db8:0:f101::/64 proto kernel metric 256 mtu 1500 advmss 1440
fe80::/10 proto kernel metric 256 mtu 1500 advmss 1440
ff00::/8 proto kernel metric 256 mtu 1500 advmss 1440
default proto kernel metric 256 mtu 1500 advmss 1440
Ou:
#route -A inet6 |grep -w "eth0"
2001:0db8:0:f101 ::/64 :: UA 256 0 0 eth0 <-Interface route for global address
fe80::/10 :: UA 256 0 0 eth0 <-Interface route for link-local address
ff00::/8 :: UA 256 0 0 eth0 <-Interface route for all multicast addresses
::/0 :: UDA 256 0 0 eth0 <-Automatic default route
19. 19 IPv6 - Linux Luiz Arthur
Adicionando uma rota para um gateway:
#ip -6 route add <ipv6network>/<prefixlength> via <ipv6address> [dev<device>]
Exemplo:
#ip -6 route add 2000::/3 via 2001:0db8:0:f101::1
Ou:
#route -A inet6 add <ipv6network>/<prefixlength> gw <ipv6address> [dev<device>]
Exemplo:
#route -A inet6 add 2000::/3 gw 2001:0db8:0:f101::1
Para remover a rota basta substituir o add por del tanto no comando ip quanto
no route.
20. 20 IPv6 - Linux Luiz Arthur
Adicionando rotas através de interfaces
Não freqüentemente é necessário fazer rotas ponto-a-ponto, para é possível
utilizar os seguintes comandos:
#ip -6 route add <ipv6network>/<prefixlength> dev <device> metric 1
Exemplo:
#ip -6 route add 2000::/3 dev eth0 metric 1
Ou:
#route -A inet6 add <network>/<prefixlength> dev <device>
Exemplo:
#route -A inet6 add 2000::/3 dev eth0
Novamente para apagar este tipo de rota execute substitua a opção add por del.
21. 21 IPv6 - Linux Luiz Arthur
Ping no IPv6
O comando ping que é utilizado para enviar mensagens ICMP e descobrir se
hosts estão ou não disponíveis na rede, também existe na IPv6, mas é o ICMPv6.
Para utilizar tal funcionalidade utilize o seguinte comando:
# ping6 <hostwithipv6address>
# ping6 <ipv6address>
# ping6 [-I <device>] <link-local-ipv6address>
Exemplo:
# ping6 -c 1 ::1
PING ::1(::1) from ::1 : 56 data bytes
64 bytes from ::1: icmp_seq=0 hops=64 time=292 usec
--- ::1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.292/0.292/0.292/0.000 ms
22. 22 IPv6 - Linux Luiz Arthur
Usando um endereço link-local, o Kernel não conhece a interface física ou
virtual, e teremos como resultado um erro, tal como:
# ping6 fe80::212:34ff:fe12:3456
connect: Invalid argument
Neste caso temos que especificar a interface de rede, tal como:
# ping6 -I eth0 -c 1 fe80::2e0:18ff:fe90:9205
PING fe80::212:23ff:fe12:3456(fe80::212:23ff:fe12:3456) from
¬ fe80::212:34ff:fe12:3478 eth0: 56 data bytes
64 bytes from fe80::212:23ff:fe12:3456: icmp_seq=0 hops=64 time=445 usec
--- fe80::2e0:18ff:fe90:9205 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss round-trip
min/avg/max/mdev = 0.445/0.445/0.445/0.000 ms
Utilizando ping com endereços multicast
Para pingar um endereço multicast o comando é:
# ping6 -I eth0 ff02::1
PING ff02::1(ff02::1) from fe80:::2ab:cdff:feef:0123 eth0: 56 data
bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from fe80::212:34ff:fe12:3450: icmp_seq=1 ttl=64 time=0.549
ms (DUP!)
23. 23 IPv6 - Linux Luiz Arthur
IPv6 com o traceroute6
O traceroute6 é similar ao traceroute do IPv4, por exemplo:
# traceroute6 www.6bone.net
traceroute to 6bone.net (3ffe:b00:c18:1::10) from 2001:0db8:0000:f101::2, 30
¬ hops max, 16 byte packets
1 localipv6gateway (2001:0db8:0000:f101::1) 1.354 ms 1.566 ms 0.407 ms
2 swi6T1-T0.ipv6.switch.ch (3ffe:2000:0:400::1) 90.431 ms 91.956 ms 92.377 ms
3 3ffe:2000:0:1::132 (3ffe:2000:0:1::132) 118.945 ms 107.982 ms 114.557 ms
4 3ffe:c00:8023:2b::2 (3ffe:c00:8023:2b::2) 968.468 ms 993.392 ms 973.441 ms
5 3ffe:2e00:e:c::3 (3ffe:2e00:e:c::3) 507.784 ms 505.549 ms 508.928 ms
6 www.6bone.net (3ffe:b00:c18:1::10) 1265.85 ms * 1304.74 ms
Outro programa parecido com o traceroute6 é o tracepath6, porém este
descobre o MTU ao longo do caminho entre os hosts. Por exemplo:
# tracepath6 www.6bone.net
1?: [LOCALHOST] pmtu 1480
1: 3ffe:401::2c0:33ff:fe02:14 150.705ms
2: 3ffe:b00:c18::5 267.864ms
3: 3ffe:b00:c18::5 asymm 2 266.145ms pmtu 1280
3: 3ffe:3900:5::2 asymm 4 346.632ms
4: 3ffe:28ff:ffff:4::3 asymm 5 365.965ms
5: 3ffe:1cff:0:ee::2 asymm 4 534.704ms
6: 3ffe:3800::1:1 asymm 4 578.126ms !N
Resume: pmtu 1280
24. 24 IPv6 - Linux Luiz Arthur
Outro comando útil para análise de redes IPv6 é o tcpdump, este que permite a
analise de trafego da rede, tal comando implementa as seguintes opções para a
analise de uma rede IPv6:
● icmp6: filtra trafego ICMPv6;
● ip6: filtra trafego IPv6 (incluindo ICMPv6)
● proto ipv6: filtra tuneis IPv6-in-IPv4.
Exemplos de comando tcpdump com IPv6:
# tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6
tcpdump: listening on eth0
2001:0db8:100:f101:2e0:18ff:fe90:9205 > 2001:0db8:100:f101::1: icmp6: echo
request (len 64, hlim 64)
2001:0db8:100:f101::1 > 2001:0db8:100:f101:2e0:18ff:fe90:9205: icmp6: echo
reply (len 64, hlim 64)