TLS бүрхүүлийг OpenVPN-ийн өмнө тавьснаар байршуулалт хоёр дахь сонсогчтой болно, тэдгээрийн зөвхөн нэг нь л интернэт рүү харсан байх ёстой. Туннель нэг машин дээр ажиллаад гаднаас бүтэлгүйтвэл дамжуулалт ихэвчлэн хоёрын буруу тал руу чиглэсэн байдаг. Нийцэх ёстой зүйл бол гинжин хэлхээ: нийтийн дүрэм бүрхүүлд хүрч, бүрхүүлийн өөрийн backend холболт жинхэнэ VPN залгуурт хүрнэ. Дөрвөн харайлт энэ гинжийг дамжуулдаг бөгөөд тэдгээрийн аль нэг нь мөрдөн байцаалтыг эрт дуусгаж болно.

Хоёр залгуур, хоёр эзэн, нэг нь нийтийн

Бүрхүүл гадаад холболтын TLS-ийг дуусгаж, тайлагдсан байт урсгалыг энгийн OpenVPN TCP сонсогчид дамжуулна. Эдгээр нь тусдаа тохиргооны файлтай тусдаа залгуурууд тул нэгийг засах нь нөгөөг хөндөхгүй, гаднаа эрүүл хэвээр үлдээнэ. Энэ нь мөн нэгийг нөгөөгүйгээр өөрчлөхөд хоёулаа холдож болно гэсэн үг.

Машинаас нь ажиллах нь нийтийн замд тухай маш бага нотолдог. Уугуул порт руу шууд холболт бүрхүүлийг алгасдаг, бүрхүүл рүү түүний LAN хаягаар холболт орчуулгыг алгасдаг, гадаад хэрэглэгчийн хийдэг зүйлийг зөвхөн клиент талын бүрэн зохион байгуулалт л дасгалжуулна. Нэрсийг ч мөн болгоомжтой унших хэрэгтэй, учир нь localhost тэр компонентыг ажиллуулж буй хостыг заана, та санамсаргүй бичиж байгаа хостыг биш. Энэ ялгааг тэмдэглэлдээ хадгал, учир нь өөрийн хамхсан харайлтыг тэмдэглээгүй бүртгэсэн тест хоёр өөр зүйлийг харьцуулахыг урьдаг.

Дамжуулалт үнэхээр хаана буух вэ

Гинжийг гурван портын дугаар гэхээс дөрвөн харайлт гэж барих нь илүү хялбар, учир нь ижил дугаар хоёр төгсгөлд өөр утга илэрхийлж болно. Хүснэгтийг мөр мөрөөр уншина уу: мөр бүр холболт хүлээн авч дараа нь дараагийнхыг нээх ёстой нэг залгуур юм. Мөр буруу түнш рүү чиглэсэн бол сүүлийн баганын шинж тэмдэг нь хэрэглэгчийн мэдээлдэг зүйл юм.

HopListens onMust reachSymptom when it points elsewhere
Client machineA local plaintext portThe wrapper's public TLS addressPlain text offered to a TLS endpoint
Router forwardPublic TCP 443The wrapper host on its translated portWrapper records no connection at all
Wrapper, server modeIts accepted port, 8443 hereThe native VPN socket on loopbackHandshake completes, then silence
Native VPN listenerLoopback TCP portIts peer, over TCP onlyA UDP socket behind a byte-stream relay

Бүрхүүлийн оронд уугуул VPN портыг онилсон дүрэм TLS дуусгахыг бүрэн алгасдаг бөгөөд энэ нь энэ алдааны хамгийн түгээмэл хэлбэр: клиент OpenVPN хүрээг хүлээж буй сонсогчтой гар барилт нээдэг тул холболт нээгдээд дараа нь гацаж болно. Орчуулсан портыг санах ойтой биш, бүрхүүлийн тохиргооны файлтай тулгаж баталгаажуулна уу, учир нь тэр файлыг дараа засах хүн өөр дугаар сонгосон байж болно. Доорх хоёр команд нь энэ асуултын хоёр талыг нэгэн зэрэг харуулна.

grep -nE '^[[:space:]]*(accept|connect)' /etc/stunnel/stunnel.conf
ss -lntp | grep -E ':443|:8443|:1194'

Таныг татгалзах холболтын хаяг

127.0.0.1-д холбогдсон accept мөр нь зөвхөн хост өөрт нь хариулдаг тул LAN хаяг руу ирсэн дамжуулалт холбогдож чадахгүй бөгөөд клиент пакет шүүлтүүрийн асуудал мэт сонсогдох татгалзлыг харна. Галт ханыг хүрэхийн өмнө залгуурыг хараарай, учир нь залгуур нь илүү хямд хариулт. Эсвэл бүрхүүлийг дамжуулалтын онилж буй интерфейст холбоно уу, эсвэл loopback дээр үлдээж, дамжуулалт үнэхээр ажилладаг зүйлээр дамжин loopback-д хүрэх боломжийг олгоно уу. Эдгээр нь хоёр загвар бөгөөд тус бүр өөрийн дүрмийг шаарддаг.

