Лабораторная: диагностика TCP/IP¶
В паре со статьёй: Сеть TCP/IP и набор команд ip
Окружение: две одноразовые VM в одной виртуальной сети (например, host-only сеть VirtualBox/libvirt), чтобы иметь контролируемое, изолированное соединение между ними.
Начальные условия¶
- Две VM,
host-aиhost-b, в одной подсети, подтверждена доступность друг от друга черезpingдо внесения какой-либо неисправности. - Доступ root/sudo на обеих.
Инструкции¶
Часть 1 — Сломайте намеренно¶
На host-b внесите одну из следующих неисправностей:
- Неверный маршрут:
sudo ip route del default(полностью удаляет маршрут по умолчанию —host-bвсё ещё может достучаться доhost-aнапрямую в той же подсети, но ничего за её пределами). - Неверный адрес: смените собственный IP
host-bна адрес из другой подсети, отличной от подсетиhost-a, без соответствующего обновления маршрута:sudo ip addr add 192.0.2.99/24 dev eth0(пока оставьте оригинальный адрес на месте, не удаляйте его).
Часть 2 — Диагностируйте с host-a¶
Используя только послойный подход из статьи (ip link, ip addr, ip route get, ping), определите с host-a, доступен ли host-b вообще, и если нет — на каком уровне происходит сбой.
Ожидаемые результаты¶
- Неисправность отсутствующего маршрута по умолчанию: пинг с
host-aнапрямую наhost-bв общей подсети всё ещё успешен (маршрут по умолчанию не нужен для трафика в пределах одной подсети) — неисправность проявится только еслиhost-bпонадобится достучаться до чего-то за пределами локальной подсети, что вообще не покажет тест пингом в той же подсети. Это сама по себе и есть урок: убедитесь, что вы тестируете реальное условие сбоя, а не просто «хост на связи». - Неисправность адреса в другой подсети: зависит от того, на какой адрес целится
host-a. Еслиhost-aцелится в оригинальный (всё ещё присутствующий) адрес, всё работает — снова демонстрируя, что добавление неверного адреса не удаляет правильный. Если целиться в новый адрес 192.0.2.99, и уhost-aнет маршрута в эту подсеть, пинг провалится с «Network is unreachable», сообщённым локально наhost-aещё до отправки какого-либо пакета — отдельный тип сбоя, отличный от таймаута (таймаут означает, что пакеты были отправлены, но ответа не пришло; «Network is unreachable» означает, что локальное ядро вообще не пыталось отправить, поскольку у него нет маршрута).
Чек-лист диагностики¶
- [ ] Различили ли вы «Network is unreachable» (нет локального маршрута) и тихий таймаут (пакеты отправлены, ответа нет)? Это указывает на разные проблемы — одна локальная, другая может быть где угодно на маршруте или на самом адресате.
- [ ] Использовали ли вы
ip route get <target-ip>наhost-aперед пингом, чтобы спрогнозировать, считает ли ядро, что у него вообще есть путь? - [ ] Для неисправности отсутствующего маршрута по умолчанию: правильно ли вы определили, что связность в пределах одной подсети не затронута, и объяснили почему (маршрут по умолчанию не нужен в пределах одной подсети)?
Критерии успеха¶
Вы можете, находясь только на host-a (без входа на host-b для проверки его конфигурации напрямую), определить, является ли описанный сбой связности проблемой маршрутизации на удалённой стороне, несовпадением адресации, или чем-то иным — используя только ip route get, ping и рассуждение о сообщениях об ошибках, которые каждый из них выдаёт.
Очистка / откат¶
# На host-b восстановите маршрут по умолчанию (подставьте реальный IP шлюза вашей лабораторной сети):
sudo ip route add default via <gateway-ip> dev eth0
# Удалите дополнительный адрес, если добавляли:
sudo ip addr del 192.0.2.99/24 dev eth0
Убедитесь, что ping с host-b до чего-то за пределами локальной подсети (например, шлюза лаборатории, или интернета, если лабораторная сеть имеет доступ) снова проходит, прежде чем считать окружение восстановленным.