Цель разумна: до сервисов на этой машине должны доходить только пользователи туннеля. Решение, к которому обычно прибегают, — цепочка входа IPv6, отбрасывающая всё, кроме WireGuard, а вместе с этим и трафик, который удерживает хост на его собственном канале. Обнаружение соседей и сообщения обслуживания пути — это не доступ к сервисам, и их удаление даёт машину, недоступную по причинам, не связанным с вашей политикой. Туннель поднимается, сервисы правильно ограничены, а на канале больше ничего не работает.

Три ответственности, один набор правил

Первая ответственность — работа внешней сети: хост должен оставаться на своём канале, разрешать соседей и знать границы пути этого канала. Вторая — шифрованный слушатель, принимающий UDP на выбранном вами адресе и порту. Третья — набор расшифрованных сервисов, до которых должны доходить пользователи туннеля.

Это три разные политики, и только вторая и третья относятся к VPN. Набор правил, который считает их одной, наследует режим отказа, в котором ужесточение границы приложения молча ломает подключение хоста.

Держите их в отдельных цепочках или хотя бы в отдельных комментариях, чтобы следующий человек видел, какая строка для чего нужна.

Что ICMPv6 делает для хоста

IPv6 полагается на ICMPv6 гораздо больше, чем для эха. Запрос и объявление соседа заменяют ARP и нужны для локальной доставки. Packet Too Big несёт сведения о MTU пути, и их игнорирование даёт передачи, которые застревают на больших пакетах. Объявления маршрутизатора несут маршрут по умолчанию и сведения о префиксе, когда канал использует автоматическую настройку.

RFC 4890 отделяет сообщения, которые фильтр хоста обязан пропускать, от тех, что являются административным выбором, и делает это в разделе для хоста, отличном от правил для маршрутизатора, пересылающего между сетями. Чтение только раздела пересылки даёт политику входа, слишком строгую для защищаемого хоста.

Практическое правило: разрешать существенные сообщения об ошибках и настройке на том интерфейсе, которому они нужны, ограничивая их по типу и источнику там, где платформа это позволяет, и явно решать судьбу остальных.

Заменить всё это общим разрешением ICMPv6 — решить проблему доступности и отказаться от фильтрации. Заменить общим отбрасыванием — решить проблему фильтрации и отказаться от хоста.

Сначала пропустите туннель, затем сервис

Принимайте транспорт WireGuard на заданном внешнем адресе и UDP-порту, а обратный трафик — через отслеживание соединений. Затем разрешите сервисам приложений проходить через интерфейс туннеля из тех источников, которые вы действительно авторизуете.

Разрешение для внешнего UDP-порта не даёт прав расшифрованным запросам внутри него. Именно это различие и есть причина, по которой интерфейс туннеля появляется в правилах сервисов.

Читайте набор правил таким, какой он есть, а не таким, каким его описывает файл:

sudo nft list ruleset
ip -6 addr show
ip -6 route show default

Слушатель на физическом адресе — это отдельная экспозиция того же сервиса на адресе туннеля. Если машина ещё и пересылает трафик на другую, это решение цепочки пересылки, а не эта политика входа, и оно требует собственного обоснования.

Проверяйте канал, а не только туннель

Работающий после изменения туннель доказывает меньше, чем кажется, потому что существующая запись соседа и установленное соединение могут скрыть управляющее сообщение, которое политика теперь отбрасывает.

Проверьте подключение напрямую, а затем проверьте, что исключённый путь по-прежнему не работает:

ip -6 neigh show
ping -6 -c 3 2001:db8:1::1
sudo nft -c -f /etc/nftables.conf

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

Восстановите хост, из которого вы себя заперли

Прежде чем менять правила межсетевого экрана, несущие вашу собственную административную сессию, держите второй канал: консоль, последовательное соединение или запланированный откат, который убирает новые правила, если вы его не отмените.

Если изменение всё же заперло вас, восстановление идёт через этот канал, а не через сеть, которую вы только что убрали. Восстановите предыдущий набор правил из сохранённой копии, убедитесь, что хост снова доступен, и только затем применяйте задуманную политику небольшими частями.

Итоговая политика не универсальна. Адресация, маршрутизация и реализация межсетевого экрана — это входные данные развёртывания, но граница везде одна: отказывайте в нежелательном доступе приложений, сохраняя управляющий трафик, который несёт разрешённый туннель.

Похожие статьи