client-connect skriptidan manzil qaytarish mijozning IP manzilini belgilashi kerakdek ko'rinadi. Ammo unday emas: ilgakning serverga yagona kanali vaqtinchalik fayl bo'lib, uning yo'li skriptning oxirgi argumenti sifatida keladi, manzil esa u yerda ifconfig-push sintaksisida yozilishi kerak. Manzilni chop etadigan yoki hech narsa yozmasdan nol bilan chiqadigan skript hovuzdan olingan manzilli ulangan mijoz yaratadi, server jurnali esa butunlay sog'lom ko'rinadi.

Chalkashlik tushunarli, chunki bir nechta boshqa ilgaklar chiqish kodlari yoki muhit o'zgaruvchilari orqali haqiqatan ham javob beradi. Bu ilgakning o'z shartnomasi bor va shartnoma fayl nomidan boshlanadi.

Ilgak fayl yozadi, qaytariladigan qiymat emas

Deklaratsiya ikki qator: chaqiruvga ruxsat berish uchun script-security 2, so'ng client-connect /etc/openvpn/server/assign-address.sh. Mijoz autentifikatsiyadan o'tganda server bu skriptni yaratilgan fayl yo'lini oxirgi argument sifatida qo'shib ishga tushiradi, u faqat deklaratsiya o'zining qo'shimcha argumentlarini bermasa $1 bo'ladi. O'sha mijozga qo'llaniladigan hamma narsa o'sha faylga oddiy ko'rsatmalar sifatida, har qatorga bittadan, konfiguratsiyada ko'rinadigan tarzda yoziladi. O'z parametrlarini qo'shadigan o'ram joyni siljitadi, klassik alomat esa --verbose ga o'xshash yo'lga yozadigan skriptdir.

Chiqish holati shartnomaning ikkinchi yarmi. Nol qabul qil va faylni o'qi degani; boshqa har qanday narsa ulanishni rad etadi va xaritaga olinmagan shaxs hovuzga jimgina qaytish o'rniga shunday rad etiladi. Muvaffaqiyatni qaytarishdan oldin to'liq ko'rsatmani yozing, yarim yozilgan fayl hech qachon mijoz konfiguratsiyasiga aylanmasin.

Ikki ko'rsatma e'tiborga loyiq, chunki ular qolgan hamma narsa bilan o'zaro ta'sirlashadi. ifconfig-push manzilni belgilaydi, yuborilgan route esa mijozga tunnel orqali nima yetib borishini aytadi; birinchisini qaytarib ikkinchisini unutsangiz manzili bor, ammo boradigan joyi yo'q mijoz olasiz. Fayl ichidagi tartib muhim emas, ammo to'liqlik muhim. Hech bir sherik yetib bora olmaydigan prefiks uchun marshrut yuboradigan ilgak — boshqa tomondan ko'ringan o'sha xato.

Kirishlar muhit o'zgaruvchilari orqali keladi: common_name, trusted_ip, ifconfig_pool_remote_ip va qolganlari. Ularning barchasiga serverdan tashqaridagi satrlar sifatida munosabatda bo'ling, hech qachon shell bo'laklari sifatida emas.

Manzillarni xaritalash — siyosat, arifmetika emas

Jozibali qisqa yo'l — sertifikat nomini tahlil qilib, uning raqamlarini oxirgi oktet sifatida ishlatish. Bu taqsimlovchi emas va odatiy usullarda muvaffaqiyatsiz bo'ladi: bir xil qo'shimchali ikki nom to'qnashadi, 300 bilan tugaydigan nom manzil emas, administrator nomini o'zgartirgan sertifikat esa qurilmani jimgina ko'chiradi. Har bir chaqiruvda subnetga tegishlilikni, foydalanish mumkin bo'lgan xost diapazonini, zaxiralangan manzillarni va noyoblikni tekshiring, xaritalashni esa inson o'qiy oladigan jadvalda saqlang.

Nomni kim boshqarsa, manzilni ham boshqaradi, shuning uchun bu joylashtirishda common_name aslida nimani ifodalashini hal qiling. username-as-common-name yoqilgan bo'lsa, shaxs sertifikat sub'ekti emas, balki login hisoblanadi. Bu qiymatni hech qachon shell baholashiga uzatmang va mijozning fayl yo'liga ta'sir qilishiga hech qachon yo'l qo'ymang.

Reyestrga asoslangan taqsimlovchi parallellikka bardosh berishi kerak. Manzilni atomik zaxiralang, muvaffaqiyatsiz yozuvni yarim konfiguratsiya qilingan mijozni qabul qilmasdan boshqaring va har bir taqsimotni unga egalik qiladigan ulanish bilan belgilang, shunda eski sessiyaning kechikib uzilishi yangiroq sessiya allaqachon ushlab turgan manzilni bo'shatib yubora olmaydi. Bitta hovuzni bo'lishadigan bir nechta server nusxasi bu talabni ixtiyoriy emas, yanada keskin qiladi.

Topologiya ifconfig-push nimani anglatishini belgilaydi

10.77.0.0/24 da topology subnet bilan ifconfig-push 10.77.0.20 255.255.255.0 — bu manzil va uning tarmoq maskasi. topology net30 ostida ikkinchi argument umuman maska emas, balki sherikning manzili, shuning uchun subnet shaklini net30 serveriga ko'chirish sizga ulanadigan, ammo trafikni o'tkaza olmaydigan mijoz beradi. Topologiyani ataylab o'zgartiring, hech qachon misol izchil ko'rinishi uchun emas. Allaqachon net30 ishlatayotgan serverning eski manzillashda tirik mijozlari bor, shuning uchun almashtirish — texnik xizmat oynasi bilan ko'chirish, bir qatorni tahrirlash emas.

Statik manzillar dinamik hovuzdan tashqarida va boshqa har bir statik tayinlashdan tashqarida bo'lishi kerak, jumladan oddiy client-config-dir fayllari beradiganlari ham. Agar ikki mexanizm turli mijozlarga bir xil manzilni ishlab chiqara olsa, ulardan biri oxir-oqibat shunday qiladi.

Unga ishonishdan oldin to'rt holatni sinab ko'ring

Xuddi shu tekshiruvlarni xaritalangan shaxs, xaritalanmagan shaxs, qayta ulanish va modellashtirilgan reyestr nosozligi bo'yicha ishga tushiring. openvpn --config client.ovpn --verb 4 tayinlangan manzilni push javobida ko'rsatadi, serverda esa grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log aslida nima yuborilganini tasdiqlaydi. Xaritalanmagan shaxs uchun kutilgan natija hovuz manzili emas, rad etilgan ulanishdir.

So'ngra daemon o'sha vaqtinchalik fayllarni yozadigan katalogni tekshiring. Skript pasaytirilgan xizmat kontekstida ishlaydi, shuning uchun root yozishi mumkin, ammo daemon yozolmaydigan yo'l har bir ulanishni jurnalda bir necha qator pastda ko'milgan ruxsat xatosi bilan rad etishga aylantiradi.

Taqsimlash ruxsat emas: qotirilgan manzil hali ham server orqasidagi har bir manzilga kirishni bermaydi. Marshrutlash va xavfsizlik devori siyosatini o'z qatlamida saqlang va uni hozir qotirgan manzilga qarshi tekshiring.

O'xshash maqolalar