Huawei

IPv6 no PPPoE: prefixo delegado /56 com DHCPv6-PD no provedor

Árvore de prefixos IPv6 saindo de 2001:db8::/32 até o /56 de cada cliente PPPoE

Colocar IPv6 no PPPoE é o passo que tira pressão do CGNAT: todo tráfego que vai por IPv6 não passa pela tradução de endereços. O problema é que muito provedor liga o IPv6 no concentrador, vê a ONU pegar um endereço e para por aí. O cliente fica com a WAN em IPv6 e a rede de casa sem nada, porque faltou entregar um prefixo para a LAN.

Este guia monta o IPv6 no PPPoE do jeito completo: plano de endereçamento a partir de um /32, pool de prefixo delegado /56 por cliente com DHCPv6-PD no Mikrotik RouterOS v7, a ONU Huawei em modo roteador pedindo o prefixo, log de cada delegação e os testes. A configuração do concentrador foi montada em laboratório; a parte da ONU vem do provisionamento por TR-069 que uso no parque GPON. Se o concentrador ainda não existe, comece pelo PPPoE server no Mikrotik com RouterOS v7. Todos os endereços são de documentação (2001:db8::/32).

Resposta rápida: IPv6 no PPPoE com prefixo delegado

  1. Reserve um bloco por POP (no exemplo, um /40) e divida em dois pools: um para delegar /56 aos clientes e outro, opcional, de /64 para a WAN.
  2. No Mikrotik, crie os pools com /ipv6 pool e ligue no profile PPP com dhcpv6-pd-pool (prefixo da LAN) e remote-ipv6-prefix-pool (WAN).
  3. Ative use-ipv6=yes no profile e anuncie DNS IPv6 por RA em /ipv6 nd.
  4. Na ONU em modo roteador, ligue o IPv6 na WAN PPPoE e configure o prefixo da LAN como PrefixDelegation.
  5. Registre cada delegação (usuário, MAC e prefixo) num syslog. Sem isso, não dá para responder a um pedido judicial sobre um endereço IPv6.

Como o IPv6 no PPPoE funciona dentro da sessão

Na sessão PPPoE, o IPv4 é negociado pelo IPCP. O IPv6 tem o seu próprio protocolo de controle, o IPv6CP, que só combina os identificadores de interface. O resultado são dois endereços link-local, um em cada ponta. Nenhum endereço global sai do IPv6CP. Se você precisa revisar link-local, prefixo e notação, o post sobre o que é IPv6 cobre a base.

Com o link-local de pé, entram dois mecanismos independentes. O primeiro é o Router Advertisement (RA): o concentrador anuncia a rota padrão e, se houver, um /64 para a WAN do cliente montar endereço por SLAAC. O segundo é o DHCPv6 com delegação de prefixo (DHCPv6-PD, hoje descrito na RFC 8415): o roteador do cliente pede um bloco inteiro, recebe o /56 e distribui redes /64 na LAN.

No RouterOS, a delegação funciona assim: quando o cliente conecta, o PPP cria um servidor DHCPv6 dinâmico só para aquela sessão, usando o pool indicado no profile. O nome do servidor segue o padrão <pppoe-usuario>. Quando o prefixo é entregue, o Mikrotik instala a rota do /56 apontando para a interface da sessão.

WAN com /64 global ou só link-local

A WAN do cliente pode ficar de dois jeitos. Com remote-ipv6-prefix-pool, cada sessão recebe um /64 anunciado por RA, e a WAN da ONU monta um endereço global nele por SLAAC. Isso ajuda no diagnóstico, porque dá para pingar a WAN do cliente. Sem esse pool, a WAN fica só com link-local, a rota padrão aponta para o link-local do concentrador e o tráfego da própria ONU sai com um endereço tirado do prefixo delegado.

No parque que acompanho, as ONUs estão no segundo modelo: WAN sem endereço global e só o prefixo delegado. Funciona bem e economiza um pool. O primeiro modelo vale a pena se o seu NOC monitora a WAN do cliente por IPv6. Os dois funcionam para IPv6 no PPPoE; o que muda é a visibilidade.

