VPN-ээр зөвхөн нэг хувийн дэд сүлжээг хэрхэн дамжуулах вэ
Клиент дээрх маршрут, серверийн түлхэх маршрут болон хэлэлцсэн селекторуудын аль нэгийг сонгоод, бүрэн туннельгүйгээр нэг хувийн дэд сүлжээг дамжуулна.
Туннелээр нэг хувийн дэд сүлжээг дамжуулж, бусад бүхнийг ердийн замаар явуулах нь жижиг хүсэлт боловч буруу хийх олон арга бий. Үр дүнг split tunneling гэсэн шошготой чагтлах хайрцаг биш, харин шийдвэр хаана хэрэгжиж байгаа нь тодорхойлно: клиентийн өөрийн маршрутын хүснэгт, серверийн түлхэх маршрут эсвэл хоёр талын хэлэлцэх бодлого. Буруу давхаргыг сонговол та хэзээ ч хүсээгүй бүрэн туннель эсвэл нөгөө тал хүлээн авахаас татгалзсан туннель рүү чиглэсэн маршрут авна. Би аливаа тохиргоог нээхийн өмнө гурван нөхцөлт шалгалт хэрэглээд, дараа нь доорх механизмуудын аль нэгийг сонгодог.
Загварыг тодорхойлох гурван нөхцөл
Нэгд, танд сүлжээний эзэмшигчээс нарийн префикс, маск хэрэгтэй. 10.x сүлжээ нь префикс биш; 10.20.0.0/16 нь префикс. Энэ нь таны гэрийн LAN, Docker гүүр эсвэл таны ажиллуулж буй өөр VPN-тэй давхцахгүй гэдгийг баталгаажуулна уу, учир нь давхцал маршрутыг хоёрдмол утгатай болгож, цөм нь таны санаагүй бичлэгийг сонгоно.
Хоёрт, буцах урсгалд хэн хариулах вэ. Багцыг туннель рүү чиглүүлэх нь зөвхөн VPN сервер хүртэл хүргэдэг. Хэрэв дэд сүлжээ нь таны клиентийн сан руу буцах маршрутгүй өөр чиглүүлэгчийн ард байвал сервер урсгалыг масклах ёстой, эсвэл тэр чиглүүлэгч таны санг сурах ёстой. Клиентийн талын ямар ч маршрут дутуу буцах замыг засдаггүй.
Гуравт, хэрэгжүүлэх цэг. Зарим клиент маршрут суулгадаг, үлдсэнийг нь үйлдлийн систем хийдэг. Зарим нь бодлогын талаар хэлэлцдэг бөгөөд гарц хүлээн авахгүй бодлого огт туннель үүсгэдэггүй: багцууд тодорхой алдаагүйгээр хаягдана. Ямар нэгэн зүйл бичихийн өмнө энэ хоёрын аль нь таных болохыг тодорхойл.
WireGuard: AllowedIPs бол маршрутын хүснэгт
Клиент дээр AllowedIPs нь туннельд орохыг зөвшөөрсөн очих газруудыг жагсааж, wg-quick нь бичлэг бүрийг энгийн маршрут болгоно. Тиймээс энэ ажлын клиентийн тал нэг мөр.
[Peer]
PublicKey = ...
Endpoint = vpn.example.net:51820
AllowedIPs = 10.20.0.0/16Одоо мөн тэр клиентийн серверийн бичлэгтэй харьцуул. Энэ нь сервер клиент рүү юу илгээхийг тайлбарладаг бөгөөд энэ нь ихэвчлэн клиентийн туннелийн хаяг, хувийн дэд сүлжээ биш.
[Peer]
PublicKey = ...
AllowedIPs = 10.99.0.2/32Энэ хоёрыг солих нь миний хамгийн их хардаг алдаа. 10.20.0.0/16-г серверийн peer хэсгийн доор тавих нь бүх дэд сүлжээ тэр клиентийн ард байна гэж мэдэгдэх бөгөөд энэ нь зөвшөөрөл биш, харин байршлаас байршилд гэсэн шаардлага. Аливаа peer-ийн AllowedIPs-тэй тохирохгүй багцууд чимээгүй хаягдаж, тиймээс буруу бичлэг яг галт ханын асуудал мэт харагдана.
Хэрэв маршрутыг өөрөө удирддаг бол [Interface]-ийн доор Table = off тохируулаад хүссэн маршрутаа нэм. Тэгвэл юу ч автоматаар нэмэгдэхгүй тул маршрут нь интерфейсийг босгож буй зүйлийн дотор байх ёстой.
OpenVPN: маршрутыг түлхээд, дараа нь хүрсэн эсэхийг шалга
Энгийн сервер дээр өөрчлөлт нь серверийн тохиргоон дахь клиентийн сангийн дэргэдэх нэг заавар.
push "route 10.20.0.0 255.255.0.0"Клиент холбогдох үед үүнийг нэмдэг. Алдааны горим нь мөн тэр профайл redirect-gateway-г түлхэх үед, эсвэл хэн нэгэн өмнө нь route-nopull нэмсэн үед илэрдэг: эхнийх нь сессийг бүрэн туннель болгож, хоёр дахь нь таныхыг оролцуулан түлхсэн бүх маршрутыг хаяна.
Бүрэн туннельт серверийн эсрэг нарийн зан төлөв шаардлагатай клиент зөвхөн хүсээгүй хэсгүүдийг нь үл тоомсорлох ёстой. OpenVPN 2.4 ба түүнээс хойшхи хувилбарт pull-filter яг үүний төлөө байдаг.
pull-filter ignore "redirect-gateway"
route 10.20.0.0 255.255.0.0Хаягийн гэр бүлүүдийг тусдаа бариарай: түлхсэн IPv4 маршрут нь IPv6 руу шийдэгддэг дотоод үйлчилгээнд юу ч хийдэггүй бөгөөд тэр үйлчилгээ туннелээр бүтэлгүйтэх боловч бусад бүхэн хэвийн харагдана.
Хувийн дэд сүлжээ VPN сервер дээр биш, өөр клиентийн ард байвал серверт мэдэгдэх ёстой. client-config-dir-аар дамжуулан клиент бүрт iroute 10.20.0.0 255.255.0.0 агуулсан файл нэмж, мөн тохирох route-г нэмснээр бусад клиентүүд замыг сурна. iroute гүйгээр серверт тэр префиксийг яг тэр туннелээр илгээх ямар ч шалтгаан байхгүй.
IPsec: урсгалын селекторууд санал нийлэх ёстой
IPsec-д түлхэх маршрут байхгүй. Хоёр тал туннелийн дотор ямар хаягууд байхыг хэлэлцэж, тохирсон селекторуудаас гадуурх урсгал шифрлэгдэхгүй бөгөөд түүгээр дамжихгүй. strongSwan клиент дээр селекторууд тодорхой байдаг.
leftsubnet=192.168.1.0/24
rightsubnet=10.20.0.0/16Хэрэв гарц хоёр талд 0.0.0.0/0-той тохируулагдсан бол IKEv2-ийн нарийсгал нь ихэвчлэн хүү SA-г хоёр саналын огтлолцол хүртэл бууруулдаг бөгөөд энэ нь хүссэн үр дүн. Зарим гарц үүний оронд өөрийн тохируулсан селекторуудтай тохирохгүй саналыг татгалздаг бөгөөд лог нь маршрутын гомдол биш, бүтэлгүйтсэн хүү SA харуулна. Ийм үед өөрчлөлт нь гарцад хамаарах бөгөөд, клиентийн маршрут нь нөгөө тал хүлээн авахгүй селекторын туннель үүсгэж чадахгүй.
Windows дээр суурилагдсан клиент ижил шийдвэрийг хоёр тохиргооны цаана нуудаг. Туннелийн хуваалт асаалттай байх ёстой бөгөөд префикс нь профайлд бүртгэгдсэн байх ёстой.
Set-VpnConnection -Name Office -SplitTunneling $true
Add-VpnConnectionRoute -ConnectionName Office -DestinationPrefix 10.20.0.0/16Префиксийг бүртгэх нь түүнийг дахин холбогдсоны дараа ч үлдээх зүйл бөгөөд гараар нэмсэн маршрут үүнийг хийдэггүй.
Төгсгөлийн цэг болон DNS-ийг шийдвэрээс гадуур бариарай
VPN-ийн төгсгөлийн цэг туннельгүйгээр хүрч болохоор байх ёстой, эс бөгөөс туннель өөртөө нуран унана. Зөвхөн 10.20.0.0/16 маршрутлагдсан үед энэ нь автомат, учир нь төгсгөлийн цэг нь нийтийн хаяг. Бүрэн туннель профайлд тийм биш бөгөөд туннель босохоос өмнө клиентэд төгсгөлийн цэг рүү тодорхой хост маршрут хэрэгтэй.
DNS нь маршрут түлхэлт таны оронд гаргахгүй хоёр дахь шийдвэр. Дотоод нэрс ихэвчлэн зөвхөн хувийн сүлжээ хүрч чадах шийдвэрлэгчээр шийдэгддэг. Хэрэв сервер DNS сервер түлхэж байвал нэр бүр түүгээр дамжина; түлхэхгүй бол дотоод нэрс бүтэлгүйтэх эсвэл олон нийтэд таны санаагүй зүйл рүү шийдэгдэнэ. Хуваагдсан DNS нь дотоод шийдвэрлэгч дээр нэг хайлтын домэйн хадгалдаг, гэхдээ энэ нь клиентийн дэмжлэгээс хамаардаг тул үүнийг маршрутлалын гаж нөлөө бус, тусдаа ажил гэж үзээрэй.
Шалгаад, дараа нь дахин ачаалж дахин шалга
Гурван шалгалт маршрутлалын асуудлыг хамрана. Цөмөөс алслагдсан хаяг хаашаа явахыг асууж, дэд сүлжээний дотроос ямар нэг зүйл татаж, дараа нь энгийн нийтийн хүсэлт ердийн холболтоор гарсаар байгааг батал.
ip route get 10.20.5.7
curl -sS http://10.20.5.7/health
curl -sS https://ifconfig.meЭхний мөр интерфейсийг нэрлэнэ. Хэрэв таны физик интерфейсийг нэрлэвэл маршрут хэзээ ч суугаагүй. Windows дээр Find-NetRoute -RemoteIPAddress 10.20.5.7 мөн адил асуултад хариулж, сүүлийн шалгалт нь VPN серверийн биш, таны ердийн хаягыг харуулах ёстой.
Дараа нь дахин ачаал. Гараар нэмсэн маршрутууд алга болдог бол профайл, түлхсэн тохиргоо эсвэл AllowedIPs-аас ирсэн маршрутууд буцаж ирдэг. Хэрэв нарийн хандалт дахин ачаалахаас өмнө ажиллаад дараа нь бүтэлгүйтвэл гэмтэл нь маршрутад бус, туннель хэрхэн эхлэхэд байна.
Дууссан гэж хэлэхийн өмнө дөрвөн зүйлийг батал: префикс нь сүлжээний эзэмшигчээс ирсэн бөгөөд орон нутгийн юутай ч давхцахгүй, буцах зам байгаа эсвэл масклах дүрэм түүнийг орлоно, таны тохируулсан механизм нь таны платформд маршрутлалыг хэрэгжүүлдэг механизм, мөн цэвэр дахин ачаалсны дараа ч мөн тэр шалгалтууд тэнцэнэ. strongSwan-ийн дамжуулалтын тэмдэглэл буцах зам нь байнга бүтэлгүйтдэг хэсэг бол унших нь зүйтэй.