Uchta Linux xosti, bitta dizayn: ochiq kirish mumkin OpenVPN markazi, foydalanuvchi noutbuki va ichkariga hech narsa uzatmaydigan oddiy uy routeri ortida turgan chiqish mashinasi. Chiqish markazga o'zi qo'ng'iroq qiladi. So'ng foydalanuvchining internet trafigi noutbukda tunnelga kirib, chiqishning o'z yuqori kanali orqali chiqadi. Bu tartibda ajablantiradigan hamma narsa bitta tafsilotdan kelib chiqadi: aloqani chiqish boshlagan, shuning uchun ichkariga yo'l allaqachon bor va uni yaratish uchun port uzatish kerak emas.

Quyidagi konfiguratsiya tartibini emas, paket yo'lini kuzatadi, chunki konfiguratsiya qaysi komponent qanday qaror qabul qilishini bilgandan keyingina mantiqiy bo'ladi. Har bir qatlam aynan bitta qaror qabul qiladi, xatolar esa ikki qatlam bitta deb hisoblanadigan joyda to'planadi.

Ikki transport sessiyasi, bitta ichki yo'l

Har bir xost markazga o'z tashqi aloqasini saqlaydi va ularning hech biri ikkinchisini bilmaydi. Foydalanuvchining internetga trafigi alohida ichki oqim bo'lib, u foydalanuvchi tunnelida tashiladi va keyin chiqish tunnelidan qayta chiqariladi. Markaz aynan shu ichki oqimni marshrutlashi kerak, chiqish esa uni uzatishi kerak.

outer: consumer --TLS--> hub
outer: exit     --TLS--> hub
inner: consumer --tun--> hub --internal--> exit --tun--> uplink

Ikkala tashqi aloqa ham mijoz tomondan tashqariga chiqadi, shuning uchun chiqish routeri hech qachon kiruvchi SYN ko'rmaydi va hech qachon manzil NAT qoidasiga muhtoj bo'lmaydi. U faqat o'rnatilgan transportni tirik saqlashi kerak, buni u har qanday uzoq aloqa uchun allaqachon qiladi. Ochiq internetda hech narsa avval chiqishga yetishi shart emas, shuning uchun o'sha yuqori kanaldagi dinamik manzil muammo emas. Router baribir chiquvchi sessiyaga ruxsat berishi kerak, lekin bu brauzer allaqachon ishlatadigan ruxsatning o'zi.

iroute server ichida aslida nima o'rnatadi

Qaysi hamkor qaysi manzilga ega ekanini faqat markaz hal qiladi va bu qarorni yadroda emas, o'z foydalanuvchi maydoni marshrutlash jadvalida qabul qiladi. Chiqish uchun exit-node nomli client-config-dir yozuvi u yerda standart prefiksni talab qilishi mumkin:

# /etc/openvpn/server/ccd/exit-node
iroute 0.0.0.0 0.0.0.0

Bu satr server jarayoniga "har qanday manzilli ichki paketlar shu mijozga tegishli" deb aytadi. U markazning operatsion tizimiga standart marshrut qo'shmaydi va markazni internet shlyuziga aylantirmaydi. OpenVPN 2.6 ma'lumotnomasi mijozga xos ichki marshrutlash va yadro marshrutlashni alohida mexanizmlar sifatida saqlaydi va aynan shu ajratish ushbu dizaynning markaz standart marshrutiga tegmasdan ishlashining sababi.

Foydalanuvchiga oynadek ko'rsatma kerak, push sifatida yetkaziladi, shunda uning trafigi mahalliy shlyuzdan chiqish o'rniga tunnelga kiradi. Quyi tarmoq topologiyasida hovuz chiqishning tun qurilmasidagi ulangan marshrutdir, shuning uchun qaytish yo'nalishi qo'shimcha push talab qilmaydi; chiqish olmasligi kerak narsa quyidagi yo'naltirishdir, u o'z yuqori kanal trafigini foydalanmoqchi bo'lgan tunnelga qaytaradi. Uni faqat foydalanuvchiga yuboring va CCD fayli tanlanganiga ishonish o'rniga mijozda qo'llanilgan marshrutlarni o'qing.

# /etc/openvpn/server/ccd/consumer-01
push "redirect-gateway def1"

Uzatishni chiqishning yadrosi bajaradi

