Sirva o mesmo guia para clientes IPv4 e IPv6

LinuxBeginner
Pratique Agora

Introdução

O Riverlight Gathering já tem um guia do evento funcionando por IPv4. Os visitantes precisam do mesmo guia completo por IPv6, incluindo informações de chegada e o programa para download. Os endereços de rede estão preparados, mas o serviço web ainda não escuta em IPv6 e o registro AAAA do guia aponta para o endereço errado.

Você separará os dois problemas: primeiro fará o acesso direto à aplicação por IPv6 funcionar; depois corrigirá o nome. Preservará IPv4, a recepção, os outros registros DNS e todos os bytes originais das páginas e dos downloads. Os pré-requisitos são o uso básico do terminal, de caminhos e de abas, além de reconhecer endereços, nomes e portas; não é necessário administrar Nginx ou IPv6 previamente. A duração de 70 minutos é uma estimativa do autor.

Guide Server e Guide Client são nós de rede isolados que compartilham o kernel desta instância de treinamento. Não são VMs separadas. Altere somente as diretivas de escuta em guide.conf e o AAAA de destino/número de série SOA em guide.zone; salve os downloads na área de trabalho do cliente. Não altere rotas, endereços, opções de ativação do IPv6, outros sites, páginas de origem nem configurações da plataforma. Esta é uma rede local preparada, sem IPv6 público, RA, DHCPv6, túneis ou NAT64.

Compare as famílias de endereços

Nesta etapa, você lerá o guia IPv4 que funciona e distinguirá um endereço IPv6 alcançável de uma aplicação que escuta conexões. Comece em Guide Client. Este terminal inicia em /home/labex/project/ipv6-guide/client; seu shell e diretório persistem independentemente de Guide Server. pwd mostra o diretório atual:

pwd

Os endereços IPv4 usam quatro partes decimais, como 10.77.0.10. IPv6 usa oito grupos de dígitos hexadecimais. Zeros à esquerda de um grupo podem ser omitidos; um único :: substitui uma sequência de grupos inteiramente zerados. Aqui, fd77:7::10 significa fd77:0007:0000:0000:0000:0000:0000:0010. Seu 10 final é hexadecimal, diferente da parte decimal final do IPv4. Esses endereços privados de treinamento não implicam acesso pela Internet pública.

curl obtém um recurso HTTP. -4 força IPv4, -f trata respostas de erro HTTP como falhas, -s oculta o progresso e -S continua mostrando os erros. --noproxy '*' ignora proxies para todos os hosts; as aspas mantêm * literal, sem expansão de nomes de arquivos. A porta 8080 seleciona a aplicação do guia. -o salva os bytes recebidos em um arquivo; v4 é um diretório de saída preparado:

curl --noproxy '*' -4 -fsS http://guide.riverlight.test:8080/index.html -o v4/index.html

Um salvamento bem-sucedido normalmente não imprime nada. head -c 180 lê os primeiros 180 bytes sem alterar o arquivo:

head -c 180 v4/index.html

Espere HTML contendo Riverlight Gathering. Essa é a referência funcional que você preservará. A aparência completa da página no navegador exige a folha de estilos, que você salvará depois.

Agora teste o endereço IPv6 preparado. ping -6 envia solicitações de eco IPv6; -c 1 encerra após uma. Isso testa a conectividade de rede, não HTTP:

ping -6 -c 1 fd77:7::10

Espere uma resposta. Para um IPv6 literal em uma URL, colchetes separam os dois-pontos do endereço do separador da porta. Coloque toda a URL entre aspas. -6 força IPv6; --max-time 3 limita a solicitação a três segundos:

curl --noproxy '*' -6 -fsS --max-time 3 'http://[fd77:7::10]:8080/'

Esta solicitação deve falhar com curl: (7) e conexão recusada. O endereço IPv6 existe e responde ao eco, mas a aplicação não abriu esse endpoint IPv6. Um tempo limite, por outro lado, significa que nenhuma resposta útil chegou dentro do prazo; é diferente de uma recusa imediata. Não resolva nenhum dos casos desativando IPv6. Um navegador comum com pilha dupla pode tentar novamente por IPv4, portanto ver uma página nele não provaria sucesso por IPv6.

