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

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
- 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.
- No Mikrotik, crie os pools com
/ipv6 poole ligue no profile PPP comdhcpv6-pd-pool(prefixo da LAN) eremote-ipv6-prefix-pool(WAN). - Ative
use-ipv6=yesno profile e anuncie DNS IPv6 por RA em/ipv6 nd. - Na ONU em modo roteador, ligue o IPv6 na WAN PPPoE e configure o prefixo da LAN como PrefixDelegation.
- 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ível | Prefixo | Uso | Capacidade |
|---|---|---|---|
| Provedor | 2001:db8::/32 | Bloco recebido do registro | 256 blocos /40 |
| Infraestrutura | 2001:db8::/48 | Loopbacks, enlaces, DNS recursivo | 65.536 redes /64 |
| POP 1 | 2001:db8:100::/40 | Tudo o que sai deste concentrador | 65.536 clientes /56 |
| Pool de PD | 2001:db8:100::/42 | Prefixo da LAN dos clientes | 16.384 clientes /56 |
| Pool de WAN | 2001:db8:1ff::/48 | Um /64 por sessão PPPoE | 65.536 sessões |
| Cliente | 2001:db8:100:100::/56 | Rede de casa do cliente | 256 redes /64 |

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-clientesLinha 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::54A 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.
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_IPv6Enablecomtrueliga o IPv6 na conexão PPPoE da ONU. É o equivalente a marcar IPv4/IPv6 na tela de WAN.- Os pares de
declarecom{path: 1}e{path: now}garantem que os objetosIPv6AddresseIPv6Prefixexistam 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=syslogpdA 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).
