VPN-ийнхээ дээгүүр SOCKS прокси хэлбэрээр SSH-ийн динамик дамжуулалт
Зөвхөн SOCKS ярьдаг програмын хувьд энгийн VPN дээр проксигийн төгсгөлийн цэг байхгүй. Хоёр үсрэлт, нэг loopback сонсогч, SSH сервер өөрөө хийх ёстой нэг нэр хайлт.
Зөвхөн SOCKS ярьдаг програмын хувьд энгийн VPN дээр ярих зүйл байхгүй, учир нь туннель пакетуудыг зөөдөг, программ нь проксигийн төгсгөлийн цэг хүсдэг. OpenSSH энэ цэгийг хандалтын эзэн зөвшөөрвөл өгч чадна, учир нь динамик дамжуулалт нэг SSH сессийг локал прокси болгоно. Дараа нь хоёр үсрэлтийг тус тусад нь барих ёстой: SSH хостод хүрэх туннель болон тэр хост цааш нээх холболт. Тэдгээрийг салгах нь энэ зохион байгуулалт яагаад ажилладаг, мөн юуг хэзээ ч хийхгүйг тайлбарлана.
SSH сонсогч юу болох, юу болохгүй
Динамик дамжуулалт SSH клиентийг локалаар сонсож, холбогдож буй бүхэнтэй SOCKS4 эсвэл SOCKS5 ярихыг албадна. Хүсэлт бүр очих газрыг нэрлэж, SSH сервер цаашдын холболтыг нээнэ, тиймээс очих газрын хайлт нөгөө талд явагдаж болно. Энэ нь програмын түвшний TCP дамжуулалт бөгөөд бүх төхөөрөмжийн VPN биш. Энэ нь UDP холбоо, ICMP, прокси тохиргоог бүрэн үл тоомсорлодог програмуудад юу ч зөөхгүй. SSH серверээс программ руу хүрэх үсрэлт ч таны туннелийн дотор биш бөгөөд очих газар зөвхөн мэдэгдэх сүлжээнээс трафик хүлээж авах үед энэ нь чухал.
Урьдчилсан нөхцөл бодит: SSH хост руу чиглэсэн зам, зөвшөөрөгдсөн бүртгэл, баталгаажсан серверийн хост түлхүүр, дамжуулах зөвшөөрөл. Тэдгээрийн аль нэгийг нь прокси үүсгэхгүй, сүүлийнх нь ихэвчлэн хамгийн түрүүнд дутагдана. Бусдыг оношилгохоос өмнө дөрвийг нь баталгаажуулаарай, учир нь клиентийн талаас алдаа адилхан харагдана, аль нь дутагдсан ч.
Үүнийг loopback дээр тодорхой порттой эхлүүлээрэй
Ашиглагдаагүй локал порт сонгоод, хаягийг орхихын оронд түүнийг loopback-т тодорхой уяарай. Доорх гурван сонголт тус бүр нэг шалтгаанаар оршино.
ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
[email protected]
-N алсын командыг алгасч, -T псевдотерминалыг алгасна, тиймээс сесс зөвхөн дамжуулахад зориулагдсан. ExitOnForwardFailure сонсогчийг үүсгэх боломжгүй үед клиентийг гаргана, таны хүссэн дамжуулалтгүйгээр ажиллахын оронд. ControlPath=none сессийг өөрийн дамжуулалтуудыг нэмж болох одоо байгаа мультиплекс холболтоос гадуур барина. Loopback сонсогчийг LAN-аас гадуур барина, гэхдээ хуваалцсан машин дээр энэ нь зөвшөөрлийн хил биш, учир нь бусад локал процессууд ч хүрч чадна. OpenSSH клиентийн лавлагаа эдгээр бүх флагийг баримтжуулдаг бөгөөд loopback-ийн анхааруулга нь сонсож буй сокет гэж юу вэ гэдгээс гаралтай.
Нэрсийг проксигоор дамжуулж илгээ, тойруулан биш
SOCKS5 клиент очих газрыг өөрөө шийдэж эсвэл проксигоос хүсч болно, энэ сонголт аль шийдэгч хариулахыг тодорхойлно. socks5h-тэй curl хостын нэрийг проксигоор дамжуулна, тиймээс хайлт SSH сервер дээр болно. Энгийн socks5-той үед зөөврийн компьютер эхлээд шийдэж, зөвхөн холболт явна, энэ нь нэр дотоод байх үед зорилгыг чимээгүйхэн устгана. Доорх хүсэлт проксигүй жагсаалтыг ч цэвэрлэнэ, тиймээс өвлөгдсөн NO_PROXY утга түүнийг проксигийн тойруулан хөтлөх боломжгүй.
curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health
Гэрчилгээний баталгаажуулалт болон програмын өөрийн нэвтрэлт хүчинтэй хэвээр, учир нь прокси аль нэгийг нь орлохгүй. Хоёр хайлт үлдэнэ: зөөврийн компьютер зөвшөөрөгдсөн VPN болон DNS замаар SSH хостод хүрэх ёстой, SSH сервер програмын нэрийг өөрөө шийдэх ёстой. Хоёр дахь нь ямар ч трафик проксигоор гарахаас өмнө тусдаа туршиж болно.
ssh [email protected] getent hosts app.corp.example
Нэг зөвшөөрөгдсөн очих газрыг батал, дараа нь сессийг хаа
Бодлого зөвшөөрдөг очих газар болон түүнийг татгалзах ёстой газрыг туршаарай, учир нь ажиллаж буй дамжуулалт нь сонсогч ажиллаж байгааг л батална, үүнээс өөр юу ч биш. Програм SSH серверийн сонгосон эх хаягийг хардаг бөгөөд энэ нь таны зөөврийн компьютерын туннелийн хаяг биш. Алсын тал холболтыг эхээр нь бүртгэдэг бол хүсэлт татгалзагдах үед хамгийн түрүүнд шалгах зүйл нь тэр ялгаа юм.
Сессийг түүний эзэн процессоор зогсоо, хамааралгүй shell-ийг алж биш. Дараа нь сонсогч явсныг батал, учир нь одоо ч хариу үйлдэл үзүүлж буй порт бол таны үнэхээр хаагаагүй сесс юм. Зөвхөн энэ дасгалын оруулсан прокси тохиргоог л устгаж, програмын бусад тохиргоог хэвээр үлдээ. Дамжуулалтын дүрэм барьсан хяналтгүй терминал үйлчилгээ биш бөгөөд байнгын проксид зөвшөөрөгдсөн амьдралын мөчлөг хэрэгтэй, мартсан цонх биш.
ss -ltn | grep 1080
Энэ зохион байгуулалт засаж чадахгүй алдаа
Зарим шинж тэмдэг дээрх хязгаарт шууд заадаг бөгөөд тэдгээрийг эрт таних нь прокси оношилгооны нэг үдээс хойш цагийг хэмнэнэ. Хүснэгт таны харж буй зүйлийг энэ нь ихэвчлэн юу гэсэн үг вэ гэдэгтэй холбоно. Сүүлийн баганад байгаа бүхэн дизайны асуулт, тохиргооны алдаа биш.
| What you see | What it usually means | Where to look |
|---|---|---|
| The app connects and nothing follows | It ignores proxy settings entirely | Its own network settings, not the SSH session |
| A name resolution error for the destination | The SSH server cannot resolve it | Server resolver and search domains |
| A UDP-only application fails | Dynamic forwarding carries TCP only | This arrangement cannot serve it |
| curl works, the browser does not | The browser is not using the socks5h endpoint | Browser proxy configuration |
| The listener answers after the session ended | Another process owns port 1080 | The ss output, then the owning process |
Эхний гурван мөр бол хүмүүс буруу оношилдог мөрүүд, учир нь тус бүр нь проксигийн тухай алдаа биш харин холболтын оролдлого үүсгэдэг. Зөөврийн компьютер дээр шийдэгддэг нэр нь серверийн шийдэгчийн тухай юу ч хэлэхгүй бөгөөд алдаа нь оронд нь гэрчилгээ эсвэл хугацааны хязгаарын асуудал гэж уншигдана. Зөвхөн UDP-тэй програмууд дизайны гадна зогсдог, дотор нь эвдэрсэн биш, ямар ч нэмэлт ssh сонголт үүнийг өөрчлөхгүй. Хөтчийн мөр нь прокси тохиргоо програм бүрд тусдаа гэдгийг сануулдаг ердийн зүйл. Сүүлийн мөр нь хаалтын шалгалт яагаад байгааг харуулна: одоо ч сонсож буй порт нь одоо өөр зүйл түүнийг эзэмшиж байна гэсэн үг.