Se houver erro de digitação no nome, curl pode informar erro 6, indicando falha na resolução. Compare a grafia e repita o primeiro comando. Um erro no caminho de salvamento produz um erro de gravação local; confira pwd e o caminho indicado v4/index.html. Esses erros diferem de HTTP 404, no qual um servidor alcançável informa que o recurso solicitado não existe.

Faça o serviço web escutar em IPv6

Nesta etapa, você manterá o listener IPv4 funcional e adicionará um listener IPv6 separado. Mude para Guide Server. Ele começa em /home/labex/project/ipv6-guide/config. cat lê a tabela de endpoints preparada e a configuração curta de destino:

cat endpoints.tsv
cat guide.conf

O guia deve usar 10.77.0.10 e fd77:7::10, na porta 8080. A recepção usa a porta 8081; preserve-a. server_name escolhe o nome deste site, root localiza suas páginas originais e index seleciona a página inicial. Chaves agrupam um servidor; cada diretiva termina com ponto e vírgula.

ss lê os sockets do kernel. -l seleciona os que estão escutando, -t seleciona TCP, -n exibe endereços e portas numéricos e -p mostra os processos proprietários:

ss -ltnp

Encontre Nginx no IPv4 10.77.0.10:8080; ainda não há listener IPv6 para o guia. O socket IPv6 :8081 da recepção não atende à porta do guia.

Você substituirá o arquivo curto inteiro por um modelo completo. cat > guide.conf grava nesse arquivo, substituindo o conteúdo anterior. <<'NGINX' inicia um here-document: o shell recebe literalmente todas as linhas seguintes até a linha que contém apenas NGINX. Cole o bloco inteiro, incluindo esse marcador final. Antes, cp salva uma cópia local de segurança; o segundo nome de arquivo é o da cópia:

cp guide.conf guide.conf.before
cat > guide.conf <<'NGINX'
server {
    listen 10.77.0.10:8080;
    listen [fd77:7::10]:8080 ipv6only=on;
    server_name guide.riverlight.test;
    root /opt/labex/ipv6-guide/www;
    index index.html;
    error_page 404 /404.html;
}
NGINX

listen abre um endpoint da aplicação. O novo endereço entre colchetes é IPv6; ipv6only=on mantém esse listener exclusivo para IPv6. A linha IPv4 preservada atende IPv4 de forma independente. Configurar apenas o endereço nunca criaria esse socket de escuta.

O comando preparado guide-control verifica ou carrega somente o serviço independente deste curso. web-check executa o teste de configuração do Nginx sem aplicar as alterações:

guide-control web-check

Espere syntax is ok e test is successful. Se houver erro em um ponto e vírgula, chave ou endereço, a mensagem indicará o arquivo e a linha. Nada foi aplicado. Repita o modelo completo acima e verifique novamente. Para voltar à configuração IPv4 original funcional, cp guide.conf.before guide.conf restaura sua cópia; verifique o arquivo antes de carregá-lo. Não reinicie o Nginx ou a rede da plataforma.

web-load testa novamente e solicita uma recarga. A recarga preserva o processo mestre do curso enquanto aplica a configuração salva; apenas salvar um arquivo não altera o serviço:

guide-control web-load
ss -ltnp

Espere tanto 10.77.0.10:8080 quanto [fd77:7::10]:8080 pertencendo ao Nginx. Se o log informar um endpoint ocupado, compare este arquivo com o modelo completo e examine ss; não pare um serviço não relacionado.

Mude para Guide Client. -w imprime fatos da conexão após o corpo. O formato entre aspas contém \n para uma nova linha; curl substitui %{remote_ip} pelo endereço real do par e %{http_code} pelo status da resposta:

curl --noproxy '*' -6 -fsS --max-time 3 -w '\npeer=%{remote_ip} status=%{http_code}\n' 'http://[fd77:7::10]:8080/'

Espere o HTML do Riverlight e depois peer=fd77:7::10 status=200. Leia o conteúdo além do status: uma página padrão não relacionada com 200 estaria errada. Essa solicitação direta bem-sucedida isola a camada da aplicação; você ainda não corrigiu o nome do guia.

Aponte o nome para o serviço IPv6 funcional

Nesta etapa, você corrigirá somente o AAAA de destino e permitirá que um cache real se atualize naturalmente. Comece em Guide Client. DNS, Domain Name System, associa nomes a dados. Um registro A fornece IPv4; AAAA fornece IPv6. A própria consulta DNS pode trafegar por IPv4 e ainda assim retornar um endereço IPv6.

