Երկու անվանական խնդիր է ի հայտ գալիս գրեթե յուրաքանչյուր փոքր OpenVPN դարպասում։ Չեք կարող հասնել միացված նոթբուքին նրա վկայագրում գրված անունով, իսկ թունելի հետևում գտնվող ծառայությունները բոլորովին անուններ չունեն։ Նրանք նման են մեկ խնդրի և պահանջում են հակառակ մոտեցումներ, որովհետև մի հասցեն շարժվում է ամեն սեանսի հետ, իսկ մյուսը՝ ոչ։ Որոշեք, թե ինչ տեսակի անուն եք ավելացնում, նախքան որևէ բան խմբագրելը։

Որոշեք ըստ անվան, ոչ ըստ դարպասի

Փորձը պարզ է՝ փոխվո՞ւմ է արդյոք այս հասցեն, երբ հաճախորդը նորից միանում է։ Եթե այո, ապա անունը պետք է ստեղծվի VPN սեանսից։ Եթե ոչ, ապա այն պատկանում է ստատիկ գրառման, որը կարող եք կարդալ և վերանայել։

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

Դրանց խառնելը սովորական ձախողումն է։ Ստեղծված ֆայլում ամրացված ծառայությունը անհետանում է առաջին անգամ, երբ սկրիպտը վերագրում է այն, իսկ ստատիկ գրառման մեջ գրված հաճախորդը մատնանշում է նրան, ով վերջին անգամ ուներ այդ հասցեն։ Երկու սխալներն էլ անտեսանելի են մնում, քանի դեռ անունը չի լուծվում սխալ մեքենայի։ Այդ պահին վրիպազերծողը ենթադրում է, որ DNS-ը փչացած է, ոչ թե ֆայլը։

Դինամիկ ուղին՝ learn-address և լողավազանը

OpenVPN-ը գիտի հատկացումը, թող նա ասի ձեզ։ Այս սերվերի ընտրանքները հատկացումը դարձնում են կայուն և սկրիպտավորվող՝

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-ը գործարկում է ձեր սկրիպտը ամեն անգամ, երբ հասցե ավելացվում, թարմացվում կամ ջնջվում է, և փոխանցում է գործողությունը, հասցեն ու ընդհանուր անունը։ Նվազագույն սկրիպտը յուրաքանչյուր հաճախորդի համար մեկ տող ավելացնում է և ջնջելիս հեռացնում այն՝

#!/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 սարքի վրա երկրորդ արգումենտը հաճախորդի թունելային հասցեն է, այնպես որ տողը ուղղակիորեն օգտագործելի է։ tap սարքի վրա OpenVPN-ը փոխանցում է հաճախորդի MAC հասցեն, որովհետև tap հատվածը կարող է կրել նաև IPv4-ից բացի այլ արձանագրություններ, և այդ դեպքում պետք է հասցեն գտնել լողավազանի ֆայլում ընդհանուր անունով, նախքան որևէ բան գրելը։

Հստակ եղեք, թե ինչ է ստեղծված ֆայլը՝ պատկեր այն մասին, թե ով է հիմա միացված։ Անունները անհետանում են անջատման պահին, ինչը հենց այն է, ինչ ուզում եք ցանցերի միջև տեղաշարժվող նոթբուքերի համար, և հենց այն, ինչ չեք ուզում ամբողջ գիշեր աշխատող սերվերի համար։

Ստատիկ ուղին՝ address= և տիրույթի ընդլայնում

Ուղղեք dnsmasq-ը ստեղծված ֆայլին՝ համակարգի hosts ֆայլի փոխարեն, և տվեք նրան տիրույթ, որպեսզի կարճ անունները ընդլայնվեն լրիվ որակավորված անունների՝

domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces

Երբ domain-ը սահմանված է, 10.8.0.6 alice-ի նման տողը պատասխանում է և՛ alice-ի, և՛ alice.corp.example-ի համար։ Պահեք listen-address-ը միայն թունելի դարպասի և loopback-ի վրա, որովհետև LAN միջերեսում պատահաբար հրապարակված լուծիչը ծառայություն է, որը դուք չէիք նախատեսում առաջարկել։

Ծառայությունները, որոնք երբեք լողավազանից չեն գալիս, ստանում են իրենց գրառումները։ Տեղադրեք դրանք առանձին drop-in ֆայլում՝ բաշխման կարգավորման պանակում, որպեսզի փաթեթի թարմացումը չկարողանա վերագրել դրանք՝

address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5

Հանձնեք լուծիչը, այլապես ոչինչ չի պատահի

Լուծիչը, որից ոչ ոք չի հարցնում, ոչինչ չի փոխում։ Սերվերը պետք է հայտարարի այն՝

push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"

Windows-ի հաճախորդները երկու ընտրանքներն էլ կիրառում են իրենք։ Linux-ի հաճախորդների մեծ մասը՝ ոչ. նրանց պետք է աջակցվող լուծիչի ինտեգրում, ինչպիսին է բաշխման update-resolv-conf կեռիկը կամ NetworkManager-ի DNS մշակումը, կամ ձեռքով սահմանված որոնման տիրույթ և անվանասերվեր։ Ստուգեք հաճախորդի իրական լուծիչը՝ փոխարենը ենթադրելու, որ push-ը պահպանվել է, որովհետև անտեսված push-ը նույնքան է երևում, որքան չպատասխանող սերվերը։

Ստուգեք երեք շերտով

Նախ հարցրեք ուղղակիորեն սերվերին, ապա հաճախորդին, ապա հավելվածին՝

dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example

Եթե ուղղակի հարցումները պատասխանում են, իսկ հավելվածը՝ ոչ, մեղքը հաճախորդին հանձնելու մեջ է, ոչ թե զոնայում։ Եթե անունը լուծվում է, իսկ կապը դեռ ձախողվում է, անունը լավն է, և հաջորդը, ինչ պետք է նայել, երթուղին կամ ֆայրվոլն է։

Գրեք երկու կատեգորիաները կարգավորման կողքին՝ որ անուններն են ստեղծվում, որոնք են ամրացված, և յուրաքանչյուրը որ վկայագրին պետք է համապատասխանի։ Հաջորդ մարդը, ով սերվեր կավելացնի, կպատճենի առաջին իսկ օրինակը, որը կգտնի։

Առնչվող հոդվածներ