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 kindSource of truthWhere it lives
Connected clientThe address OpenVPN just assignedGenerated hosts file, rewritten per session
Service behind the tunnelA fixed address you choseStatic address= drop-in
Anything with a certificate nameThe certificate, not the poolEither, 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.

O'xshash maqolalar