Екі DNS атауы, бір OpenVPN порты: шын мәнінде нені таңдайды
Бір мекенжайға сілтейтін екі хост атауы әлі де бір тыңдаушыға жетеді. Backend-ті тек клиент жіберетін өріс таңдай алады, ал қарапайым OpenVPN ондай өрісті жібермейді.
Екі A жазбасы, бір мекенжай, бір демон: пайдаланушы қай атауды енгізсе де, келетін пакет бірдей, ал 1194 портына байланған процестің екеуін ажырататын ештеңесі жоқ. Бұл түзетуді күтіп тұрған қате конфигурация емес; бұл атау іздеуі білдіре алатын шек. Екі OpenVPN данасының арасынан таңдайтын кез келген нәрсе клиент қосылымға салатын және алдыңғы жақ кері оқи алатын мән болуы керек, ал стандартты OpenVPN клиенті мұндай мәнді ашық түрде салмайды. Келесіде бұл сізді қайда әкелетіні және қандай құрылымдар трафикті шынымен бөлетіні қарастырылады.
Шешуші қайтаратын нәрседен бастаңыз
Клиент vpn-a.example сұрайды және мекенжай алады; сол мекенжай мен порт оның барлық қоңырау шалатыны. Атау іздеу кезінде жергілікті түрде жұмсалады және желідегі өріске айналмайды, сондықтан арғы жақтағы тыңдаушы қай белгі қолданылғанын көре алмайды. vpn-a.example мен vpn-b.example-ні бір хостқа бағыттаңыз, екі іздеу де бірдей межеге әкеледі, сондықтан демон айырмашылықты тіркемей-ақ екі қосылымды бір данаға сіңіреді. Мекенжайға негізделген профильдер де сол себепті атауға негізделген профильдер сияқты әрекет етеді.
Бұл сондай-ақ азғырарлық айналма жолдар тобын жабады: қосымша бүркеншік аттар, бір сокетте әр атауға сертификат таңдау немесе сұралған атауға байланған брандмауэр ережесі. Олардың ешқайсысы клиенттен бірінші пакет шықпай тұрып тасталған ақпаратқа әрекет ете алмайды. Егер екі сервер бөлек қалуы керек болса, бөлу қосылымның өзімен бірге жүруі керек, яғни мекенжай, порт немесе протокол анықтайтын пайдалы жүктеме өрісі.
Есептелетін жалғыз таңдаушы пакеттің ішінде жүреді
HTTP оны Host тақырыбымен шешеді, ал TLS ClientHello ішіндегі сервер атауы кеңейтімімен, осылайша бір мекенжай бір тыңдаушының артында көп сайтқа қызмет етеді. Екеуі де жұмыс істейді, өйткені желідегі протокол нақты қызметке сұраныс тасымалдайды. OpenVPN туралы маңызды факт: аралық қорап тексеретін қабатта бұл өрістердің ешқайсысы жоқ.
Стандартты құрылымда басқару арнасын қорғайтын TLS қол алысуы сыртқы сессия орнатылғаннан кейін болады және соның ішінде тасымалданады, сондықтан сол сессияны аяқтамаған тыңдаушы күңгірт ағынды көреді. Ол әлі де бұл OpenVPN екенін айта алады, өйткені бастапқы байттардағы опкод пен қаңқа танымал, бірақ сервер атауы, егер болса, шифрланған бөлікте отырады. Сыртқы пакеттен виртуалды хост оқуды күтетін дизайн протокол ешқашан жазбайтын өрісті оқып отыр. Бұл туннельдің қалай салынғанынан туындайды, ақылдырақ үлгі сәйкестендіруі жаба алатын саңылаудан емес.
Протокол бөлгіші қайда тоқтайды
sslh жобасы құжаттайтын типтегі мультиплексор бір портта тыңдайды, бастапқы байттарды тексереді және қосылымды танылған протоколды сөйлейтін backend-ке береді. Бір порт SSH, HTTPS және OpenVPN-ке бірге қызмет етуі керек болғанда бұл нақты құндылық.
sslh әр протокол үшін жеке зонд ұстайды, ал оның TLS зонды нағыз ClientHello-дан сервер атауын немесе ALPN мәнін шығара алады. Қарапайым OpenVPN-ді тану TLS кеңейтімін оқудан басқа жіктеу, және екеуі бірікпейді, өйткені тыңдаушы сокетке ClientHello-ды ешқашан жібермейтін клиент зондты оқитын ештеңесіз қалдырады. Сондықтан OpenVPN-ге сәйкес келетін ереже «бұл OpenVPN клиенті» деп жауап береді және әрі қарай бармайды. Сол ереженің артындағы екі OpenVPN backend-і ажыратылмайды, алдыңғы жақта таңдауға негіз жоқ, және әр сессия бір жерге қонады. Мультиплекстеу бір портты әр түрлі қызметтер арасында бөліседі; ол бір қызметтің ішінде виртуалды хостинг жасамайды.
Екі серверді шынымен бөлетін құрылымдар
Ең арзан адал бөлу — екінші жария мекенжай, әр данаға біреу, ал бар профильдер қажеттіні әлдеқашан алып жүр, өйткені олар әр түрлі мекенжайларға сілтейді. Келесісі — сол мекенжайдағы басқа порт, ол әр профильдегі бір саннан басқа ештеңе тұрмайды. TCP мен UDP бөлек порт кестелерін ұстайды, сондықтан 1194/tcp және 1194/udp байланыссыз сокеттер және әрқайсысынан біреуі бір хостта қатар өмір сүре алады; бұл көлік бөлінісі, атау бойынша маршруттау емес, және онымен жиі шатастырылады. Екі нұсқа да брандмауэр қарауынан өтеді, өйткені ереже пакетте шынымен бар нәрсеге сәйкес келеді.
Егер сізге қажет шекара екі іске асырудың арасында емес, пайдаланушы топтарының арасында өтсе, оны әр түрлі клиент конфигурациялары, өз сертификат өңдеуі және айқын қатынау саясаты бар бір дана жаба алады. Бұл сервер ішіндегі саясатты сатып алады, серверлер арасындағы оқшаулауды емес, және бұл екі түрлі талап. Бұзушылық жағдайында тұруы тиіс оқшаулау әлі де мекенжайға немесе брандмауэр шетіне мұқтаж.
OpenVPN алдына қойылған TLS аяқтаушысы қабілетті алдыңғы жаққа нақты сервер атауын аша алады, бірақ клиент жағы да сол қосымша қабатқа конфигурацияланған жағдайда ғана. Бар профильдер бір мекенжайға сілтеу арқылы бұл мінез-құлықты иемденбейді.
Салмас бұрын таңдаушыны дәлелдеңіз
Backend-ті анықтайтын өрісті атаңыз, содан кейін клиент оны шынымен жіберетінін растаңыз; жауап мекенжай болса жоспар тұрады, ал егер ол тыңдаушыға ешқашан жетпейтін қол алысу ішіндегі сервер атауы болса, ешбір DNS жұмысы оны құтқармайды. Үш команда тыңдаушы жағын тез шешеді.
ss -lntup | grep -E ':443|:1194'
openssl s_client -connect vpn-a.example:443 -servername vpn-a.example </dev/null | head -n 20
journalctl -u openvpn-server@server-a -n 20 --no-pager
openssl жолы сертификатты тек сол мекенжайда бірдеңе TLS-ті аяқтайтын жерде береді; қарапайым OpenVPN тыңдаушысына қарсы ол тұрып қалады немесе сәтсіз аяқталады, және бұл сыртқы қабаттың нені ашатыны туралы жауаптың өзі. journal жолы әр backend-те оқылғанда қай дана сессияны қабылдағанын көрсетеді. Алдыңғы жақ журналдары не жіктелгенін жазады, ал ешқашан нені көздегенін жазбайды, сондықтан пайдаланушының қайда қонғаны туралы жалғыз билік backend болып қалады.
Әр түрлі серверлерге жетуге арналған екі профильмен аяқтаңыз, оларды бір-бірлеп қосыңыз және әрқайсысының backend журналын белгілеңіз. Егер екі сессия да бір journal-да көрінсе, таңдаушы дұрыс конфигурацияланбаған емес, жоқ, және түзету — клиент нысанаға ала алатын мекенжай немесе порт. Маршруттау ережесін өңдеу көмектеспейді, өйткені ережеге ешқашан маршруттайтын нәрсе берілген емес. Бөлу шынайы болған соң, оны профильдердің қасына жазыңыз, келесі адам екінші бүркеншік ат қосып, одан жұмысты күтпесін.