dig consulta o DNS. @10.77.0.2 seleciona o servidor autoritativo preparado, responsável por esta zona. +noall +answer oculta as outras seções e mostra as linhas da resposta:

dig @10.77.0.2 guide.riverlight.test A +noall +answer
dig @10.77.0.2 guide.riverlight.test AAAA +noall +answer

O registro A está correto em 10.77.0.10. O AAAA atual indica fd77:7::99, que não corresponde ao serviço funcional. Consulte agora o resolvedor de cache independente do cliente no loopback 127.0.0.1:

dig @127.0.0.1 guide.riverlight.test AAAA +noall +answer

Uma linha contém nome, TTL, IN, tipo de registro e valor. TTL significa Time To Live: os segundos restantes em que uma resposta em cache pode ser reutilizada. A zona preparada usa 30 segundos. Esta consulta pode armazenar o endereço antigo no cache, o que é normal.

Mude para Guide Server e leia a zona completa:

cat guide.zone

$TTL 30 define o tempo de vida padrão. @ representa a raiz desta zona. O registro SOA (Start of Authority) contém a versão da zona, ou número de série, como o primeiro número entre parênteses. NS identifica a autoridade da zona. Nomes terminados com ponto são completos; nomes curtos como guide são relativos a riverlight.test. Preserve todos os registros exceto o AAAA do guia e incremente o número de série de 1 para 2 nesta revisão. O número de série registra uma versão da zona; não limpa os caches existentes dos clientes.

Faça uma cópia de segurança e use o padrão de here-document já ensinado para substituir toda a zona curta. As aspas simples ao redor de ZONE também protegem $TTL contra a expansão de variáveis do shell:

cp guide.zone guide.zone.before
cat > guide.zone <<'ZONE'
$TTL 30
@ IN SOA ns.riverlight.test. admin.riverlight.test. (2 60 30 3600 30)
@ IN NS ns.riverlight.test.
ns IN A 10.77.0.2
guide IN A 10.77.0.10
guide IN AAAA fd77:7::10
desk IN A 10.77.0.10
desk IN AAAA fd77:7::10
contact IN TXT "Welcome desk opens at 10:00"
ZONE

dns-check executa o validador nativo de zonas BIND. Ele não altera o DNS em execução:

guide-control dns-check

Espere loaded serial 2 e OK; aqui, loaded descreve a leitura do arquivo pelo validador, não uma alteração da autoridade em execução. Se a análise falhar, leia o número da linha, repita o modelo completo e verifique novamente. cp guide.zone.before guide.zone restaura o arquivo original se necessário; também restaura o antigo AAAA incorreto, portanto é um ponto de partida para recuperação, não a resposta final.

dns-load verifica e usa um canal privado de controle para recarregar somente a zona deste curso:

guide-control dns-load

Mude para Guide Client. Consulte autoridade e cache separadamente:

dig @10.77.0.2 guide.riverlight.test AAAA +noall +answer
dig @127.0.0.1 guide.riverlight.test AAAA +noall +answer

A autoridade deve agora retornar fd77:7::10. O cache ainda pode mostrar o endereço antigo até o TTL restante expirar. sleep 31 espera 31 segundos sem alterar nenhum cache:

sleep 31
dig @127.0.0.1 guide.riverlight.test AAAA +noall +answer

Agora espere o endereço IPv6 correto. Não é necessário limpar o cache global nem editar o resolvedor. Se a autoridade ainda estiver errada, volte à zona salva e a dns-load; se estiver correta, mas o cache diferir, leia o TTL e repita a espera limitada. Excluir o AAAA removeria o acesso IPv6 por nome em vez de repará-lo.

Por fim, force uma solicitação por nome usando IPv6:

curl --noproxy '*' -6 -fsS --max-time 3 -w '\npeer=%{remote_ip} status=%{http_code}\n' http://guide.riverlight.test:8080/

Espere HTML do Riverlight e peer=fd77:7::10 status=200. Sucesso IPv6 direto seguido de falha por nome indica que você deve examinar DNS em vez de reconstruir o listener.

Leia e baixe o guia completo pelos dois caminhos

Nesta etapa, você usará o guia completo pelas duas famílias e manterá a recepção e os registros protegidos. Comece em Guide Client. Uma página inicial correta, sozinha, não prova que o link de detalhes, o estilo ou o download completo funcionam.

