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
నేరుగా చేసిన ప్రశ్నలు సమాధానం ఇచ్చి అప్లికేషన్ ఇవ్వకపోతే, తప్పు జోన్లో కాదు, క్లయింట్కు అప్పగించడంలో ఉంది. పేరు పరిష్కారమై కనెక్షన్ ఇంకా విఫలమైతే, పేరు బాగుంది మరియు తర్వాత చూడాల్సింది మార్గం లేదా ఫైర్వాల్.
రెండు వర్గాలను కాన్ఫిగరేషన్ పక్కన రాయండి: ఏ పేర్లు సృష్టించబడతాయి, ఏవి స్థిరంగా ఉన్నాయి, మరియు ప్రతిదీ ఏ సర్టిఫికెట్తో సరిపోలాలి. తర్వాత సర్వర్ జోడించే వ్యక్తి మొదట కనిపించిన నమూనాను కాపీ చేస్తారు.