Групи пірів WireGuard на концентраторі: володіння джерелом і політика
Тримайте групи пірів окремо з вузькими адресами джерела для кожного піра та політикою пересилання, без окремого тунельного інтерфейсу для кожної групи.
Концентратор під керуванням WireGuard може тримати групи пірів окремо без окремого інтерфейсу або таблиці маршрутизації для кожної групи. Цю роботу виконують два механізми, і їхнє змішування — звичайна причина того, що політика виглядає правильною і нічого не робить. Один рівень вирішує, хто може заявити адресу джерела. Інший вирішує, куди цьому пакету дозволено йти.
Дві задачі, розділені
Тунельний рівень відповідає на вузьке питання: чи ключ цього піра авторизував цю внутрішню адресу джерела. Рівень пересилання відповідає на ширше: чи може цей пакет вийти в напрямку того призначення. Жоден не відповідає на питання іншого, і жоден сам по собі не є повною політикою доступу.
Саме через цей поділ пір може бути автентифікований, адресований правильно і все ж не зуміти досягти хоста, до якого йому не слід доходити. Це пояснює і зворотне: правило брандмауера, що дозволяє все, нічого не доводить щодо того, хто може заявити яку адресу.
Проєктуйте обидва рівні разом, потім перевірте обидва. Конфігурація, правильна на одному рівні й неперевірена на іншому, відмовляє відкрито або закрито залежно від типового значення.
Дайте кожному піру лише його власну адресу
Піри з кількома хостами спокушають видати на боці сервера весь діапазон групи. Цей дозвіл є заявкою на адресу джерела, тому скомпрометований або неправильно налаштований клієнт може пред'явити будь-яку адресу з діапазону, і тунель її прийме. Призначайте /32 на кожного піра для його власної внутрішньої адреси. Задавайте діапазони груп лише на клієнтах, де вони описують які призначення цей клієнт може досягати, а не які джерела він може використовувати.
Тоді брандмауер зіставляє джерело, якому можна довіряти. Правило, написане для діапазону групи, залишається корисною групою, і воно стає значущим лише тоді, коли жоден окремий пір не може заявити адресу, що належить іншому учаснику.
Напишіть політику пересилання, яка розділяє групи
Цікавий трафік тут входить і виходить через той самий тунельний інтерфейс, тому проходить шляхом пересилання, а не шляхом введення хоста. Правила належать наявному ланцюгу пересилання того менеджера брандмауера, якому належить хост, і вони є фрагментами, а не повним набором правил.
iifname "wg0" oifname "wg0" ip saddr 10.66.10.0/24 ip daddr 10.66.10.0/24 accept iifname "wg0" oifname "wg0" ip saddr 10.66.20.0/24 ip daddr 10.66.20.0/24 accept iifname "wg0" oifname "wg0" drop
Перші два правила дозволяють трафік усередині кожної групи. Останнє блокує все інше, що перетинає цей інтерфейс, і саме це створює ізоляцію між групами. Додайте явні правила для іншої родини адрес, якщо вони потрібні, бо drop, написаний для IPv4, не дозволяє і не описує поведінку IPv6.
Порядок вирішує, чи застосовується політика
Порядок правил важливіший за сам фрагмент. Загальне правило, що приймає встановлені з'єднання і стоїть перед цими записами, дозволяє старому міжгруповому потоку продовжуватися, тому ізоляція діє лише для нових з'єднань. Вирішіть, який із цих двох результатів вам потрібен, перш ніж перезавантажувати.
Вердикт прийняття також не завжди остаточний між ланцюгами на тому самому хуку. Якщо інший базовий ланцюг виконується пізніше, чинною політикою є комбінація, тому перегляньте лічильники, а не файл, який ви редагували. Лічильники — найдешевший доступний доказ. Правило без лічильника пакетів не збігається, а правило, яке збігається, поки пізніший ланцюг приймає, каже вам, що drop стоїть не на місці.
Перевіряйте матрицю, а не кількість файлів
Побудуйте невелику матрицю очікуваних результатів і перевірте кожну клітинку. З групи A до групи A має працювати, з групи B до групи B має працювати, а з A до B не має, в обох напрямках і для обох родин адрес, якщо ви їх підтримуєте.
nft list ruleset wg show wg0 allowed-ips ping -c 2 10.66.10.5 conntrack -L -s 10.66.20.7 2>/dev/null | head
Перші два показують, що налаштовано. Ping від учасника неправильної групи показує, що насправді відбувається. Список conntrack показує, чи ще приймається старіший потік, і саме так зміна ізоляції тихо не набуває чинності.
Хостові служби на концентраторі та доступ до LAN за ним — це окремі шляхи з окремою політикою. Запишіть, які з них охоплює матриця, бо тест, що перевіряє лише трафік між пірами, не говорить нічого ні про один із них.