Chiqish ichida foydalanuvchidan paket tun interfeysiga qandaydir internet xosti manziliga keladi. Yadro marshrutlash jadvalini ko'rib chiqadi, eng yaxshi moslik sifatida haqiqiy yuqori kanalni topadi va keyin ikki mustaqil siyosatni qo'llaydi: bu paketni umuman uzatish mumkinmi va u shu interfeysdan shu manba manzili bilan chiqa oladimi. Uzatish sysctl hisoblanadi va ko'p distributivlarda standart bo'yicha o'chirilgan.

Shuning uchun chiqishga doimiy yoqilgan IPv4 uzatish, foydalanuvchi tunnel manbalarini yuqori kanalga qabul qiluvchi qoida va tun orqali qaytadigan javob yo'li kerak. Butun xost uchun uzatishni yoqish u orqali marshrutlanadigan boshqa hamma narsaning xatti-harakatini ham o'zgartiradi, shuning uchun qoida hamma narsani qabul qilish o'rniga manbalar va interfeyslarni nomlashi kerak.

Qaytish yo'lini manba tarjimasi sotib oladi

Internet xostining 10.90.0.x manziliga marshruti yo'q, shuning uchun javoblar chiqishga yetmasdan oldin tashlab yuborilardi. Paket yuqori kanaldan chiqayotganda manbani qayta yozish buni hal qiladi va ulanish kuzatuvi qaytishda o'sha qayta yozishni teskari qiladi.

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

Yuqoridagi qoida bitta yuqori kanal interfeysi uchun boshlang'ich nuqta, xavfsizlik devori siyosati emas. Manbani siz haqiqatan ruxsat bergan taqsimotlarga qadar toraytiring va chiqishning o'z kirish siyosatini alohida saqlang, shunda tunnel trafigi uchun maskaralash mahalliy xizmatlarni jim ravishda oshkor qilmaydi. Dinamik yuqori kanal manziliga ega xostda maskaralash sizni manzilni qo'lda kuzatishdan ham qutqaradi.

Markaz qayerda tatbiq eta oladi va qayerda yo'q

client-to-client va an'anaviy foydalanuvchi maydoni ma'lumot yo'li bilan markaz ichki paketlarni server jarayoni ichida hamkorlar o'rtasida topshiradi. Ular hech qachon markaz yadrosining FORWARD zanjiridan o'tmaydi, shuning uchun u yerdagi yadro qoidasi hamkorlar orasidagi o'tishni qanchalik sinchkovlik bilan yozilgan bo'lsa ham cheklay olmaydi. Tatbiq etish serverning o'z siyosatida yashashi kerak: kim ulanishi mumkin, qaysi CCD faylini oladi va chiqishning standart egaligi umuman beriladimi.

Shu sababli standart iroute keng ishonch qaroridir. Chiqish ixtiyoriy internet manzillaridan qaytish trafigini qonuniy qabul qilishi kerak va u siz nazorat qiladigan, yangilaydigan va kuzatadigan mashina bo'lishi kerak. Xuddi shu egalikni router ishonmaydigan hamkorga berish — bu dizayn chaqiradigan xato.

A'zolik — haqiqiy nazorat. O'z marshrutlarini sozlashni biladigan har qanday mijoz chiqishdan foydalanishga urinishi mumkin, shuning uchun kim ulanishi yoki chiqish qaysi hamkorlarga xizmat qilishini cheklash dizaynning bir qismi, keyingi o'y emas.

Chiqish yo'qolganda xavfsiz muvaffaqiyatsizlik

Chiqishni o'chiring, ichki standart egalik uning sessiyasi bilan birga yo'qoladi. Bo'lmasligi kerak narsa — markaz jim ravishda o'rnini bosuvchi chiqishga aylanishi: VPN hovuzidan markazning yuqori kanaliga standart marshrut yo'q va markazda xuddi shu trafikni mamnuniyat bilan uzatadigan keng maskaralash qoidasi yo'q. Bu muvaffaqiyatsizlikni ataylab sinab ko'ring, so'ng tiklanishni allaqachon ochiq bo'lgan sahifa bilan emas, yangi oqim bilan sinab ko'ring.

# 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

Agar chiqish ketgandan keyin ham foydalanuvchi trafigi internetga yetsa, uni boshqa narsa tashimoqda va siz ko'zlagan chegara mavjud emas. DNS va IPv6 ni ham alohida qaror deb biling: IPv4 marshruti va maskaralash AAAA trafigi haqida hech narsa demaydi, markaz itarib yuborgan rezolver esa so'rov haqiqatan qayerdan chiqsa, o'shandan javob beradi.

O'xshash maqolalar