Хоёр 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 дээр гарч ирвэл сонгогч буруу тохируулагдсан биш, байхгүй байна, засвар нь үйлчлүүлэгч онилж чадах хаяг эсвэл порт юм. Чиглүүлэх дүрмийг засах нь тус болохгүй, учир нь дүрэмд хэзээ ч чиглүүлэх зүйл өгөөгүй. Хуваалт жинхэнэ болсны дараа дараагийн хүн хоёр дахь далд нэр нэмээд түүнээс ажил хүлээхгүйн тулд профайлуудын хажууд бичээрэй.

Холбоотой нийтлэлүүд