Plano de endereçamento antes de qualquer comando

O erro mais caro no IPv6 no PPPoE é começar pelo pool e descobrir depois que ele não cabe, ou que não agrega. Defina o plano de cima para baixo. No exemplo, o provedor tem um /32. A infraestrutura fica no primeiro /48, e cada POP recebe um /40. Dentro do /40 do POP saem o pool de PD e o pool de WAN, sem sobreposição.

NívelPrefixoUsoCapacidade
Provedor2001:db8::/32Bloco recebido do registro256 blocos /40
Infraestrutura2001:db8::/48Loopbacks, enlaces, DNS recursivo65.536 redes /64
POP 12001:db8:100::/40Tudo o que sai deste concentrador65.536 clientes /56
Pool de PD2001:db8:100::/42Prefixo da LAN dos clientes16.384 clientes /56
Pool de WAN2001:db8:1ff::/48Um /64 por sessão PPPoE65.536 sessões
Cliente2001:db8:100:100::/56Rede de casa do cliente256 redes /64
Hierarquia de prefixos IPv6 do provedor: /32, /40 por POP, pool de PD /42 e /56 por cliente
Do /32 do provedor ao /56 de cada cliente: cada nível cabe no anterior e agrega numa única rota.

Por que um /40 por POP e não um /48? Porque um /48 só comporta 256 clientes /56, o que acaba num bairro. O /40 dá folga para crescer sem renumerar, e o POP inteiro aparece no backbone como uma única rota. O concentrador anuncia o agregado do POP para o resto da rede (por OSPFv3, IS-IS ou iBGP), e não cada /56.

Por que /56 para o cliente

Um /56 tem 256 redes /64. Parece exagero para uma casa, mas o roteador do cliente pode precisar de mais de uma rede: Wi-Fi de visitantes, uma VLAN de câmeras, um segundo roteador em cascata. Entregar só um /64 trava tudo isso, porque SLAAC não funciona em rede menor que /64. Para clientes corporativos, o mesmo raciocínio leva a um /48. A RFC 6177 (BCP 157) recomenda entregar ao site do cliente mais do que um /64 e deixou de exigir um /48 para todo mundo; na prática, o /56 virou o tamanho comum para residência.

Configurando o IPv6 no PPPoE no Mikrotik RouterOS v7

Os passos abaixo partem de um concentrador PPPoE funcionando em IPv4, com o profile plano-100m, e só acrescentam o IPv6.

1. Pools de IPv6

/ipv6 pool
add name=pd-clientes prefix=2001:db8:100::/42 prefix-length=56
add name=wan-clientes prefix=2001:db8:1ff::/48 prefix-length=64

O prefix é o bloco inteiro do pool, e o prefix-length é o tamanho que cada cliente recebe. O pool pd-clientes corta o /42 em pedaços de /56. O pool wan-clientes corta o /48 em /64. Confira a conta antes: um /42 com entrega de /56 tem 214 = 16.384 prefixos.

2. Profile PPP com os dois pools

/ppp profile
set [find name=plano-100m] use-ipv6=yes \
    remote-ipv6-prefix-pool=wan-clientes \
    dhcpv6-pd-pool=pd-clientes

Linha a linha: use-ipv6=yes libera o IPv6CP na sessão. O remote-ipv6-prefix-pool tira um /64 do pool de WAN, anuncia para o cliente e instala a rota correspondente. O dhcpv6-pd-pool é o que faz o PPP criar o servidor DHCPv6 dinâmico que delega o /56. Se você escolheu o modelo sem /64 na WAN, o profile fica mais curto:

/ppp profile
set [find name=plano-100m] use-ipv6=yes dhcpv6-pd-pool=pd-clientes

O profile só vale para sessões novas. Quem já está conectado continua sem IPv6 até reconectar. Em base grande, programe a virada para uma madrugada ou deixe as sessões renovarem naturalmente.

