Блокування IPv6 заради захисту WireGuard ламає хост
Правило входу, що відкидає весь IPv6, прибирає й виявлення сусідів, і Packet Too Big. Розділіть три відповідальності, потім перевірте, що хост працює.
Мета розумна: до сервісів на цій машині повинні доходити лише користувачі тунелю. Рішення, до якого зазвичай вдаються, — ланцюг входу 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
Таблиця сусідів, що залишається повною після перезавантаження, — сигнал, що виявлення ще працює. Таблиця, що спорожніє й більше не заповнюється, — сигнал, що ви її відфільтрували. Третя команда перевіряє синтаксис набору правил, не застосовуючи його, і це варто зробити, поки сесія ще є.
Відновіть хост, з якого ви себе заперли
Перш ніж змінювати правила міжмережевого екрана, що несуть вашу власну адміністративну сесію, тримайте другий канал: консоль, послідовне з’єднання або запланований відкат, який прибирає нові правила, якщо ви його не скасуєте.
Якщо зміна все ж зачинить вас, відновлення йде через цей канал, а не через мережу, яку ви щойно прибрали. Відновіть попередній набір правил із збереженої копії, переконайтеся, що хост знову доступний, і лише потім застосовуйте задуману політику меншими частинами.
Підсумкова політика не універсальна. Адресація, маршрутизація й реалізація міжмережевого екрана — це вхідні дані розгортання, але межа всюди одна: відмовляйте в небажаному доступі застосунків, зберігаючи керівний трафік, що несе дозволений тунель.