Операторын NAT-ын ард байгаа зөөврийн компьютер ч хамт олонд үйлчилж чадна, хэрэв VPN сервер уулзах цэг болвол. Тэнд хоёр механизм хүргэдэг: клиент гадагш холбогдож серверээс сонсох порт бариулахыг хүсдэг, эсвэл сервер порт зарлаж хонгил руу хөрвүүлдэг. Хоёулаа ижил хүртээмжийн асуудлыг шийддэг бөгөөд алдаа, хяналт, лог бичилтийн үед өөрөөр ажилладаг. Аль нь таны тохиргоонд тохирохыг гурван нөхцөл тодорхойлно.

Хоёр хэлбэр, нэг уулзах цэг

Эхний хэлбэрт клиент гадагш SSH сесс нээж, серверээс сонгосон порт дээр сонсохыг хүсдэг бөгөөд холболт бүрийг тэр сессээр буцааж илгээдэг. Сервер дээр юу ч дамжуулагдахгүй, пакет хөрвүүлэлт болохгүй тул цорын ганц шаардлага нь SSH бүртгэл, зөвшөөрөгдсөн дамжуулалт, портын галт ханын дүрэм юм. Үйлчилгээ клиент дээр loopback-д холбогдсон хэвээр үлддэг бөгөөд энэ нь ихэвчлэн хүссэн зүйл юм.

ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]

Хоёр дахь хэлбэрт нийтийн портыг сервер эзэмшиж, холболт бүрийг клиентийн хонгилын хаяг руу дахин бичдэг. Үүнд IP дамжуулалт идэвхтэй байх, орох үед очих газрын хөрвүүлэлт, гарах үед эх үүсвэрийн хөрвүүлэлт шаардлагатай бөгөөд SSH сесс байхгүй үед ч ажилласаар байна. Порт сессэд биш, серверт хамаарна, энэ шинж чанар нь бодит тохиолдлын ихэнхийг шийддэг.

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

Нэгдүгээр нөхцөл: порт сессээс урт насалдах ёстой юу

Урвуу дамжуулалт нь түүнийг үүсгэсэн SSH сесс хэр удаан үргэлжилнэ, яг төдий хугацаанд л амьдардаг. Холбоо тасрах үед сонсогч алга болж, хамт олон удаан зам биш харин татгалзсан холболт хардаг. Командыг systemd нэгж ба дахин ачаалах бодлоготойгоор хянах нь үүнийг засдаг бөгөөд ExitOnForwardFailure=yes бүтэлгүй холболтыг даруй харагдахуйц болгож, дамжуулалтгүй ажиллаж буй сессийг үлдээхээс зайлсхийдэг.

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

Хэрэв үйлчилгээ шөнийн гурван цагт хэн ч харахгүйгээр хариулах ёстой бол серверийн зарласан порттой хэлбэр нь хөдөлгөөнт хэсэг багатай, учир нь ажиллаж байх ёстой цорын ганц процесс бол хонгил өөрөө.

Хоёрдугаар нөхцөл: галт хана, логийг хэн эзэмшдэг

Урвуу хэлбэр нь бүх бодлогыг хоёр газарт хадгалдаг. sshd AllowTcpForwarding-аар дамжуулан алсын дамжуулалт ерөнхийдөө зөвшөөрөгдсөн эсэхийг шийддэг, GatewayPorts сонсогч loopback эсвэл бүх хаягт холбогдохыг шийддэг. Өгөгдмөл no утгатай үед серверийн гаднах хамт олон дамжуулалт амжилттай болсон ч портод хүрч чадахгүй бөгөөд энэ нь эвдэрсэн хонгил мэт харагдана, үнэндээ холболтын хаяг юм.

sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config

Хөрвүүлсэн хэлбэрт идэвхтэй дамжуулалт болон хоёр дүрэм шаардлагатай бөгөөд хоёр дахь дүрэм нь ихэнх заавар алдаа гаргадаг газар. Эх үүсвэрийн хөрвүүлэлтийг conntrack-ийн DNAT төлөвөөр хязгаарлах нь очих газрын дүрмээр үүсгэсэн холболтууд л дахин бичигдэнэ гэсэн үг, серверийн хонгил руу илгээдэг пакет бүр биш.

sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8081 -j DNAT --to-destination 10.88.0.6:8080
sudo iptables -t nat -A POSTROUTING -o tun0 -m conntrack --ctstate DNAT -j SNAT --to-source 10.88.0.1

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

Гуравдугаар нөхцөл: нэг порт уу, олон уу, нэрийг хэн эзэмшдэг

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

Нэрс үүнийг улам хүндрүүлдэг. Урвуу дамжуулалт нь SNI-аар чиглүүлдэг TCP проксигийн ард байж болно, харин хөрвүүлсэн порт нь ихэвчлэн үйлчилгээ тус бүрт нэг порт байдаг. Хэрэв үйлчилгээ өөрөө TLS-ийг дуусгаж, анхны хост нэрийг шаарддаг бол прокси арга түүнийг хадгалдаг, DNAT арга нь үйлчилгээ тэр нэрийг тэр порт дээр хүлээж авбал л хадгалдаг.

Гурван нөхцлийн аль нь хэлбэрийг тодорхойлсныг бичиж үлдээгээрэй. Эс тэгвэл хоёр дахь үйлчилгээ нэмэх дараагийн хүн ижил харьцуулалтыг бага контекстээр дахин нээх болно.

Шийдээд, дараа нь гаднаас туршаарай

Зөөврийн компьютерт хүрэх ямар ч замгүй сүлжээнээс замыг туршаад, хүсэлт ажиллаж байх үед серверийн тоолуурыг ажиглаарай. Серверээс өөрийнх нь нийтийн хаяг руу турших нь энд юу ч нотлохгүй, учир нь пакет локалд үүсдэг бөгөөд орж ирэх хөрвүүлэлтийн дэгээнд хэзээ ч хүрдэггүй тул бодит зам эвдэрсэн ч туршилт тэнцэж болно.

sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20

Хөдөлгөөнгүй үлдсэн тоолуурууд пакет дүрэмд хэзээ ч хүрээгүй гэсэн үг бөгөөд энэ нь нийлүүлэгч эсвэл хостын галт хана руу заана. Үйлчилгээ татгалзаж байхад хөдөлж буй тоолуурууд клиентийн өөрийн галт хана эсвэл үйлчилгээ сонсож буй хаяг руу заана. Пакетыг зөөж, гэхдээ юу ч буцаадаггүй хонгил нь зам эсвэл буцах замын асуудал юм, мөн эдгээр гурван үр дүнгийн алийг ч клиентийн адаптерыг засаж дибаг хийх ёсгүй. Ямар нэгэн зүйл өөрчлөхөөс өмнө аль тоолуур хөдөлснийг бичиж үлдээгээрэй, учир нь дараагийн туршилтад тэр суурь шугам хэрэгтэй.

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

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