OpenVPN и HTTPS на порту 443: чији је слушалац?
TCP и UDP 443 су одвојени сокети. Дељење једног TCP слушаоца захтева власника, а дељење порта OpenVPN-а је уска погодба, не трик с проксијем.
Две услуге могу обе да одговарају на порту 443 без икаквог такмичења, јер се слушалац одређује према транспорту, адреси и порту заједно, а не само према броју. Поставите веб сервер и OpenVPN на исти рачунар, и једино питање које вреди прво одговорити јесте који сокет сваки процес тражи од кернела. Запишите тај списак пре него што уредите конфигурацију, и већина грешака „адреса је већ у употреби“ објасниће се сама. Све после списка је избор између UDP слушаоца, заједничког TCP сокета или предњег дела који усмерава према протоколу.
Почните од сокета који тражи сваки процес
Bind успева или не успева према тој тројци, па се два демона сударају само када се сва три дела поклопе. Зато веб страница на TCP 443 неограничено постоји уз OpenVPN слушалац на UDP 443, и зато премештање једног од њих на другу локалну адресу на истом хосту такође завршава расправу. Читајте живе слушаоце, а не датотеке које су требале да их створе, јер застарео include или заборављена unit датотека надживи измену које се сећате.
| Line in the listener list | What it establishes | What to do next |
|---|---|---|
| One udp row and one tcp row, each on 443 | Separate transport sockets, nothing contested | Point the VPN profile at udp and stop editing |
| A single tcp address and port listed by two processes | A real bind collision between two daemons | Move one service, or put a dispatcher in front of both |
| A proxy process owns the socket, no vpn process | The proxy accepts and has to hand off correctly | Check that its backend speaks the protocol it forwards |
Покрените ss -lntup као root и прочитајте сваки ред који помиње 443, укључујући IPv6 уносе. Дивљи v6 слушалац обично прихвата и v4 саобраћај, и тако слушалац који сте заборавили држи порт заузетим након што промените датотеку коју сте сматрали одговорном. Ако вас име процеса изненади, сузите излаз помоћу ss -lntup 'sport = :443' пре него што било шта додирнете.
Пребаците тунел на UDP када мрежа то дозволи
UDP слушалац потпуно заобилази судар и обично је најкраћа поправка, јер се ниједан сокет не дели и ниједан додатни производ не улази на пут. Али то није бесплатно. Неке клијентске мреже одбацују UDP 443 без слања reset-а, па тунел престаје да се успоставља уместо да не успе bind, и корисник пријављује да VPN не ради без икакве грешке за читање. UDP слушалац такође надживи рестарт веб слоја, што се рачуна на машини чији се сајт често поново објављује. Тестирајте из мреже у којој седе корисници, јер љуска на серверу доказује само да сервер достиже себе.
Промените транспорт у конфигурацији сервера и у профилу клијента заједно. Профил који још тражи TCP кружиће кроз поновна повезивања према слушаоцу само на UDP, и то изгледа као мрежни квар док не упоредите две датотеке.
Нека VPN процес поседује TCP 443, а остало проследите
Community OpenVPN у TCP server режиму чита прве бајтове долазне везе и прослеђује све што није његов протокол на HTTPS бекенд, и томе служи директива port-share. Бекенд је обичан веб сервер са укљученим TLS-ом, именован хостом и портом у тој директиви, а не URL-ом.
port-share 10.0.0.5 8080
На машини где сајт има другу приватну адресу, тај ред шаље не-VPN саобраћај на 10.0.0.5:8080, па HTTPS виртуелни хост мора бити везан тамо и заштитни зид мора дозволити локални скок. Веб сервер мора сам да заврши TLS, јер су бајтови који долазе оригинални handshake прегледача и ништа између их није дешифровало. Усмерите директиву на обичан HTTP слушалац и прегледач добија грешку неважеће методе, која се чита као покварен сајт, а не као погрешно постављен бекенд. Директива постоји само у TCP server режиму, а UDP слушалац нема ток за преглед.
Пошто VPN процес прихвата сваку везу, веб апликација види прослеђени захтев како долази са једне од сопствених адреса хоста уместо од посетиоца. Све што треба праву адресу клијента зависи од подршке за PROXY протокол у бекенду или од предњег дела који је додаје. Премештање бекенда на другу локалну адресу не враћа адресу посетиоца; оно само мења коју од адреса хоста сајт бележи. Запишите то ограничење у белешке о постављању пре него што извештај аналитике покрене питање.
Обрнути прокси је погрешан алат; усмеравач четвртог слоја није
HTTP обрнути прокси завршава TLS да би могао да чита захтеве, што значи да не може да пропусти OpenVPN ток нетакнут. Усмеравач четвртог слоја који прослеђује према SNI или према прегледу првог пакета може стајати испред оба, под условом да не завршава сесију од које VPN зависи. Два уређаја изгледају слично на дијаграму, а понашају се потпуно различито на сокету.
Комерцијални Access Server испоручује сопствена подешавања дељења порта, и она се не пресликавају један-на-један на директиву заједнице. Идентификујте производ и верзију пре него што прилагодите водич написан за онај други. Копирано подешавање које се тихо игнорише горе је од никаквог подешавања, јер списак слушалаца после тога и даље изгледа уверљиво.
Тестирајте сајт и тунел као два одвојена пута
Учитајте сајт и повежите тунел, затим поново прочитајте списак слушалаца да видите који процес сада поседује 443. Страница која се учита не доказује ништа о VPN-у, а тунел који се повеже не доказује ништа о сајту, иако оба користе исти број. Три наредбе испод проверавају заједнички сокет, веб пут и VPN услугу тим редом.
ss -lntup 'sport = :443' curl -sI https://vpn.example.com/ | head -n 1 journalctl -u openvpn-server@server -n 20
Упоредите адресу клијента у приступном логу бекенда са оном у VPN логу за исти тренутак. Ако сајт бележи сваког посетиоца као сам хост, прослеђивање ради, а руковање адресом не. Ако оба лога ћуте, предњи део никада није предао везу. У сваком случају списак слушалаца одлучује ко прихвата сокет, и то је чињеница коју треба потврдити пре него што промените још једну датотеку.
Оставите ту мапу слушалаца поред конфигурације да следећа особа која додирне 443 зна који процес прихвата и куда је отишао други протокол. Потврдите власништво након измене уместо да верујете ономе што је измена требала да уради.