Чотири речі мають збігтися, перш ніж хост Linux надсилатиме через тунель лише власний SMTP: маршрут в окремій таблиці, правило політики, що вибирає трафік, адреса джерела, яку прийме peer, і зворотний шлях, що витримує асиметрію. Кожна з них — окрема конфігурація з власним режимом відмови. Порядок нижче дає змогу відмові вказувати на ту частину, яка справді неправильна. Це завдання маршрутизації, специфічне для порту, а не запит маршруту за замовчуванням через VPN.

Правило порту — не маршрут за замовчуванням

Правило, що зіставляє локально створений TCP із портом призначення 25, надсилає цей трафік до таблиці, яку ви назвете. Саме правило нічого не створює: воно вибирає, а таблиця має містити маршрут, здатний пронести пакет. Разом вони охоплюють лише вихідний напрямок одного протоколу, тому пересилання для інших хостів, вхідні поштові з'єднання та IPv6 залишаються поза цією схемою. Називати це політикою для конкретного порту, а не типовим VPN, зберігає цю межу чесною.

Два налаштування wg-quick є передумовами, а не частиною політики. AllowedIPs = 0.0.0.0/0 дозволяє peer'у нести довільні адреси призначення IPv4, а Table = off заважає wg-quick установити власний маршрут за замовчуванням для цього префікса. Не змішуйте ці інструкції з менеджером, що застосовує власну політику маршрутів, бо вони розійдуться в тому, кому належить головна таблиця.

Напишіть маршрут, селектор і захист

Виберіть номер таблиці й пару пріоритетів, які більше ніхто не використовує, потім застосуйте маршрут, селектор і захист саме в цьому порядку. Числа нижче — приклади, а не зарезервовані значення:

ip -4 route add default dev wg0 src 10.77.0.2 table 51825
ip -4 rule add priority 10000 iif lo ipproto tcp dport 25 lookup 51825
ip -4 rule add priority 10001 iif lo ipproto tcp dport 25 unreachable

iif lo обмежує правило трафіком локального походження, а ipproto tcp dport 25 визначає напрямок з'єднання; довідник ip-rule описує обидва селектори. Вони є в поточних ядрах і випусках iproute2, а в старій системі правило просто відхиляється, що є зрозумілішою відмовою, ніж правило, яке завантажується і ні з чим не збігається.

Правило unreachable на наступному пріоритеті — це захист. Без нього відсутній маршрут у таблиці 51825 провалюється в звичайний маршрут за замовчуванням, і пошта виходить через фізичний канал під час збою тунелю — саме той випадок, заради якого будувалася політика.

Адреса джерела має збігатися

Перевага src у маршруті лише заповнює джерело для з'єднань, які не прив'язали власного. Це не трансляція, і вона не скасовує явну прив'язку, тому демон, прив'язаний до фізичної адреси, продовжує надсилати з цієї адреси. Якщо ви бачите саме це, змініть налаштування самого демона або спроєктуйте усвідомлену політику трансляції, бо пізній суцільний masquerade — інше рішення з іншими наслідками.

На шлюзі peer клієнта має авторизувати джерело, яке він фактично отримує, тобто 10.77.0.2/32, а не широкий префікс призначення. Копіювання 0.0.0.0/0 клієнта в кожен peer шлюзу розмиває, кому належить який трафік. Шлюзу також потрібні пересилання, політика міжмережевого екрана, що дозволяє потік, і зворотний шлях, включно з вихідною трансляцією, коли верхній бік не може маршрутизувати приватну адресу тунелю.

Перевірте зворотний шлях, потім стійкість

Прочитайте результати пошуку, перш ніж чомусь довіряти, бо вони показують, яку таблицю і яке джерело отримує кожен напрямок. Одного призначення на порту 25 і того самого призначення на порту 443 достатньо:

ip -4 route get 198.51.100.25 ipproto tcp dport 25
ip -4 route get 198.51.100.25 ipproto tcp dport 443

Перший пошук має назвати wg0 і передбачуване джерело, а другий — зберегти звичайний верхній канал. Коли застосунок прив'язує власну адресу, додайте from з цією адресою до пошуку. Напрямок відповіді, що досягає wg0 і потім відкидається локально, вказує на фільтрацію зворотного шляху IPv4, бо правило лише для вихідного порту не змушує зворотний пошук вибирати тунель.

Там, де асиметрична маршрутизація дозволена, може підійти несуворий режим, обмежений інтерфейсом, через net.ipv4.conf.wg0.rp_filter=2, і варто спершу перевірити чинний максимум значень all та інтерфейсу. Не вимикайте перевірку глобально як короткий шлях. Потім передайте таблицю, пріоритети й захист тому, хто володіє конфігурацією, і після повторного підключення відкрийте нові з'єднання, щоб підтвердити, що вибір досі тримається. Майте на увазі, що відповіді локального слухача SMTP несуть вихідний порт 25, а не порт призначення 25, і це окреме питання політики.

Схожі статті