dnsmasq-da OpenVPN mijoz nomlari: skriptmi yoki statik yozuvlarmi?
Mijoz manzillari o’zgaradi, xizmat nomlari esa yo’q. Mijoz nomlarini VPN sessiyasidan yarating, xizmat nomlarini drop-in faylida mahkamlang, so’ng mijozlarni undan foydalantiring.
Deyarli har bir kichik OpenVPN shlyuzida ikkita nom muammosi uchraydi. Ulangan noutbukka uning sertifikatidagi nom bilan yetib bo’lmaydi, tunnel orqasidagi xizmatlarning esa umuman nomi yo’q. Ular bitta muammoga o’xshaydi, lekin qarama-qarshi yechim talab qiladi, chunki bir manzil har bir sessiya bilan o’zgaradi, ikkinchisi esa yo’q. Biror narsani tahrirlashdan oldin qanday turdagi nom qo’shayotganingizni hal qiling.
Shlyuz bo’yicha emas, nom bo’yicha hal qiling
Sinov oddiy: mijoz qayta ulanganda bu manzil o’zgaradimi? Ha bo’lsa, nom VPN sessiyasidan yaratilishi kerak. Yo’q bo’lsa, u o’qib, ko’rib chiqishingiz mumkin bo’lgan statik yozuvga tegishli.
| Name kind | Source of truth | Where it lives |
|---|---|---|
| Connected client | The address OpenVPN just assigned | Generated hosts file, rewritten per session |
| Service behind the tunnel | A fixed address you chose | Static address= drop-in |
| Anything with a certificate name | The certificate, not the pool | Either, but the name must match the certificate |
Ularni aralashtirish odatiy muvaffaqiyatsizlikdir. Yaratilgan faylga mahkamlangan xizmat skript uni birinchi marta qayta yozganda yo’qoladi, statik yozuvga yozilgan mijoz esa bu manzilni oxirgi marta ushlagan odamga ishora qiladi. Ikkala xato ham nom noto’g’ri mashinaga hal bo’lmaguncha ko’rinmaydi. O’shanda nosozlikni tuzatuvchi DNS buzilgan deb o’ylaydi, fayl emas.
Dinamik yo’l: learn-address va hovuz
OpenVPN taqsimotni biladi, shuning uchun u sizga aytsin. Bu server parametrlari taqsimotni barqaror va skript qilinadigan qiladi:
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ip-pool 60
script-security 2
learn-address /etc/openvpn/learn-address.sh
learn-address manzil qo’shilganda, yangilanganda yoki o’chirilganda har safar skriptingizni ishga tushiradi va amal, manzil hamda umumiy nomni uzatadi. Minimal skript har bir mijoz uchun bitta satr qo’shadi va o’chirishda uni olib tashlaydi:
#!/bin/sh
HOSTS=/etc/openvpn/hosts.lan
case "$1" in
add|update) echo "$2 $3" >> "$HOSTS" ;;
delete) sed -i "/^$2 /d" "$HOSTS" ;;
esac
kill -HUP $(cat /var/run/dnsmasq.pid)
tun qurilmasida ikkinchi argument mijozning tunnel manzili, shuning uchun satrni to’g’ridan-to’g’ri ishlatish mumkin. tap qurilmasida OpenVPN buning o’rniga mijozning MAC manzilini uzatadi, chunki tap segmenti IPv4 dan boshqa protokollarni ham tashishi mumkin, va o’shanda biror narsa yozishdan oldin manzilni umumiy nom bo’yicha hovuz faylidan izlash kerak.
Yaratilgan fayl nima ekanini aniq biling: hozir kim ulanganining surati. Uzilganda nomlar yo’qoladi, bu tarmoqlar orasida ko’chib yuruvchi noutbuklar uchun aynan kerakli narsa va tun bo’yi yoniq turadigan server uchun aynan keraksiz narsa.
Statik yo’l: address= va domen kengaytmasi
dnsmasq ni tizim hosts fayli o’rniga yaratilgan faylga yo’naltiring va unga domen bering, shunda qisqa nomlar to’liq malakali nomlarga kengayadi:
domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
domain o’rnatilganda, 10.8.0.6 alice kabi satr alice va alice.corp.example uchun ham javob beradi. listen-address ni faqat tunnel shlyuzi va loopback da saqlang, chunki LAN interfeysida tasodifan e’lon qilingan rezolver siz taklif qilishni o’ylamagan xizmatdir.
Hovuzdan hech qachon kelmaydigan xizmatlar o’z yozuvlarini oladi. Ularni distributivning konfiguratsiya katalogidagi alohida drop-in fayliga qo’ying, shunda paket yangilanishi ularni qayta yozolmaydi:
address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5
Rezolverni topshiring, aks holda hech narsa bo’lmaydi
Hech kim so’ramaydigan rezolver hech narsani o’zgartirmaydi. Server uni e’lon qilishi kerak:
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"
Windows mijozlari ikkala parametrni o’zlari qo’llaydi. Linux mijozlarining ko’pchiligi qo’llamaydi: ularga qo’llab-quvvatlanadigan rezolver integratsiyasi kerak, masalan, distributivning update-resolv-conf ilgagi yoki NetworkManager ning DNS boshqaruvi, yoxud qo’lda o’rnatilgan qidiruv domeni va nom serveri. push bajarilgan deb taxmin qilish o’rniga mijozning haqiqiy rezolverini tekshiring, chunki e’tiborsiz qoldirilgan push javob bermaydigan serverga aynan o’xshaydi.
Uch qatlamda tekshiring
Avval serverdan to’g’ridan-to’g’ri so’rang, keyin mijozdan, keyin ilovadan:
dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example
To’g’ridan-to’g’ri so’rovlar javob berib, ilova bermasa, ayb zonada emas, mijozga topshirishda. Nom hal bo’lib, ulanish hali ham muvaffaqiyatsiz bo’lsa, nom yaxshi va keyingi qaraladigan narsa marshrut yoki xavfsizlik devori.
Ikki toifani konfiguratsiya yoniga yozib qo’ying: qaysi nomlar yaratiladi, qaysilari mahkamlangan va har biri qaysi sertifikatga mos kelishi kerak. Keyingi server qo’shadigan odam birinchi topgan namunasini ko’chiradi.