3. DNS IPv6 anunciado por RA

/ipv6 nd
set [find interface=all] advertise-dns=yes \
    dns-servers=2001:db8::53,2001:db8::54

A entrada interface=all de /ipv6 nd já existe por padrão e cobre as interfaces PPPoE dinâmicas. Com advertise-dns=yes e dns-servers, os resolvedores IPv6 do provedor vão junto no RA. Sem isso, o cliente navega em IPv6, mas continua resolvendo nomes só pelo DNS IPv4.

Não bloqueie ICMPv6. No IPv6 roteador nenhum fragmenta pacote no caminho. Com a MTU de 1492 do PPPoE, o aviso de Packet Too Big precisa chegar ao servidor de origem. Filtro que derruba ICMPv6 indiscriminadamente gera site que abre pela metade.

Prefixo fixo por cliente com RADIUS

O pool dinâmico entrega o próximo /56 livre. Nada garante que o mesmo cliente receba o mesmo prefixo quando a sessão cair e voltar. Para cliente residencial isso costuma ser aceitável. Para cliente que publica serviço ou tem regra de firewall por prefixo, o prefixo precisa ser fixo, e o caminho é o RADIUS.

# /etc/freeradius/3.0/users
cliente0001 Cleartext-Password := "TroqueEstaSenha"
    Framed-IPv6-Prefix = "2001:db8:1ff:1::/64",
    Delegated-IPv6-Prefix = "2001:db8:100:100::/56"

O RouterOS aceita no Access-Accept o Delegated-IPv6-Prefix (o /56 da LAN) e o Framed-IPv6-Prefix (o /64 da WAN). Também aceita o Mikrotik-Delegated-IPv6-Pool, que escolhe o pool pelo RADIUS em vez de pelo profile, útil para separar planos residenciais e empresariais. Os prefixos fixos devem sair de uma faixa fora do pool dinâmico, para não haver conflito. No exemplo, o prefixo está dentro do pool só para simplificar a conta.

ONU Huawei: a outra ponta do IPv6 no PPPoE

Do lado do cliente, quem pede o /56 é o roteador. Em FTTH, quase sempre é a própria ONU em modo roteador, com a sessão PPPoE nela. Em ONU bridge, quem faz o pedido é o roteador do cliente, e o concentrador não precisa de nada diferente.

Nas ONUs Huawei, os parâmetros de IPv6 da WAN PPPoE ficam numa árvore própria do fabricante no modelo de dados TR-069, com prefixo X_HW_. O trecho abaixo é a parte de IPv6 de uma provision do GenieACS que roda em toda ONU, anonimizada. Ele liga o IPv6 na WAN e define a origem do prefixo da LAN como delegação. Se ainda não tem ACS, veja como montar GenieACS e TR-069 para ONU Huawei.

// provision "default" no GenieACS (ONU Huawei em modo roteador)
const now = Date.now();
const wan = "InternetGatewayDevice.WANDevice.*.WANConnectionDevice.*" +
  ".WANPPPConnection.*";
declare(wan + ".X_HW_IPv6Enable", {value: now}, {value: true});
declare(wan + ".X_HW_IPv6.IPv6Address.*", null, {path: 1});
declare(wan + ".X_HW_IPv6.IPv6Address.*", {path: now});
declare(wan + ".X_HW_IPv6.IPv6Prefix.*", null, {path: 1});
declare(wan + ".X_HW_IPv6.IPv6Prefix.*", {path: now});
declare(wan + ".X_HW_IPv6.IPv6Address.*.Origin", {value: 1},
  {value: "None"});
