Предоставьте один путеводитель клиентам IPv4 и IPv6

LinuxBeginner
Практиковаться сейчас

Введение

У Riverlight Gathering уже есть работающий по IPv4 путеводитель по мероприятию. Посетителям нужен тот же полный путеводитель по IPv6, включая сведения о прибытии и программу для скачивания. Сетевые адреса подготовлены, но веб-служба пока не слушает IPv6, а запись AAAA путеводителя указывает на неверный адрес.

Вы разделите эти две проблемы: сначала обеспечите прямой доступ к приложению по IPv6, затем исправите имя. Вы сохраните IPv4, стойку приветствия, остальные записи DNS и все исходные байты страниц и загрузок. Предполагается базовое умение пользоваться терминалом, путями и вкладками и различать адреса, имена и порты; опыт администрирования Nginx и IPv6 не нужен. 70 минут — оценка автора.

Guide Server и Guide Client — изолированные сетевые узлы с общим ядром учебного экземпляра, а не отдельные виртуальные машины. Меняйте только директивы прослушивания в guide.conf и целевую AAAA/серийный номер SOA в guide.zone; сохраняйте загрузки в рабочей области клиента. Не меняйте маршруты, адреса, переключатели IPv6, другие сайты, исходные страницы и настройки платформы. Это подготовленная локальная сеть без публичного IPv6, RA, DHCPv6, туннелей и NAT64.

Сравните семейства адресов

На этом шаге вы прочитаете работающий путеводитель по IPv4 и отличите достижимый адрес IPv6 от приложения, принимающего подключения. Начните во вкладке Guide Client. Терминал открывается в /home/labex/project/ipv6-guide/client; его оболочка и каталог сохраняются независимо от Guide Server. pwd выводит текущий каталог:

pwd

Адреса IPv4 состоят из четырёх десятичных частей, например 10.77.0.10. IPv6 использует восемь групп шестнадцатеричных цифр. Начальные нули группы можно опускать; одно :: заменяет последовательность полностью нулевых групп. Здесь fd77:7::10 означает fd77:0007:0000:0000:0000:0000:0000:0010. Последняя часть 10 — шестнадцатеричная, в отличие от десятичной последней части IPv4. Эти частные учебные адреса не означают доступность из публичного Интернета.

curl получает ресурс HTTP. -4 принудительно выбирает IPv4, -f считает ответы с ошибками HTTP неудачей, -s скрывает индикатор выполнения, а -S оставляет сообщения об ошибках. --noproxy '*' обходит прокси для всех узлов; кавычки сохраняют буквальный *, не позволяя оболочке подставлять имена файлов. Порт 8080 выбирает приложение путеводителя. -o сохраняет полученные байты в файл; v4 — подготовленный каталог результатов:

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

При успешном сохранении обычно ничего не выводится. head -c 180 читает первые 180 байт, не меняя файл:

head -c 180 v4/index.html

Ожидается HTML с Riverlight Gathering. Это работающий образец, который нужно сохранить. Для полного вида страницы в браузере понадобится таблица стилей, которую вы сохраните позже.

Теперь проверьте подготовленный адрес IPv6. ping -6 отправляет эхо-запросы IPv6, а -c 1 завершает работу после одного запроса. Это проверка сетевой достижимости, а не HTTP:

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

Ожидается ответ. В URL буквальный адрес IPv6 заключают в квадратные скобки, чтобы отделить двоеточия адреса от разделителя порта. Весь URL заключите в кавычки. -6 принудительно выбирает IPv6, а --max-time 3 ограничивает запрос тремя секундами:

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

Этот запрос должен завершиться ошибкой curl: (7) и отказом в соединении. Адрес IPv6 существует и отвечает на эхо, но приложение ещё не открыло эту конечную точку IPv6. Тайм-аут означает, что полезный ответ не пришёл за отведённое время; это отличается от немедленного отказа. Не решайте ни одну из этих ситуаций отключением IPv6. Обычный браузер с двумя стеками может повторить запрос по IPv4, поэтому видимая страница не доказывает успех IPv6.

При опечатке в имени curl может сообщить ошибку 6: не удалось разрешить имя. Сравните написание и повторите первую команду. Опечатка в пути сохранения вызывает локальную ошибку записи; проверьте pwd и указанный путь v4/index.html. Это отличается от HTTP 404, когда доступный сервер сообщает об отсутствии запрошенного ресурса.

Настройте веб-службу на прослушивание IPv6

На этом шаге вы сохраните работающий слушатель IPv4 и добавите отдельный слушатель IPv6. Переключитесь на Guide Server. Начальный каталог — /home/labex/project/ipv6-guide/config. cat читает подготовленную таблицу конечных точек и короткую целевую конфигурацию:

cat endpoints.tsv
cat guide.conf