Тэдгээрийг холих нь ажиллаж буй бүрхүүл гаднаас хүрэхгүй болох арга бөгөөд файл бүр зөв харагдана. Доорх шалгалт нь нэг команд бөгөөд галт ханын дүрмийн хяналт хариулж чадахгүй асуултад хариулна. Хэрэв гаралт loopback хаяг харуулж, дамжуулалт LAN хаяг руу чиглэсэн бол засвар нь accept мөрөнд хамаарна, пакет шүүлтүүрт биш.

ss -lntp '( sport = :8443 )'

Локал тест үнэхээр юу нотолсон бэ

Өөрийн хамхсан харайлтыг тэмдэглээгүй бүртгэсэн амжилт нь бусад харайлтын талаар нотолгоо болохгүй. Тест ямар хаяг ашигласан, аль процесс хариулсаныг тэмдэглээрэй. Дараа нь ижил Wi-Fi дээрх утаснаас биш, сүлжээний гаднаас давтана уу, учир нь үсний тээгний зан төлөв чиглүүлэгч бүрт өөр бөгөөд LAN-аас хэзээ ч гараагүй холболт дамжуулалт огт оролцохгүйгээр клиентийг хангаж чадна. Зөвхөн тэр хоёр дахь оролдлого л танихгүй хүний явдаг замыг дасгалжуулна.

Оролдлого бүтэлгүйтвэл нэг холболтыг хоёр логт дагана уу: бүрхүүлийн хүлээн авсан ба холбогдсон мөрүүд, дараа нь VPN демоны өөрийн сешн лог. Юу ч бүртгэхгүй эхний хил нь дараагийн өөрчлөлтийн газар. OpenVPN түншийн тохиргоог харьцуулж эхлэхэд тэр мессежүүдийг тухайн хэрэгжүүлэлтийн дүрмээр үнэлнэ үү. link-mtu зөрүүгийн анхааруулга автоматаар үхлийн биш, link-mtu-г 1500-д бэхлэх нь хуваагдал зогссоныг нотлохгүй, шифрийн хэлэлцээр нь чиглүүлэгчийн дамжуулалт биш, OpenVPN-ийн дотоод тохиргоонд хамаарна.

nc -vz 127.0.0.1 1194
journalctl -u stunnel -n 50 --no-pager

Эдгээр туршилт нь backend залгуур ба бүрхүүлийн логийг хамарч, татгалзсан backend-ийг татгалзсан гар барилтаас ялгана. Оролдлого явагдаж байх үед ажиллуулна уу, дараа нь биш. Нэг оролдлогын цагийн тэмдэглэгээ л харьцуулалтыг итгэмжлэхүй болгоно.

Хоёр таних, хоёр бүтэлгүйтлийн дараалал

Гадаад гэрчилгээ нь бүрхүүлд, дотоод таних нь OpenVPN-д хамаарах бөгөөд тэд өөр байгууллагаас ирж болно. Замыг эрүүл харагдуулахын тулд хоёр шалгалтын аль нэгийг унтраах нь бодит хамгаалалтыг гадаад төрхөөр солино. Хоёр шалгалтыг хоёуланг нь хадгалж, дарааллаар нь дибаг хийгээрэй, учир нь мессежийн дараалал давхаргыг нэрлэнэ: бүрхүүлийн гэрчилгээний асуудал аливаа VPN сонголт хэлэлцэхээс өмнө гарч ирдэг бол дотоод танихын бүтэлгүйтэл урсгал тогтсоны дараа л гарч ирнэ.

stunnel гарын авлага accept, connect болон клиент горимыг нарийн тодорхойлдог бөгөөд эдгээр хэсэг залгуурын асуултад таамаглахаас хурдан хариулна. Аль давхарга хариулсаныг одоо хүртэл хэлж чадахгүй бол доорх командаар нийтийн портын танилцуулж буй гэрчилгээг уншина уу. Гаралтад бүрхүүлийн гэрчилгээ байвал дамжуулалт бүрхүүлд хүрсэн гэсэн үг, харин чимээгүй байдал эсвэл протоколын алдаа бол хүрээгүй гэсэн үг. Тэр ганц ялгаа энд бусад ямар ч шалгалтаас илүү цаг хэмнэнэ.

openssl s_client -connect vpn.example:443 -servername vpn.example </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer

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