Маршрут VPN или правило на защитната стена: кое изпуска пакета?
Маршрутът избира път, а филтърът решава за разрешението. Проверете и двете за един и същ източник, дестинация и посока, преди да разширите правило на защитната стена.
Две независими решения се случват с един и същ пакет и всяко от тях може тихо да прекрати заявката. Търсенето на маршрут избира интерфейс и следващ хоп, после филтърът на пакети решава дали тази комбинация е разрешена. Изтичането на времето ви казва, че едно от двете е отказало, но не кое. Минавайте етапите по ред и поправката обикновено спира да бъде догадка.
Две решения, един пакет, двама собственици
Търсенето на маршрут първо се допитва до правилата за политика, после до таблицата, към която сочат, и избира най-конкретния префикс, който съвпада с дестинацията. Клиент, който е инсталирал маршрут за тунел, притежава това решение и нищо в правило на защитна стена не може да го замести. Когато търсенето сочи неочаквано място, всеки следващ етап работи с грешния пакет.
Филтрирането е отделно. На Linux хост куките на netfilter разделят трафика по това за кого е пакетът: изходът напуска машината, входът завършва на нея, препращането минава през нея. Шлюз, който приема VPN клиенти и ги маршрутизира към LAN, се нуждае от пътя за препращане и това е точно веригата, която повечето стандартни конфигурации оставят празна.
Изборът на източник принадлежи към същото решение и точно там се крият повечето несъответствия. Ядрото избира адрес на източника от изходящия интерфейс, освен ако маршрутът не посочи такъв, затова правило за филтър, написано за LAN подмрежата, никога не съвпада с пакет, излизащ с адреса на тунела.
Прочетете какво всъщност е избрало търсенето
Отпечатайте решението, вместо да го извеждате. Командата по-долу разрешава маршрута, който ядрото би използвало за тази дестинация, включително интерфейса и източника, който би избрало:
ip route get 10.8.0.5 ip route get 10.8.0.5 from 192.0.2.44 ip rule show ip route show table all | sed -n '1,40p'
VPN клиентите често инсталират правила за политика с приоритети под основната таблица, затова чиста основна таблица сама по себе си не доказва нищо. Сравнете приоритетите на правилата с таблиците, които избират, и проверете дали маршрутът за тунела оцелява след повторно свързване, вместо да бъде добавян ръчно веднъж.
IPsec, базиран на политика, добавя трети етап на съпоставяне, който маршрутизацията не покрива, както описват бележките на strongSwan за препращане при тунелни и транспортни настройки. Политиката за сигурност избира трафика по префикс и протокол, докато маршрутът само решава къде би отишъл незащитен пакет. Подмрежа, която е маршрутизирана, но няма съответстващ селектор, или остава незащитена, или се изхвърля, в зависимост от конфигурацията, и нито един от изходите не изглежда като проблем на защитната стена. Отпечатайте политиката и сравнете селекторите ѝ с префиксите, които сте очаквали тунелът да носи.
Филтрирането действа на кука, не на маршрут
Правило, което разрешава слушателя на VPN, е правило за трафик, адресиран до самия шлюз. То не казва нищо за клиентите, които достигат хостове зад този шлюз, защото препращаният трафик минава през друга верига. Ченето на набора от правила като един плосък списък е обичайната причина едно изглеждащо правилно правило никога да не се задейства.
Броячите решават въпроса бързо. Правило с нулев брой пакети никога не е било достигнато, което сочи към грешната верига, грешния интерфейс или по-ранно изхвърляне. Правило с растящ брой под политика за изхвърляне е границата, която търсите, и пакетът се отхвърля, а не се маршрутизира погрешно.
Изпратете проба по пътя, който използва клиентът
Тестовете, изпълнени на самия шлюз, минават през изход и вход с адреса на източника на шлюза. Това е различен път от препратената заявка на клиента, затова успешен локален curl доказва по-малко, отколкото изглежда. Проверявайте от машината, която се проваля, или изрично фиксирайте интерфейса и източника.
nc -vz -w 3 10.8.0.5 443 ping -c 3 -W 1 10.8.0.5 tcpdump -ni any host 10.8.0.5 and port 443 iptables -vnL FORWARD --line-numbers nft list ruleset | sed -n '1,60p'
Заснемане от двата края разделя останалите случаи. SYN, който напуска клиента и никога не пристига, означава маршрутизация, криптиране или списък за достъп по-нагоре. SYN, който пристига и не получава отговор, означава услугата или нейния филтър на хоста и тунелът никога не е бил проблемът.
Обратният трафик заслужава отделен поглед. Асиметричната маршрутизация плюс филтриране на обратния път изхвърлят отговори, които пристигат на грешния интерфейс, и това изглежда като еднопосочна връзка, а не като блокиран порт. Проверете стойността на sysctl, преди да обвинявате защитната стена за симптом, който тя не е причинила.
Регистрирането работи като второ мнение, не като първа стъпка. Временен запис в журнала на веригата за препращане назовава интерфейса и адресите, които са го ударили, и е лесно да се премахне после. Оставете го постоянно и сте създали проблем с обема на журнала вместо отговор.
Поставете всяка промяна там, където оцелява след повторно свързване
Маршрут, добавен с ip route add, живее, докато интерфейсът не падне. Запазете го в профила на връзката: NetworkManager приема допълнителни маршрути за връзката, а netplan ги пази между зарежданията. Същото правило важи за изключение в защитната стена от страната на клиента, което изчезва след следващото презареждане.
Правилата от страната на сървъра принадлежат в конфигурационния файл, който услугата зарежда при стартиране, а не в интерактивна сесия, която приключва, когато я затворите. Напишете правилото, презаредете и потвърдете, че броячът се е преместил, защото презареждане, което е отхвърлило синтаксиса, тихо оставя стария набор от правила на място.
След това повторете оригиналната заявка на приложението от край до край и запишете кой слой се е променил. Поправка на маршрут, която е изисквала и промяна на филтъра, пак ще се провали и вторият провал се чете много по-лесно, след като знаете, че първият е изчезнал. Отбележете датата и версията на клиента до резултата, тъй като настройките по подразбиране за маршрутизация и филтриране се менят между изданията. Пазете тази бележка в тикета, за да започне следващият човек оттам, където сте спрели, вместо да повтаря двуетапното минаване.