Путеводитель должен работать на 10.77.0.10 и fd77:7::10, порт 8080. Стойка приветствия использует порт 8081; сохраните её. server_name задаёт имя сайта, root указывает исходные страницы, а index выбирает домашнюю страницу. Фигурные скобки объединяют блок сервера; каждая директива заканчивается точкой с запятой.

ss читает сокеты ядра. -l выбирает слушающие сокеты, -t — TCP, -n — числовые адреса и порты, -p — процессы-владельцы:

ss -ltnp

Найдите Nginx на IPv4 10.77.0.10:8080; слушателя IPv6 путеводителя пока нет. Сокет IPv6 стойки :8081 не обслуживает порт путеводителя.

Вы замените весь короткий файл полным шаблоном. cat > guide.conf записывает в этот файл, заменяя прежнее содержимое. <<'NGINX' начинает here-document: оболочка буквально принимает все следующие строки до строки, содержащей только NGINX. Вставьте весь блок, включая завершающий маркер. Сначала cp создаёт локальную резервную копию; второе имя файла — имя копии:

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 открывает конечную точку приложения. Новый адрес в скобках — IPv6; ipv6only=on оставляет этот слушатель только для IPv6. Сохранённая строка IPv4 независимо обслуживает IPv4. Одна настройка адреса не создаёт слушающий сокет.

Подготовленная команда guide-control проверяет или загружает только независимую службу этого курса. web-check запускает проверку конфигурации Nginx без применения изменений:

guide-control web-check

Ожидаются syntax is ok и test is successful. Если вы ошиблись в точке с запятой, скобке или адресе, сообщение укажет файл и строку. Ничего ещё не применено. Повторите полный шаблон выше и проверьте снова. Чтобы вернуться к исходной работающей конфигурации IPv4, восстановите копию командой cp guide.conf.before guide.conf; проверьте файл перед загрузкой. Не перезапускайте Nginx или сеть платформы.

web-load снова проверяет конфигурацию и запрашивает перечитывание. Перечитывание применяет сохранённую конфигурацию, сохраняя главный процесс курса; одно сохранение файла не меняет службу:

guide-control web-load
ss -ltnp

Ожидаются 10.77.0.10:8080 и [fd77:7::10]:8080, принадлежащие Nginx. Если журнал сообщает о занятой конечной точке, сравните файл с полным шаблоном и изучите ss; не останавливайте постороннюю службу.

Переключитесь на Guide Client. -w выводит сведения о соединении после тела ответа. Формат в кавычках содержит \n для перевода строки; curl заменяет %{remote_ip} фактическим адресом удалённого узла, а %{http_code} — статусом ответа:

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

Ожидается HTML Riverlight, затем peer=fd77:7::10 status=200. Прочитайте содержимое вместе со статусом: посторонняя страница по умолчанию с 200 не подходит. Успешный прямой запрос позволяет отдельно проверить слой приложения; имя путеводителя вы пока не исправляли.

Направьте имя на работающую службу IPv6

На этом шаге вы исправите только целевую AAAA и позволите настоящему кэшу обновиться естественным образом. Начните в Guide Client. DNS, система доменных имён (Domain Name System), сопоставляет имена данным. Запись A предоставляет IPv4, AAAA — IPv6. Сам DNS-запрос может идти по IPv4 и при этом возвращать адрес IPv6.

dig запрашивает DNS. @10.77.0.2 выбирает подготовленный авторитетный сервер, обслуживающий эту зону. +noall +answer скрывает прочие разделы и показывает строки ответа:

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

Запись A верна: 10.77.0.10. Текущая AAAA содержит fd77:7::99, что не совпадает с работающей службой. Теперь запросите независимый кэширующий резолвер клиента на петлевом адресе 127.0.0.1:

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

Строка содержит имя, TTL, IN, тип записи и значение. TTL означает Time To Live: оставшееся число секунд, в течение которых можно повторно использовать кэшированный ответ. Подготовленная зона использует 30 секунд. Этот запрос может поместить старый адрес в кэш; это нормально.

Переключитесь на Guide Server и прочитайте зону целиком:

cat guide.zone

$TTL 30 задаёт срок жизни по умолчанию. @ означает корень этой зоны. Запись SOA (Start of Authority) содержит версию зоны, или серийный номер, первым числом в скобках. NS указывает авторитетный сервер зоны. Имена с точкой на конце полные; короткие имена, например guide, относительны к riverlight.test. Сохраните все записи, кроме AAAA путеводителя, и увеличьте серийный номер с 1 до 2 для этой правки. Серийный номер отмечает версию зоны, но не очищает уже существующие кэши клиентов.

Сделайте резервную копию, затем замените всю короткую зону уже изученным here-document. Одинарные кавычки вокруг ZONE также защищают $TTL от подстановки переменных оболочки:

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 запускает штатную проверку зоны BIND, не меняя работающий DNS:

guide-control dns-check