declare(wan + ".X_HW_IPv6.IPv6Prefix.*.Origin", {value: 1},
  {value: "PrefixDelegation"});
  • X_HW_IPv6Enable com true liga o IPv6 na conexão PPPoE da ONU. É o equivalente a marcar IPv4/IPv6 na tela de WAN.
  • Os pares de declare com {path: 1} e {path: now} garantem que os objetos IPv6Address e IPv6Prefix existam e sejam relidos.
  • IPv6Address.*.Origin = None: a WAN não pede endereço global. É o modelo de WAN só com link-local.
  • IPv6Prefix.*.Origin = PrefixDelegation: o prefixo da LAN vem do DHCPv6-PD do concentrador. A ONU pega o /56, usa um /64 na LAN e anuncia por RA para os aparelhos da casa.

Os nomes desses parâmetros variam entre modelos e firmwares. Antes de aplicar em massa, leia a árvore de uma ONU de cada modelo no ACS e teste numa única ONU, filtrando o preset pelo número de série.

Log da delegação: quem estava com qual prefixo

O log de conexão do PPPoE costuma registrar usuário, MAC e IPv4. Com IPv6 no PPPoE, falta a peça que liga o prefixo ao assinante. Se chegar um ofício com um endereço 2001:db8:100:100::1234 e um horário, você precisa achar quem tinha o /56 naquela hora. O Marco Civil da Internet exige guardar o registro de conexão por um ano.

O RouterOS não manda o prefixo delegado como variável para o script de subida da sessão. As variáveis disponíveis no On Up são user, local-address, remote-address, caller-id, called-id e interface. A saída é procurar o binding no servidor DHCPv6 da sessão, que tem o nome do usuário.

# campo On Up do profile (aba Scripts no Winbox)
:local u $user
:local mac $"caller-id"
:delay 20s
:local srv ("<pppoe-" . $u . ">")
:foreach b in=[/ipv6 dhcp-server binding find where server=$srv] do={
  :local pfx [/ipv6 dhcp-server binding get $b address]
  :log info ("PD " . $u . " " . $mac . " " . $pfx)
}

O :delay 20s existe porque o binding só aparece depois que a ONU pede o prefixo, o que acontece alguns segundos após a sessão subir. O script procura o servidor <pppoe-usuario>, lê o endereço de cada binding e grava uma linha começando com PD. Este script não foi testado em produção; trate como ponto de partida: teste em laboratório o tempo que a sua ONU leva para pedir o PD e ajuste o atraso.

/system logging action
add name=syslogpd target=remote remote-port=192.0.2.20:514 \
    remote-log-format=syslog syslog-facility=local6 \
    src-address=198.51.100.1
/system logging
add topics=script regex="^PD " action=syslogpd

A ação syslogpd manda para o servidor remoto, saindo pela loopback do concentrador. A regra de logging filtra o tópico script e, com regex, só as linhas de PD. Em versões mais antigas da v7, o destino era configurado em campos separados (remote e remote-port); confira o help da sua versão.

Testes do IPv6 no PPPoE: do concentrador ao cliente

No concentrador, confira a sessão, o servidor DHCPv6 dinâmico, o binding e a rota do prefixo:

/ppp active print where name=cliente0001
/ipv6 dhcp-server print
/ipv6 dhcp-server binding print
/ipv6 route print where dst-address=2001:db8:100:100::/56
/ipv6 pool used print

Uma saída resumida de exemplo do binding:

Flags: X - disabled, D - dynamic
 #   ADDRESS                 IAID  SERVER               STATUS
 0 D 2001:db8:100:100::/56    1  <pppoe-cliente0001>  bound
 1 D 2001:db8:100:200::/56    1  <pppoe-cliente0002>  bound

Cada sessão tem o próprio servidor, e o status bound indica que o cliente aceitou o prefixo. Se o servidor existe mas não há binding, o problema está do lado do cliente: a ONU não pediu PD. Se nem o servidor aparece, revise o dhcpv6-pd-pool do profile e o use-ipv6. O /ipv6 pool used print mostra quantos prefixos estão em uso, bom para acompanhar quando o pool vai acabar.

Num computador Linux atrás da ONU, o teste mostra se a LAN recebeu um /64 do prefixo delegado e se a rota padrão IPv6 existe:

