Бір Linux хостқа екінші OpenVPN клиентін қосу екі жердің бірінде сәтсіз аяқталады. Не ішкі клиент өз серверіне жете алмайды, өйткені сыртқы туннель бұл тасымалды басып алған, не екінші клиент маршрут кестесін қайта жазады да бірінші туннель жұмысын тоқтатады. Екі мәселе де маршруттауда, шифрлауда емес, және екеуі де жаңа туннель қандай да бір қосымша трафигін тасымалдамай тұрып шешіледі. Мұндағы мекенжайлар мысал үшін: tun0 — сыртқы туннель, 203.0.113.9 — ішкі сервер, ал TCP 9999 — ішкі жолды пайдалануы тиіс ағын.

Екі істен шығу режимі, бір маршрут кестесі

Ішкі клиент өз серверіне UDP сокет ашады, және бұл сокет кез келген басқасы сияқты ағымдағы маршрут кестесін ұстанады. Егер сыртқы туннель әдепкі маршрутты әлдеқашан иеленсе, қол алысу пакеттері сыртқы туннельге кетеді. Бұл сыртқы сервер ішкі серверге жете алғанда және қарсы жақ ағынды тасымалдауға келіскенде ғана жұмыс істейді; әйтпесе қол алысу тоқтайды да клиент қайта көреді.

Екінші істен шығу сервердің push-ынан келеді. Әдеттегі push — redirect-gateway def1, ол әдепкі маршрутты алмастырудың орнына 0.0.0.0/1 және 128.0.0.0/1 орнатады. Сондықтан өз /1 жұбын орнататын екі клиент соқтығысады, және жаңа жұп барлық дерлік межеге дейін жеңеді. Екіншісі қосылғаннан кейін туннель өлсе, кестеден осы екі префиксті іздеңіз, өйткені әдепкі маршруттың өзі ешқашан өзгермеген болуы мүмкін.

Ағынды белгілеп, оған кесте беріңіз

Таңдалған трафикті mangle кестесінде белгілеп, белгіні саясат ережесінде сәйкестендіру арқылы бағыттаңыз. Ереже әдепкі маршруты ішкі құрылғы болып табылатын арнайы кестеге сілтейді, сондықтан тек белгіленген пакеттер ішкі жолмен жүреді.

iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200

Бұл ережелер жиынындағы ақаулардың көбі екі қатеден келеді. Firewall орнатқан белгі мәні мен ереже сәйкестендіретін мән бірдей болуы керек, өйткені сәйкессіздік қате де, әсер де бермейді. Ал PREROUTING тек сырттан келетін пакеттерді көреді, сондықтан осы хостта басталған қосылым бәрібір белгіленуі үшін бірдей сәйкестікпен OUTPUT ережесі қажет.

Маршрут иелігін екінші клиенттен алыңыз

Екі нұсқа екінші клиенттің кестені өңдеуіне жол бермейді және олар әртүрлі нүктелерде әрекет етеді. route-nopull push етілген маршрут опцияларын елемейді, сондықтан ештеңе орнатылмайды. route-noexec push етілген опцияларды клиенттің ортасына қабылдайды, бірақ кесте өзгерісін hook-қа қалдырады, ал сервер нені ұсынғанын көру қажет болғанда дәл осы керек.

Hook push етілген мәндермен өз ортасында жұмыс істейді және тек сіз мақұлдаған жазбаларды қосуы керек. Оны idempotent етіңіз: қайта құру алдында өзі иеленген кестені тазалаңыз және алдыңғы іске қосу таза күй қалдырды деп ойламаңыз. Қайта қосылу hook-ты қайта шақырады, ал тазалаусыз қосатын hook қайталанатын маршруттарды жинақтайды.

Бір иесін таңдап, оны жазып қойыңыз. Екі опцияны да орнататын профиль немесе қолмен жазылған скриптпен бәсекелесетін hook кейін ешкім түсіндіре алмайтын кесте тудырады.

Екі сервер мекенжайын бекітіңіз

Ішкі клиент қосылмай тұрып, ішкі серверге сыртқы құрылғы арқылы хост-маршрут қажет. Дәл сол жазба ішкі тасымалды әдепкі маршрутқа ергізудің орнына сыртқы туннельдің ішінде ұстайды.

ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9

Негізгі кестеге сыртқы сервер үшін де сәйкес хост-маршрут қосыңыз, әйтпесе қайта қосылу сыртқы клиенттің өз тасымалын өз туннеліне бағыттауы мүмкін. Реті міндетті: бұл жазбаларды тиісті интерфейс пайда болғаннан кейін қосыңыз, яғни қосылудан кейін іске қосылатын hook немесе скрипт. Өшірулі құрылғыға сілтейтін маршрут жойылады немесе еленбейді, сондықтан жүктелу кезінде жазылған жазба сіз болжаған тізбектен өтпейді.

Бүкіл кестені оқудың орнына іздеуді тексеріңіз. Маршрутты іздеу шығысы kernel қолданатын құрылғы мен бастау мекенжайын атайды, және клиент сокетін ашқанда дәл соны алады.

Тізбекті сынап, ақауды көрінетін етіңіз

Ішкі клиент қосылып жатқанда сыртқы интерфейсте ұстаңыз. Ішкі қол алысу сыртқы туннельдің ішінде шифрланған жүк ретінде көрінуі керек; егер ол 203.0.113.9-ға қарай қарапайым UDP болып көрінсе, хост-маршрут жоқ және тізбек ешқашан құрылмаған.

Физикалық uplink-ке үнсіз қайтатын тізбек ең нашар нәтиже, өйткені интерфейс күйі ештеңе хабарламайды және ішкі трафик қате бастау мекенжайынан шығады. Егер сыртқы туннель құлағанда екінші клиент тікелей қайта қосыла алса, ол жолды өшіріңіз немесе ақау көрінетіндей етіп оны сыртқы интерфейске байлаңыз.

Екі ағын және бір ереже dump-ымен аяқтаңыз: белгіленген және белгіленбеген қосылымдар түрлі жолдармен жүруі керек, ал ip rule show сіз ниет еткен басымдықты тізімдеуі керек. Егер екі ағын да бір жолмен жүрсе, белгі сіз ойлаған жерде қолданылмайды.

Қатысты мақалалар