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
ਜੇ ਸਿੱਧੀਆਂ ਕਿਊਰੀਆਂ ਜਵਾਬ ਦਿੰਦੀਆਂ ਹਨ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ, ਤਾਂ ਦੋਸ਼ ਜ਼ੋਨ ਦਾ ਨਹੀਂ ਸਗੋਂ ਕਲਾਇੰਟ ਨੂੰ ਸੌਂਪਣ ਦਾ ਹੈ। ਜੇ ਨਾਮ ਹੱਲ ਹੁੰਦਾ ਹੈ ਅਤੇ ਕਨੈਕਸ਼ਨ ਫਿਰ ਵੀ ਫੇਲ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਨਾਮ ਠੀਕ ਹੈ ਅਤੇ ਅੱਗੇ ਮਾਰਗ ਜਾਂ ਫਾਇਰਵਾਲ ਵੇਖਣਾ ਹੈ।
ਦੋ ਸ਼੍ਰੇਣੀਆਂ ਕਨਫਿਗਰੇਸ਼ਨ ਦੇ ਕੋਲ ਲਿਖੋ: ਕਿਹੜੇ ਨਾਮ ਬਣਦੇ ਹਨ, ਕਿਹੜੇ ਸਥਿਰ ਹਨ, ਅਤੇ ਹਰ ਇੱਕ ਨੂੰ ਕਿਹੜੇ ਸਰਟੀਫਿਕੇਟ ਨਾਲ ਮੇਲ ਖਾਣਾ ਹੈ। ਅੱਗੇ ਜੋ ਵਿਅਕਤੀ ਸਰਵਰ ਜੋੜੇਗਾ ਉਹ ਪਹਿਲਾ ਮਿਲਿਆ ਪੈਟਰਨ ਕਾਪੀ ਕਰੇਗਾ।