NAT-ын ард байгаа OpenVPN клиент хэрхэн интернэтийн гаралт болдог
Гаралт нь өөрөө гадагш залгадаг тул түүний чиглүүлэгчид орох порт шаардлагагүй. Төв юу чиглүүлж, гаралт юу дамжуулж, буцах зам хаанаас ирдэг болохыг ажиглаарай.
Гурван Linux хост, нэг загвар: олон нийтэд нээлттэй OpenVPN төв, хэрэглэгчийн зөөврийн компьютер, доош юу ч дамжуулдаггүй энгийн гэрийн чиглүүлэгчийн ард байрлах гаралтын машин. Гаралт нь төв рүү өөрөө залгадаг. Дараа нь хэрэглэгчийн интернэт урсгал зөөврийн компьютер дээр туннельд орж, гаралтын өөрийн дээд сувгаар гардаг. Энэ зохион байгуулалтын гайхалтай бүхэн нэг нарийн ширхгээс үүдэлтэй: холболтыг гаралт эхэлсэн тул доош гарах зам аль хэдийн байгаа бөгөөд түүнийг үүсгэхэд порт дамжуулалт шаардлагагүй.
Дараах нь тохиргооны дарааллыг биш, пакетийн замыг ажиглана, учир нь аль бүрэлдэхүүн ямар шийдвэр гаргадгийг мэдсэн тохиолдолд л тохиргоо утга учиртай. Давхарга бүр яг нэг шийдвэр гаргадаг бөгөөд алдаанууд хоёр давхаргыг нэг гэж үздэг газарт хуримтлагддаг.
Хоёр тээврийн сесс, нэг дотоод зам
Хост бүр төв рүү өөрийн гадаад холболтыг хадгалдаг бөгөөд тэдгээрийн аль нь ч нөгөөгийнхөө талаар мэддэггүй. Хэрэглэгчийн интернэт рүү чиглэсэн урсгал нь хэрэглэгчийн туннель дотор тээгдэж, дараа нь гаралтын туннелиас дахин гаргагдах тусдаа дотоод урсгал юм. Төв яг энэ дотоод урсгалыг чиглүүлэх ёстой, гаралт үүнийг дамжуулах ёстой.
outer: consumer --TLS--> hub
outer: exit --TLS--> hub
inner: consumer --tun--> hub --internal--> exit --tun--> uplink
Хоёр гадаад холболт хоёулаа клиентийн талаас гадагш гардаг тул гаралтын чиглүүлэгч хэзээ ч орох SYN хардаггүй, хэзээ ч очих газрын NAT дүрэм шаарддаггүй. Зөвхөн тогтоосон тээврийг амьд байлгах хэрэгтэй бөгөөд үүнийг ямар ч урт холболтын хувьд аль хэдийн хийдэг. Нийтийн интернэтэд юу ч эхлээд гаралт руу хүрэх шаардлагагүй, тиймээс тэр дээд суваг дээрх динамик хаяг нь асуудал биш. Чиглүүлэгч гадагш сессийг зөвшөөрөх ёстой хэвээр, гэхдээ энэ нь хөтөч аль хэдийн ашигладаг зөвшөөрөл юм.
iroute серверийн дотор юу суулгадаг вэ
Аль түнш аль очих газрыг эзэмшихийг төв л шийддэг бөгөөд энэ шийдвэрийг цөмдөө биш, өөрийн хэрэглэгчийн орон зайн чиглүүлэлтийн хүснэгтэд гаргадаг. Гаралтын хувьд exit-node нэртэй client-config-dir бичлэг тэнд өгөгдмөл угтварыг шаардаж болно:
# /etc/openvpn/server/ccd/exit-node
iroute 0.0.0.0 0.0.0.0
Тэр мөр серверийн процессорт "ямар ч очих газартай дотоод пакетууд энэ клиентэд хамаарна" гэж хэлдэг. Энэ нь төвийн үйлдлийн системд өгөгдмөл зам нэмдэггүй, төвийг интернэт гарц болгодоггүй. OpenVPN 2.6 гарын авлага клиентэд хамаарах дотоод чиглүүлэлт болон цөмийн чиглүүлэлтийг тусдаа механизм хэлбэрээр хадгалдаг бөгөөд энэ ялгавар нь загварыг төвийн өгөгдмөл замд хүрэлгүй ажиллах боломж олгодог.
Хэрэглэгчид толин тусгал заавар хэрэгтэй бөгөөд push хэлбэрээр хүргэгдэж, өөрийн урсгал нь орон нутгийн гарцаар гарахын оронд туннельд орох ёстой. Дэд сүлжээний топологийн үед пул нь гаралтын tun төхөөрөмж дээрх холбогдсон зам тул буцах чиглэлд нэмэлт push шаардлагагүй; гаралт авах ёсгүй зүйл бол доорх дахин чиглүүлэлт бөгөөд энэ нь өөрийн дээд сувгийн урсгалыг ашиглах гэж буй туннель руу буцааж илгээнэ. Үүнийг зөвхөн хэрэглэгчид илгээж, CCD файл сонгогдсон гэж итгэхийн оронд клиент дээр хэрэглэсэн замуудыг уншаарай.
# /etc/openvpn/server/ccd/consumer-01
push "redirect-gateway def1"
Дамжуулалтыг гаралтын цөм хийдэг
Гаралтын дотор хэрэглэгчийн пакет tun интерфейс дээр ямар нэг интернэт хост руу хаяглагдан ирдэг. Цөм өөрийн чиглүүлэлтийн хүснэгтийг харж, хамгийн сайн тохирол болгон бодит дээд сувгийг олж, дараа нь хоёр бие даасан бодлого хэрэглэдэг: энэ пакетыг ерөөсөө дамжуулж болох уу, тэр интерфейсээр тэр эх хаягаар гарч болох уу. Дамжуулалт нь sysctl бөгөөд олон түгээлт дээр өгөгдмөлөөр унтарсан байдаг.
Тиймээс гаралтад байнга асаалттай IPv4 дамжуулалт, хэрэглэгчийн туннелийн эхүүдийг дээд суваг руу нэвтрүүлэх дүрэм, tun-аар буцах хариу зам хэрэгтэй. Бүх хостод дамжуулалтыг асаах нь түүгээр чиглэгдэх бусад бүхний зан төлөвийг өөрчилдөг тул дүрэм бүгдийг хүлээн авахын оронд эхүүд, интерфейсүүдийг нэрлэх ёстой.
Буцах замыг эх орчуулга худалдаж авдаг
Интернэт хост 10.90.0.x хаяг руу ямар ч замгүй тул хариунууд гаралтад хүрэхээс өмнө хаягдана. Пакет дээд сувгаас гарах үед эхийг дахин бичих нь үүнийг шийддэг бөгөөд холболтын мөрдөлт буцах замд дахин бичлэгийг эргүүлнэ.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.90.0.0/24 -o enp1s0 -j MASQUERADE
ip -4 route get 10.90.0.9 # run on the exit: must point at the tun
Дээрх дүрэм нь нэг дээд сувгийн интерфейсийн эхлэл бөгөөд галт ханын бодлого биш. Эхийг таны үнэхээр зөвшөөрсөн хуваарилалтад хүртэл нарийсгаж, гаралтын өөрийн оролтын бодлогыг тусдаа байлгаарай, ингэснээр туннелийн урсгалын масклалт орон нутгийн үйлчилгээг чимээгүйгээр ил гаргахгүй. Динамик дээд сувгийн хаягтай хост дээр масклалт нь хаягийг гараар мөрдөхөөс ч чөлөөлнө.
Төв хаана хэрэгжүүлж чадах, хаана чадахгүй
client-to-client болон уламжлалт хэрэглэгчийн орон зайн өгөгдлийн замтай үед төв дотоод пакетуудыг серверийн процессын дотор түншүүдийн хооронд дамжуулдаг. Тэд хэзээ ч төвийн цөмийн FORWARD гинжийг дамждаггүй тул тэндхийн цөмийн дүрэм түншүүдийн хоорондын дамжуулалтыг хичнээн болгоомжтой бичсэн ч хязгаарлаж чадахгүй. Хэрэгжүүлэлт нь серверийн өөрийн бодлогод байх ёстой: хэн холбогдож болох, ямар CCD файл авах, гаралтын өгөгдмөл эзэмшил ерөөсөө олгогддог эсэх.
Тиймээс өгөгдмөл iroute нь өргөн итгэлийн шийдвэр юм. Гаралт дурын интернэт хаягуудаас буцах урсгалыг хууль ёсоор хүлээн авах ёстой бөгөөд таны хянадаг машин байх ёстой. Ижил эзэмшлийг чиглүүлэгч даатгахгүй түншдээ өгөх нь энэ загварын урьж буй алдаа юм.
Гишүүнчлэл бол жинхэнэ хяналт. Өөрийн замаа тохируулж чадах аливаа клиент гаралтыг ашиглахыг оролдож болно, тиймээс хэн холбогдож болох, гаралт аль түншүүдэд үйлчилэхийг хязгаарлах нь загварын хэсэг бөгөөд дараагийн бодол биш.
Гаралт алга болоход аюулгүй бүтэлгүйтэх
Гаралтыг унтраагаарай, дотоод өгөгдмөл эзэмшил сессийн хамт алга болно. Болох ёсгүй зүйл бол төв чимээгүйгээр орлуулах гаралт болох юм: VPN пулаас төвийн дээд суваг руу өгөгдмөл зам байхгүй, төв дээр ижил урсгалыг дуртайяа дамжуулах өргөн масклалтын дүрэм байхгүй. Тэр бүтэлгүйтлийг зориуд шалгаж, дараа нь сэргэлтийг аль хэдийн нээлттэй байсан хуудас биш, шинэ урсгалаар шалгаарай.
# on the consumer, with the exit up and then down
ip -4 route get 1.1.1.1
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com
Гаралт явсны дараа ч хэрэглэгчийн урсгал интернэтэд хүрдэг бол өөр зүйл тээж байгаа бөгөөд таны зорьсон хил байхгүй. DNS болон IPv6-г мөн тусдаа шийдвэр гэж үзээрэй: IPv4 зам ба масклалт нь AAAA урсгалын талаар юу ч хэлэхгүй, төвийн түлхсэн resolver нь асуулга үнэхээр хаанаас гарч байгаагаас хариулна.