Бір портты VPN-нен тысқары шығару үшін саясаттық маршруттау қажет
NAT ережесі мекенжайларды қайта жазады, бірақ шығу буынын таңдамайды. Міне, бір TCP портты туннельден тыс ұстайтын ереже, кесте және белгі.
Сұраныс әрдайым бір сөйлемнің нұсқасы: VPN шолу үшін қалсын, бірақ SSH немесе сақтық көшірме жұмысы қалыпты қосылымды қолдансын. Осы туралы тарайтын кеңес, яғни портты iptables NAT ережелерімен жіберу, оны жасамайды. NAT ережесі ағынның ішіндегі мекенжайлар мен порттарды қайта жазады; ол пакеттің қай интерфейстен шығатынын ешқашан таңдамайды. Бұл шешім бағыт іздеуге тиесілі, ал бағыт іздеуге портты көру үшін көмек керек.
Неге қарапайым бағыт портқа сәйкесе алмайды
Linux бағытты кестеден барар мекенжайды іздеп таңдайды, алдын ала үміткер кестелерді саясат ережелерімен сүзгеннен кейін. Бұл ережелер өртқабырға белгісіне, бастау мекенжайына, кіріс интерфейске немесе UID-ге сәйкесуі мүмкін. Бағыт жазбасының өзінде порт өрісі жоқ, өйткені бағыт тасымал тақырыбы маңызды болмай тұрып таңдалады.
Қазіргі iproute2 мен ядролар ереже таңдаушысын кеңейтеді: ipproto, sport және dport қабылданады, сондықтан ip rule add ipproto tcp dport 22 table 100 ниетті бір жолда білдіреді. Нақты хостта ip rule add help орындап, құрастырмаңыздың 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-де бағыт таппайды, сондықтан сәтсіз болады. Симптом ереже желіні бұзғандай көрінеді, шын мәнінде ол пакетте қалған жалғыз жолды алып тастаған.
Бірінші пакеттен кейін оны не жұмыс істеп тұрғызады
Белгілер шығыс пакеттерге қатысты. Жауап физикалық интерфейске сол буын берген мекенжаймен келеді, ал негізгі кесте сол барар жер үшін туннельді әлі де артық көруі мүмкін. Екі механизм жауап жолын бірізді ұстайды: буын мекенжайы үшін бастауға негізделген ереже және ағынның бүкіл өміріне шешімді сақтайтын қосылымды бақылау. Белгіні 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 ретінде келеді, ал бір қолданба әр түрлі типтегі бірнеше ағынды ашуы мүмкін. Егер шын талап осы бағдарлама қалыпты буынды қолдансын деген болса, бағыттау қабаты дұрыс емес орын; желілік аттар кеңістігі немесе әр қолданбаға прокси жақсырақ келеді.
Егер талап осы қосымша желі қалыпты буынды қолдансын деген болса, белгілерді толық өткізіп жіберіп, нақтырақ бағыт қосыңыз. Бұл қарапайым, бір кестеде көрінеді және келесі адам ережелер жинағын оқымой-ақ тексере алады.
Өртқабырғаға тиіспес бұрын үш талаптың қайсысы шынымен сізде бар екенін жазыңыз. Жоғарыдағы механизм дәл, ал дұрыс емес қабатқа қолданылған дәлдік тек ұзағырақ үзіліс.