ip -6 addr show
ip -6 route show default
ping -6 -c 4 2001:db8::53
traceroute -6 2001:db8::53

O endereço global do computador precisa começar com o /56 do binding, e o traceroute deve passar pelo concentrador. No celular, um teste de IPv6 pelo navegador confirma a mesma coisa sem terminal.

Erros comuns no IPv6 no PPPoE

  • Só o pool de WAN. A ONU recebe um /64 e a LAN fica sem IPv6. Falta o dhcpv6-pd-pool.
  • Pool que não agrega. Pools tirados de blocos espalhados viram dezenas de rotas no backbone. Tire tudo do bloco do POP.
  • Delegar /64. O cliente fica com uma única rede e qualquer roteador em cascata quebra.
  • Esquecer o DNS no RA. O IPv6 funciona, mas a resolução de nomes continua só em IPv4.
  • Filtrar ICMPv6 inteiro. Quebra a descoberta de MTU e alguns sites carregam pela metade.
  • Não registrar a delegação. Sem o log, o provedor não consegue identificar o assinante por um endereço IPv6.
  • Mudar o profile e esperar efeito imediato. Só sessões novas pegam o IPv6.

Perguntas frequentes

Qual tamanho de prefixo delegar para cliente residencial?

Um /56, que dá 256 redes /64 ao roteador do cliente. Para cliente corporativo, o mais comum é um /48. Evite delegar só um /64, porque ele não pode ser dividido sem quebrar o SLAAC.

Qual a diferença entre remote-ipv6-prefix-pool e dhcpv6-pd-pool no Mikrotik?

O remote-ipv6-prefix-pool entrega um /64 para a WAN da sessão por RA. O dhcpv6-pd-pool faz o PPP criar um servidor DHCPv6 dinâmico que delega o prefixo da LAN, como o /56. O segundo é obrigatório para a rede do cliente ter IPv6.

Preciso de RADIUS para ter IPv6 no PPPoE?

Não. Os pools no profile já funcionam com usuários locais ou RADIUS. O RADIUS entra quando você quer prefixo fixo por cliente, com os atributos Delegated-IPv6-Prefix e Framed-IPv6-Prefix.

O prefixo do cliente muda quando a sessão cai?

Com pool dinâmico, pode mudar. Para manter o mesmo /56, envie o prefixo pelo RADIUS a partir de uma faixa reservada fora do pool.

A ONU precisa estar em modo roteador para usar IPv6 no PPPoE?

Não. Em modo bridge, quem faz a sessão PPPoE e pede o prefixo é o roteador do cliente. Em modo roteador, a ONU faz isso e precisa estar com o IPv6 ligado na WAN e a origem do prefixo como delegação.

Conclusão

IPv6 no PPPoE bem feito tem três partes que não podem faltar: um plano que agrega por POP, o prefixo delegado para a LAN do cliente e o log que liga cada /56 a um assinante. O Mikrotik resolve a parte do concentrador com dois pools e duas opções no profile. Do lado da ONU Huawei, o TR-069 permite ligar o IPv6 em todo o parque sem visita técnica.

Comece por um POP, com um grupo pequeno de clientes, e acompanhe o volume de tráfego IPv6. Cada serviço grande que passa a responder por IPv6 é tráfego que deixa de ocupar a porta do CGNAT.

Leitura recomendada: Concentradores PPPoE com IPv6 e Gerando Log de IPv6 Delegation no Mikrotik, na wiki do Brasil Peering Forum (CC BY-NC 4.0).

Compartilhar:

Sobre o autor

Ivan Alves

Especialista em redes de provedores (ISP)

Ivan Alves trabalha há mais de 15 anos com redes de provedores de internet, do NOC ao backbone e à borda BGP. Coordena infraestrutura e tecnologia em um provedor regional e escreve aqui os tutoriais que gostaria de ter encontrado quando começou: comandos testados, cenário explicado e o porquê de cada linha.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *