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

DNAT дүрэм очих газрыг дахин бичээд тэнд зогсдог

Linux гарц дээр үйлчилгээ нийтлэх гэдэг нь nat хүснэгтийн PREROUTING гинжин дэх дүрэм, эсвэл nftables дэх түүнтэй адил зүйл. Дүрэм нийтийн хаяг, порттой таарч, дараа нь очих газрыг програмын хувийн хаяг руу дахин бичнэ. Эх хаяг, эх порт, ачаалал хөндөгдөхгүй, conntrack зураглалыг бичдэг тул хариу гарч байхдаа дахин бичигдэнэ. Энэ зан төлөв нь RFC 3022-т тайлбарласан уламжлалт хаяг хөрвүүлэх загвар юм.

sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 443 \
  -j DNAT --to-destination 10.20.30.40:443
sudo iptables -t nat -L PREROUTING -n -v
sudo conntrack -L -p tcp --dport 443

Програмын сонсогч холболт хөрвүүлэлтээр ирснийг хэзээ ч мэдэхгүй. Клиентийн бодит эх хаягийг хардаг, энэ нь нэвтрэлтийн бүртгэл, хурдны хязгаарт хэрэгтэй, хувийн хаяг руу хариулдаг, учир нь conntrack зураглалыг эргүүлдэг. Тэр зам дээр юу ч тайлж, дахин шифрлэхгүй: TLS клиент ба програмын өөрийн гэрчилгээний хооронд үргэлжилж ажиллана.

Дүрэм нь дараа тааралдах алдааны горимуудыг ч тодорхойлдог. Гарц дамжуулж байгаа ч програмын хост клиент рүү буцах замгүй бол, хариу буруу эх үүсвэртэй гарч, гар барих зогсдог. Хэрэв хоёр дахь дүрэм эхэлж таарвал дараалал үр дүнг шийднэ, iptables -t nat -L -n -v аль дүрэм пакетыг авсныг нотлох тоолуурыг харуулна.

Туннель пакетыг сонсогч харахаас өмнө ороодог

VPN програмыг огт нийтлэхгүй. Клиент гарцын нийтийн хаяг руу хаягласан гадаад пакет байгуулж, доторх пакетыг дотроо шифрлэдэг, гарц нь тайлж, дотоод пакетыг хувийн очих газар руу чиглүүлдэг. WireGuard-д гадаад тээвэр нь UDP, ихэвчлэн өндөр порт дээр; OpenVPN TCP 443 дээгүүр бол гадаад пакет замыг ажиглаж буй бүхэнд TLS мэт харагдана.

Туннель дотор дотоод пакет хувийн хаягуудыг хадгална: клиентийн туннелийн хаяг, жишээ нь 10.8.0.6, програмыг 10.20.30.40 дээр. Тиймээс сонсогч туннелийн сангаас эх үүсвэр харж, клиент бүр тэр гарцыг дараагийн үсрэлт болгон хуваалцдаг. VPN-ийн ард байгаа нэвтрэлтийн бүртгэл хэрэглэгчийн оронд гарцыг ихэвчлэн харуулдаг нь яг энэ шалтгаанаас, гарц анхны эх үүсвэрийг хадгалахгүй бол.

Ороолт нь толгойн зайг зарцуулдаг, энэ нь хэмжигдэх үр дагавартай цорын ганц механизмын түвшний ялгаа. Гадаад IP толгой нэмэх UDP нэмэх WireGuard-ийн өөрийн толгой зам MTU-гаас иддэг тул том пакетыг хуваах эсвэл дотоод TCP стекийн MSS-ийг хязгаарлах хэрэгтэй. Дамжуулсан зам дээр ажилладаг дамжуулалт, завсрын төхөөрөмж бага MTU-г мэдэгдэх ICMP-г хаясан үед туннель дээр гацаж болно.

ip route get 10.20.30.40
ping -M do -s 1400 10.20.30.40
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --clamp-mss-to-pmtu

Илрэлт нэвтрэх хэсэгт тодорхойлогдоно, шифрээр биш

Хоёр загвар нэг TLS сонсогч дээр дуусдаг тул хоёулаа нэг гэрчилгээ, нэг протоколын хувилбар, нэг програмын нэвтрэлтийг өвлөнө. Өөрчлөгдөх нь хэнд гар барих эхлүүлэх зөвшөөрөл байгаа вэ. Нийтийн дамжуулалтад 203.0.113.10:443-д хүрсэн ямар ч хост таны програмын зөвшөөрөл шалгагдахаас өмнө TCP гар барих, TLS ClientHello авдаг. Зөвхөн туннелээр нэвтрэхэд сонсогчид гарцын туннель рүү чиглүүлдэг хаягуудаас л хүрч болно, харийн SYN гарцын бодлого дээр үхдэг.

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

Сонсогч ба бодлогыг тус тусад нь шалга, учир нь аль ч нь таны бодсоноос өргөн байж болно:

sudo ss -ltnp 'sport = :443'
sudo nft list ruleset
openssl s_client -connect 203.0.113.10:443 -servername files.example.com </dev/null

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

Замыг хэмж, шошгыг биш

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

curl -sS -o /dev/null -w '%{time_connect} %{time_appconnect} %{time_total}\n' \
  https://files.example.com/report.pdf
mtr -rwc 20 203.0.113.10
mtr -rwc 20 10.20.30.40

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

Үйлчилгээнд үнэхээр хэрэгтэй нэвтрэх бодлогыг сонго, дараа нь хэмжсэн ялгаа түүнийг өөрчлөхийг зөвтгөх эсэхийг шийд. Нийтийн дамжуулалт нээлттэй интернетийн зориулалттай үйлчилгээнд тохирно, эх үүсвэрийн хязгаарлалт, шинэчлэгдсэн TLS, урд нь хяналттай. Зөвхөн туннелээр нэвтрэх нь хэрэглэгчид нь аль хэдийн бүртгэгдсэн дотоод хэрэгсэлд тохирно, гарцын чиглүүлэлт, програмын зөвшөөрөл хоёулаа бүх LAN-аас нарийхан бол.

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

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