Заобилажење VPN-а за један порт захтева рутирање по правилима
NAT правило преписује адресе, али не бира излазни линк. Ево правила, табеле и ознаке које заиста држе један TCP порт изван тунела.
Захтев је увек варијанта исте реченице: задржи VPN за прегледање, али пусти SSH или посао резервне копије да користи нормалну везу. Савет који кружи о томе, да се порт проследи NAT правилима у iptables-у, то не ради. NAT правило преписује адресе и портове унутар тока; оно никада не бира кроз који интерфејс пакет излази. Та одлука припада претрази руте, а претрага руте треба помоћ да види порт.
Зашто обична рута не може да се поклопи са портом
Linux бира руту тражећи одредишну адресу у табели, након што се кандидатске табеле филтрирају кроз правила политике. Та правила могу да се поклопе са ознаком firewall-а, изворном адресом, долазним интерфејсом или UID-ом. Сама ставка руте нема поље порта, јер се рута бира пре него што заглавље транспорта постане важно.
Тренутни iproute2 и језгра проширују бирач правила: ipproto, sport и dport се прихватају, па ip rule add ipproto tcp dport 22 table 100 изражава намеру у једној линији. Покрени ip rule add help на стварном хосту да видиш да ли твој build наводи dport. Ако наводи, готов си једном командом; ако не, пут преко ознаке испод је еквивалент.
Како год, правило је само показивач. Табели 100 и даље треба рута, и то је део који људи забораве.
Три дела, или један
Савремени облик је једно правило изнад плус рута у алтернативној табели. Класични облик додаје netfilter у средину: означи пакет, па поклопи ознаку у правилу. Оба се завршавају истом претрагом; разликују се у томе где се порт чита.
Приступ са ознаком постоји зато што netfilter види заглавље транспорта, а код за рутирање га историјски није видео. То је цео механизам и објашњава зашто су резервни пут три дела која сарађују, а не једна лукава команда.
Три дела по реду
Прво, означи токове које желиш да преусмериш, у ланцу који се извршава довољно рано да ознака постоји пре одлуке о рути:
nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1Друго, пошаљи означене пакете у одвојену табелу:
ip rule add fwmark 0x1/0x1 table 100Треће, дај тој табели подразумевану руту кроз физички линк. Адресе су илустративне; замени их својим:
ip route add default via 192.168.1.1 dev wlan0 table 100Прескочи трећи корак и означени пакет неће наћи руту у табели 100, па ће пропасти. Симптом изгледа као да је правило покварило мрежу, док је заправо уклонило једини пут који је пакету остао.
Шта га одржава у раду после првог пакета
Ознаке важе за одлазне пакете. Одговор долази на физички интерфејс са адресом коју је линк доделио, а главна табела може и даље да преферира тунел за то одредиште. Два механизма одржавају повратни пут доследним: правило засновано на извору за адресу линка и connection tracking који чува одлуку током целог живота тока. Чување ознаке у conntrack-у и њено враћање при одговору уобичајен је начин да изузетак са стањем буде стабилан.
Филтрирање обрнутог пута је други тихи убица. Ако језгро строго проверава повратни пут, а одговор долази на интерфејс који главна табела не би изабрала, пакет се одбацује без поруке. rp_filter подразумеване вредности разликују се по дистрибуцији и по томе да ли се интерфејс прослеђује, па читај стварну вредност уместо да претпоставиш да је искључена.
Не означавај сопствени транспорт тунела. WireGuard или UDP OpenVPN тунел није TCP 22, па је горњи рецепт безбедан, али изузетак написан као све осим одредишта тунела може да ухвати шифроване пакете и поквари тунел на начин који личи на петљу рутирања.
Провери уместо да претпоставиш
Питај језгро којим би путем ишло, за одредиште и за порт, па изврши прави пренос:
ip route get 203.0.113.10
ip rule show
nft list rulesetАко ознака постоји али бројачи се никада не померају, правило се не поклапа. Бројачи су разлика између конфигурације коју си написао и политике коју језгро примењује.
Када је ово погрешан алат
Изузеци засновани на порту су по природи крхки. Сервиси померају портове, HTTP/3 долази као UDP 443, а једна апликација може да отвори неколико токова различитих врста. Ако је прави захтев да овај програм користи нормалан линк, слој рутирања је погрешно место; мрежни namespace или proxy по апликацији се боље уклапају.
Ако је захтев да ова подмрежа користи нормалан линк, потпуно прескочи ознаке и додај конкретнију руту. Једноставније је, видљиво је у једној табели, а следећа особа може да га прегледа без читања скупа правила.
Запиши који од три захтева заиста имаш пре него што дираш firewall. Горњи механизам је прецизан, а прецизност примењена на погрешан слој је само дужи прекид.