dnsmasq માં OpenVPN ક્લાયન્ટ નામો: સ્ક્રિપ્ટ કે સ્થિર એન્ટ્રીઓ?
ક્લાયન્ટના સરનામાં બદલાય છે, સેવાના નામ નહીં. VPN સત્રમાંથી ક્લાયન્ટ નામો બનાવો, drop-in ફાઇલમાં સેવાના નામ સ્થિર કરો, પછી ક્લાયન્ટને તેનો ઉપયોગ કરાવો.
લગભગ દરેક નાના OpenVPN ગેટવે પર બે નામની સમસ્યાઓ દેખાય છે. જોડાયેલા લેપટોપ સુધી તેના પ્રમાણપત્ર પરના નામથી પહોંચી શકાતું નથી, અને ટનલ પાછળની સેવાઓને કોઈ નામ જ નથી. તે એક જ સમસ્યા જેવી લાગે છે અને વિરોધી ઉપાયોની જરૂર છે, કારણ કે એક સરનામું દરેક સત્ર સાથે ખસે છે અને બીજું નહીં. કંઈપણ સંપાદિત કરતા પહેલાં નક્કી કરો કે તમે કયા પ્રકારનું નામ ઉમેરી રહ્યા છો.
દરેક નામ માટે નક્કી કરો, ગેટવે માટે નહીં
કસોટી સરળ છે: ક્લાયન્ટ ફરી જોડાય ત્યારે આ સરનામું બદલાય છે? જો હા, તો નામ VPN સત્રમાંથી બનાવવું પડશે. જો ના, તો તે સ્થિર એન્ટ્રીમાં આવે છે જે તમે વાંચી અને સમીક્ષા કરી શકો.
| 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 |
તેમને ભેગા કરવા એ સામાન્ય ભૂલ છે. બનાવેલી ફાઇલમાં સ્થિર કરેલી સેવા સ્ક્રિપ્ટ પહેલી વાર ફરી લખે ત્યારે જ અદૃશ્ય થાય છે, અને સ્થિર એન્ટ્રીમાં લખાયેલો ક્લાયન્ટ તે વ્યક્તિ તરફ ઇશારો કરે છે જેની પાસે તે સરનામું છેલ્લે હતું. બંને ભૂલો ત્યાં સુધી અદૃશ્ય રહે છે જ્યાં સુધી નામ ખોટા મશીન પર ઉકેલાય નહીં. ત્યાં સુધી ડિબગ કરનાર વ્યક્તિ ધારે છે કે 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= અને ડોમેન વિસ્તરણ
સિસ્ટમની hosts ફાઇલને બદલે dnsmasq ને બનાવેલી ફાઇલ તરફ નિર્દેશ કરો, અને તેને ડોમેન આપો જેથી ટૂંકા નામ સંપૂર્ણ લાયક નામોમાં વિસ્તરે:
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
જો સીધી ક્વેરી જવાબ આપે અને એપ્લિકેશન નહીં, તો દોષ ઝોનનો નહીં પણ ક્લાયન્ટ હેન્ડઓફનો છે. જો નામ ઉકેલાય અને જોડાણ હજી નિષ્ફળ જાય, તો નામ ઠીક છે અને આગળ માર્ગ અથવા ફાયરવોલ જોવાનો છે.
બે શ્રેણીઓ રૂપરેખાની બાજુમાં લખો: કયા નામ બનાવાય છે, કયા સ્થિર છે, અને દરેકે કયા પ્રમાણપત્ર સાથે મેળ ખાવો પડશે. આગળ જે વ્યક્તિ સર્વર ઉમેરશે તે પહેલું જે પેટર્ન મળશે તેની નકલ કરશે.