Ожидаются loaded serial 2 и OK; здесь loaded означает чтение файла проверяющей утилитой, а не изменение работающего авторитетного сервера. Если разбор не удался, прочитайте номер строки, повторите полный шаблон и проверьте снова. При необходимости cp guide.zone.before guide.zone восстановит исходный файл; она вернёт и старую неверную AAAA, поэтому это отправная точка восстановления, а не готовый ответ.

dns-load проверяет файл, затем через частный канал управления перечитывает только зону курса:

guide-control dns-load

Переключитесь на Guide Client. Запросите авторитетный сервер и кэш по отдельности:

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

Авторитетный сервер теперь должен возвращать fd77:7::10. Кэш может показывать старый адрес до истечения оставшегося TTL. sleep 31 ждёт 31 секунду, не меняя кэш:

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

Теперь ожидается верный адрес IPv6. Глобальная очистка кэша или изменение резолвера не нужны. Если авторитетный сервер всё ещё ошибается, вернитесь к сохранённой зоне и dns-load; если он прав, но кэш отличается, прочитайте TTL и повторите ограниченное ожидание. Удаление AAAA убрало бы доступ по имени через IPv6, а не исправило его.

Наконец, принудительно выполните запрос по имени через IPv6:

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

Ожидаются HTML Riverlight и peer=fd77:7::10 status=200. Если прямой IPv6 работает, а запрос по имени нет, проверяйте DNS, а не создавайте слушатель заново.

Прочитайте и скачайте полный путеводитель обоими способами

На этом шаге вы используете полный путеводитель через оба семейства адресов, сохранив защищённые стойку и записи. Начните в Guide Client. Одна правильная домашняя страница не доказывает, что ссылка на подробности, оформление и полная загрузка работают.

Сохраните все четыре исходных ресурса по настоящему имени путеводителя через IPv4. Подготовленная папка v4 содержит только скачанные вами байты; каждый путь -o задаёт файл сохранения соответствующего ресурса:

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

Повторите через IPv6, сохраняя отдельно, чтобы успешный результат не затёр свидетельства 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 сравнивает два файла побайтно. Отсутствие вывода и возврат к приглашению означают совпадение; сообщение о различии — несовпадение ресурсов. Сравните каждый ресурс, затем прочитайте полную программу:

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

Дочитайте до WET WEATHER и последнего примечания о вымышленном мероприятии. Существование или размер файла не доказывают, что полное расписание и сведения о доступности получены правильно. Если два неверных файла совпадают, один cmp тоже не подтверждает исходное содержимое; проверки сравнивают с подготовленными оригиналами и действующей службой.

Переключитесь на Saved Guide. Выберите Open IPv4 saved guide, прочитайте карточки программы, затем Make a day of it, чтобы прочитать сведения о прибытии и доступности. Нажмите Save the programme на той странице для скачивания программы. Кнопкой Back браузера вернитесь с подробной страницы на домашнюю, затем ещё раз Back — на страницу выбора просмотрщика. Выберите Open IPv6 saved guide и повторите переходы и скачивание. Оба варианта должны показывать один и тот же полный путеводитель Riverlight.

Полная сохранённая домашняя страница Riverlight с рабочими ссылками на подробности и программу

Прочитайте три карточки программы, используйте ссылки на посещение и скачивание; страница показывает ваш действительно сохранённый путеводитель.

Просмотрщик читает только файлы v4 и v6 из Guide Client и никогда не получает недостающий файл. Если отсутствует оформление или страница, вернитесь в Guide Client, повторите сохранение именно этого ресурса через нужное семейство и обновите браузер. Соединение браузера с просмотрщиком служит отображению; IPv6 подтверждают принудительный выбор семейства в запросах терминала и реальный удалённый адрес, а не URL просмотрщика.

Переключитесь на Guide Client. Сохраните доступность независимой стойки приветствия через оба семейства:

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

Оба запроса возвращают Welcome desk: open 10:00–20:00. Keep this site available. Проверьте сохранённые записи A и TXT:

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

Ожидаются 10.77.0.10 и "Welcome desk opens at 10:00". Если защищённое значение отличается, восстановите его из полного исходного шаблона, сохранив исправленную AAAA путеводителя, затем проверьте и перечитайте. Не копируйте исходные страницы, не добавляйте прокси, не заменяйте процесс службы и не меняйте адреса ради успешной проверки. Проверки наблюдают текущие службы и сохранённые результаты; обычные GET и DNS-запросы могут дописывать штатные журналы, но не применяют и не исправляют вашу работу.

Резюме

Вы расширили работающий путеводитель IPv4 настоящим слушателем IPv6, исправили AAAA и дали отдельному кэшу DNS обновиться естественно. Запросы с принудительным выбором семейства доставили те же исходные домашнюю страницу, страницу прибытия, таблицу стилей и полную программу. Вы сохранили IPv4, стойку приветствия, другие записи и подготовленную сеть. Достижимость, разрешение имён, прослушивание и правильное содержимое приложения — разные факты.