Два 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 сонда може да извуче име сервера или вредност ALPN из правог ClientHello. Препознавање стандардног OpenVPN-а је другачија класификација од читања TLS проширења, и то двоје се не саставља, јер клијент који никада не пошаље ClientHello на сокет за слушање оставља сонду без ичега за читање. Зато правило које се поклапа са OpenVPN-ом одговара „ово је OpenVPN клијент“ и не иде даље. Два OpenVPN backend-а иза тог правила су неразлучива, предња страна нема основу за избор, и свака сесија слеће на исто место. Мултиплексирање дели један порт између различитих услуга; оно не прави виртуелни хостинг унутар једне услуге.

Распореди који заиста раздвајају два сервера

Најјефтинија поштена подела је друга јавна адреса, по једна на инстанцу, а постојећи профили већ носе оно што треба јер показују на различите адресе. Следећа је друга порта на истој адреси, што не кошта ништа осим броја у сваком профилу. TCP и UDP држе одвојене табеле портова, па су 1194/tcp и 1194/udp неповезани сокети и по један од сваког може да постоји на истом домаћину; то је транспортно раздвајање, а не рутирање по имену, и често се с њим меша. Обе опције пролазе преглед заштитног зида, јер правило одговара нечему што пакет заиста садржи.

Ако граница која вам треба иде између група корисника, а не између две имплементације, једна инстанца са различитим конфигурацијама клијената, сопственим руковањем сертификата и јасном политиком приступа може то да покрије. То купује политику унутар сервера, а не изолацију између сервера, и то су различити захтеви. Изолација која мора да издржи под компромитацијом и даље захтева адресу или ивицу заштитног зида.

TLS терминатор постављен испред OpenVPN-а може да изложи право име сервера способној предњој страни, али само када је и клијентска страна конфигурисана за тај додатни слој. Постојећи профили не стичу то понашање само тиме што су усмерени на исту адресу.

Докажите селектор пре него што градите

Именујте поље које ће идентификовати 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-а за сваки. Ако се обе сесије појаве у истом журналу, селектор недостаје, а није погрешно конфигурисан, и поправка је адреса или порт који клијент може да нанишани. Уређивање правила рутирања неће помоћи, јер правилу никада није дато ништа по чему би рутирало. Када подела постане стварна, запишите је поред профила да следећа особа не дода други алијас и не очекује да ће он обавити посао.

Повезани чланци