Salve os quatro recursos originais pelo nome real do guia usando IPv4. A pasta preparada v4 contém somente os bytes que você baixou; cada caminho -o indica o arquivo salvo daquele recurso:

curl --noproxy '*' -4 -fsS http://guide.riverlight.test:8080/index.html -o v4/index.html
curl --noproxy '*' -4 -fsS http://guide.riverlight.test:8080/visit.html -o v4/visit.html
curl --noproxy '*' -4 -fsS http://guide.riverlight.test:8080/style.css -o v4/style.css
curl --noproxy '*' -4 -fsS http://guide.riverlight.test:8080/programme.txt -o v4/programme.txt

Repita por IPv6, salvando separadamente para que o sucesso não sobrescreva a evidência IPv4:

curl --noproxy '*' -6 -fsS http://guide.riverlight.test:8080/index.html -o v6/index.html
curl --noproxy '*' -6 -fsS http://guide.riverlight.test:8080/visit.html -o v6/visit.html
curl --noproxy '*' -6 -fsS http://guide.riverlight.test:8080/style.css -o v6/style.css
curl --noproxy '*' -6 -fsS http://guide.riverlight.test:8080/programme.txt -o v6/programme.txt

cmp compara dois arquivos byte a byte. Nenhuma saída e o retorno ao prompt significam igualdade; uma diferença informada significa que os recursos divergem. Compare cada recurso e depois leia o programa completo:

cmp v4/index.html v6/index.html
cmp v4/visit.html v6/visit.html
cmp v4/style.css v6/style.css
cmp v4/programme.txt v6/programme.txt
cat v6/programme.txt

Leia até WET WEATHER e a nota final sobre o evento fictício. A existência ou o tamanho de um arquivo não provam que toda a programação e as informações de acessibilidade chegaram corretamente. Se dois arquivos errados coincidirem, cmp sozinho também não comprova o conteúdo original; as verificações comparam com os originais preparados e o serviço real.

Mude para Saved Guide. Selecione Open IPv4 saved guide, leia os cartões da programação e selecione Make a day of it para ler as informações de chegada e acessibilidade. Selecione Save the programme nessa página para baixar o programa. Use o botão Back do navegador para voltar dos detalhes à página inicial e depois Back novamente para a página de seleção do visualizador. Selecione Open IPv6 saved guide e repita os mesmos links e o download. Ambos devem ser o mesmo guia completo do Riverlight.

Página inicial completa do Riverlight salva, com links funcionais para os detalhes e o programa

Leia os três cartões da programação e use os links de visita e download; esta página é o guia que você realmente salvou.

O visualizador lê somente os arquivos v4 e v6 do Guide Client. Nunca busca um arquivo ausente. Se faltar estilo ou uma página, volte para Guide Client, repita o salvamento daquele recurso pela família exata e recarregue a página do navegador. A conexão entre navegador e visualizador é um caminho de apresentação; as solicitações com família forçada no terminal e o endereço real do par comprovam IPv6, não a URL do visualizador.

Mude para Guide Client. Mantenha a recepção independente disponível pelas duas famílias:

curl --noproxy '*' -4 -fsS http://desk.riverlight.test:8081/
curl --noproxy '*' -6 -fsS http://desk.riverlight.test:8081/

Ambas retornam Welcome desk: open 10:00–20:00. Keep this site available. Verifique os registros A e TXT preservados:

dig @10.77.0.2 guide.riverlight.test A +short
dig @10.77.0.2 contact.riverlight.test TXT +short

Espere 10.77.0.10 e "Welcome desk opens at 10:00". Se um valor protegido diferir, restaure-o a partir do modelo original completo, mantendo o AAAA corrigido do guia, valide e recarregue. Não copie páginas de origem, adicione proxy, substitua um processo de serviço nem altere endereços para fazer uma verificação passar. As verificações observam os serviços atuais e os resultados salvos; consultas GET e DNS comuns podem acrescentar logs nativos, mas não carregam nem reparam seu trabalho.

Resumo

Você ampliou um guia IPv4 funcional com um listener IPv6 real, corrigiu seu AAAA e permitiu que um cache DNS separado se atualizasse naturalmente. Solicitações com família forçada entregaram a mesma página inicial, página de chegada, folha de estilos e programa completo originais. Você preservou IPv4, a recepção, outros registros e a rede preparada. Conectividade, resolução de nomes, escuta e conteúdo correto da aplicação são fatos distintos.