Acesso via IPv6 Link-Local
Descrição do problema.
As vezes passamos por situações que nos levam ao desespero. Um exemplo que se passou comigo hoje: estava atualizando um equipamento e ao mexer em suas regras de Firewall, acabei cometendo um erro clássico de desabilitar as regras mas deixando um drop all por padrão. Não preciso dizer que nesse momento minha conexão remota caiu, eu estava à uns 40Km de distância do equipamento e em pleno domingão chuvoso. Na hora paralisei e bateu aquele desespero pois haviam mais de 1000 assinantes conectados nesse B-RAS PPPoE. Já ia me arrumar para pegar a estrada quando pensei: Ora eu só errei nas regras de INPUT. Em sistemas que usam kernel Linux, costuma-se usar o Netfilter/IPTables e os filtros na chain INPUT só afetam pacotes direcionados com destino a caixa. Nesse caso o FORWARD estava OK e os clientes acessando normalmente. Agora sim posso com calma e sem desespero, pensar em uma forma de acessar a caixa remotamente. Mas como se havia um drop all na chain INPUT?
Luz no fim do túnel.
Como nossos B-RAS são configurados com um certo padrão, entrei em outra caixa para verificar as regras e lembrei do nosso amado IPv6 e que também existe um Firewall independente do IPv4. Ao contrário de muitos, nós aqui colocamos regras em IPv6 também porque ataques e tentativas de acesso podem vir de qualquer lugar. Mas nas regras de INPUT do IPv6 eu libero icmpv6 e o link-local (fe80::/10).
Me senti no filme Vingadores onde o Dr. Estranho disse que haviam 14 milhões de finais dando errado e apenas 1 que resolveria meu problema.
O que seria esse tal Link-Local?
O Link-Local é um endereçamento Unicast e podendo ser usado apenas no enlace específico onde a interface está conectada, o endereço link local é atribuído automaticamente utilizando o prefixo FE80::/64. Os 64 bits reservados para a identificação da interface são configurados utilizando o formato IEEE EUI-64. Vale ressaltar que os roteadores não devem encaminhar para outros enlaces, pacotes que possuam como origem ou destino um endereço link-local. Descrição retirada do site ipv6.br. Ou seja, bastaria eu conseguir um equipamento na mesma rede física com IPv6 habilitado, para conseguir comunicação na rede fe80::/64 com o equipamento bloqueado.
O texto abaixo sobre como é formado o endereço de Link-Local pode ser lido na íntegra aqui.
Por curiosidade é assim que é montado o Link-Local de uma interface:
- Pegue o endereço MAC desejado, por exemplo, 52:74:f2:b1:a8:7f
- Coloque FF:FE no meio dele: 52:74:f2:FF:FE:b1:a8:7f
- Reformate para o padrão do IPv6 com 4 algarismos em Hexa por campo do endereço: 5274:f2ff:feb1:a87f
- Converta o primeiro octeto para binário (Dica: cada algarismo tem 4 bits, pegue os dois primeiros algarismos do IPv6 incompleto): 52 -> 01010010
- Inverta o sétimo Bit (da esquerda para direita ->): 01010010 -> 01010000
- Converta para hexadecimal: 01010000 -> 50
- Troque o primeiro octeto recalculado (de 52 para 50): 5074:f2ff:feb1:a87f
- Insira o prefixo do link-local mais dois “dois pontos” (FE80::): FE80::5074:f2ff:feb1:a87f
Resumindo o endereço de Link Local EUI-64 é formado por: FE80 (prefixo) + Sequência de zeros + Seis primeiros algarismos Hexa do MAC com sétimo bit invertido + FF:FE + Seis últimos algarismos Hexa do endereço MAC.
Está feito! Agora você tem o endereço do link local padrão EUI-64 da sua placa de rede.
Veja exemplo gráfico abaixo com o MAC 00:12:7F:EB:6B:40.
Portanto o endereço IPv6 de link local do segundo exemplo será FE80::0212:7fff:feeb:6b40.
Como descobrir o Link-Local do equipamento que você quer acessar?
Bem, se você souber o mac address da interface do equipamento bloqueado, basta fazer como mostrado acima que vai descobrir qual o endereço fe80 designado pra interface que você quer acessar. Agora se não souber qual o mac address, vai ter que ser um à um mesmo. Sorry.
Existem ferramentas para fazer isso automaticamente. Aqui você encontra uma ferramenta online que converte mac address para fe80.
Os exemplos que vou citar abaixo são referentes à um sistema GNU/Linux que eu tive acesso para resolver meu problema. Esse sistema estava na mesma rede física que o equipamento o qual perdi o acesso. Pode ser que você necessite consultar seus manuais técnicos, caso seja um sistema diferente. Abaixo estou consultando o NDP (Neighbor Discovery Protocol) filtrando pela interface enp3s0f0 do meu equipamento e ainda filtrando o que for fe80:
# ip -6 neighbor|grep enp3s0f0|grep fe80
fe80::a236:9fff:fe37:8268 dev enp3s0f0 lladdr a0:36:9f:37:82:68 router REACHABLE
fe80::d6ca:6dff:fe7b:720f dev enp3s0f0 lladdr d4:ca:6d:7b:72:0f router REACHABLE
fe80::d6ca:6dff:fe79:de4b dev enp3s0f0 lladdr d4:ca:6d:79:de:4b router STALE
No meu exemplo acima tenho 3 possibilidades para tentar o acesso. Bem pouco e rápido de se testar.
Fazendo o acesso e finalmente resolvendo meu problema.
Os endereços de Link-Local não são acessados da mesma forma que os endereços globais unicast. No GNU/Linux o endereço fe80 precisa conter o %<interface> que é a interface do enlace que vai acessar. Abaixo os exemplos de ping e acesso ssh que foram executados:
# ping -c 5 fe80::a236:9fff:fe37:8268%enp3s0f0
PING fe80::a236:9fff:fe37:8268%enp3s0f0(fe80::a236:9fff:fe37:8268%enp3s0f0) 56 data bytes
64 bytes from fe80::a236:9fff:fe37:8268%enp3s0f0: icmp_seq=1 ttl=255 time=0.173 ms
64 bytes from fe80::a236:9fff:fe37:8268%enp3s0f0: icmp_seq=2 ttl=255 time=0.306 ms
64 bytes from fe80::a236:9fff:fe37:8268%enp3s0f0: icmp_seq=3 ttl=255 time=0.052 ms
64 bytes from fe80::a236:9fff:fe37:8268%enp3s0f0: icmp_seq=4 ttl=255 time=0.247 ms
64 bytes from fe80::a236:9fff:fe37:8268%enp3s0f0: icmp_seq=5 ttl=255 time=0.211 ms
--- fe80::a236:9fff:fe37:8268%enp3s0f0 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4087ms
rtt min/avg/max/mdev = 0.052/0.197/0.306/0.086 ms
# ssh admin@fe80::a236:9fff:fe37:8268%enp3s0f0
admin@fe80::a236:9fff:fe37:8268%enp3s0f0's password:
Dessa forma consegui resolver o problema da caixa bloqueada e continuei com meu domingo calmo e tranquilo. Aproveitei para escrever esse artigo e poder ajudar mais alguém que tenha sofrido deste mal.
Autor: Marcelo Gondim