SOCKS5 ਉੱਤੇ OpenVPN: ਸੰਸਕਰਣ, ਟਰਾਂਸਪੋਰਟ ਅਤੇ DNS ਦਾ ਮੇਲ
SOCKS ਚੇਨ ਉਦੋਂ ਫੇਲ੍ਹ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਪ੍ਰੌਕਸੀ ਸੰਸਕਰਣ, ਟਰਾਂਸਪੋਰਟ ਜਾਂ DNS ਰਾਹ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ। SOCKS5 ਦਾ ਮੇਲ ਕਰੋ, TCP ਲੈ ਜਾਓ, ਅਤੇ ਚੇਨ ਨੂੰ ਇੱਕ ਨਾਮ-ਥਾਂ ਵਿੱਚ ਰੱਖੋ।
ਇਸ ਵਰਕਸਟੇਸ਼ਨ ਤੋਂ ਬਾਹਰ ਜਾਣ ਦਾ ਇੱਕ ਰਾਹ SOCKS ਪ੍ਰੌਕਸੀ ਹੈ, ਅਤੇ ਇਸ ਦੇ ਪਿੱਛੇ OpenVPN ਬਿਨਾਂ ਕਿਸੇ ਲਾਹੇਵੰਦ ਵੇਰਵੇ ਦੇ ਕਨੈਕਟ ਟਾਈਮਆਉਟ ਦੀ ਸੂਚਨਾ ਦਿੰਦਾ ਹੈ। ਉਸੇ ਮਸ਼ੀਨ ਦਾ ਬ੍ਰਾਊਜ਼ਰ ਉਸ ਪ੍ਰੌਕਸੀ ਰਾਹੀਂ ਕੰਮ ਕਰਦਾ ਹੈ, ਪ੍ਰਮਾਣ-ਪੱਤਰ ਠੀਕ ਹਨ, ਅਤੇ ਪੋਰਟ ਜਵਾਬ ਦਿੰਦਾ ਹੈ। ਤਿੰਨ ਚੀਜ਼ਾਂ ਇੰਨੀਆਂ ਵੱਖਰੀਆਂ ਹੁੰਦੀਆਂ ਹਨ ਕਿ ਪਹਿਲਾਂ ਜਾਂਚੀਆਂ ਜਾਣ: ਪ੍ਰੌਕਸੀ ਜਿਹੜਾ SOCKS ਸੰਸਕਰਣ ਬੋਲਦੀ ਹੈ, ਕਲਾਇੰਟ ਨੇ ਜਿਹੜਾ ਟਰਾਂਸਪੋਰਟ ਚੁਣਿਆ, ਅਤੇ ਉਹ ਥਾਂ ਜਿੱਥੇ ਨਾਮ ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਹੁੰਦਾ ਹੈ। ਫਾਇਰਵਾਲ ਨੂੰ ਦੋਸ਼ੀ ਮੰਨਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹਨਾਂ ਵਿੱਚੋਂ ਹਰ ਇੱਕ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।
ਫਾਇਰਵਾਲ ਤੋਂ ਪਹਿਲਾਂ SOCKS ਸੰਸਕਰਣ ਦਾ ਮੇਲ ਕਰੋ
ਕਮਿਊਨਿਟੀ OpenVPN socks-proxy ਲਈ SOCKS5 ਬੋਲਦਾ ਹੈ। ਇਸਨੂੰ ਉਸ ਪ੍ਰੌਕਸੀ ਉੱਤੇ ਲਾਓ ਜੋ ਸਿਰਫ਼ SOCKS4 ਦਿੰਦੀ ਹੈ; TCP ਕਨੈਕਸ਼ਨ ਖੁੱਲ੍ਹਦਾ ਹੈ ਅਤੇ ਫਿਰ ਰੁਕ ਜਾਂਦਾ ਹੈ, ਕਿਉਂਕਿ ਕਲਾਇੰਟ ਅਜਿਹੇ ਸਲਾਮ ਦਾ ਜਵਾਬ ਉਡੀਕਦਾ ਹੈ ਜਿਸਨੂੰ ਦੂਜਾ ਸਿਰਾ ਕਦੇ ਪਾਰਸ ਨਹੀਂ ਕਰਦਾ। ਬਾਹਰੋਂ ਇਹ ਰੁਕਾਵਟ ਬਿਲਕੁਲ ਫਿਲਟਰ ਹੋਏ ਪੋਰਟ ਵਾਂਗ ਦਿਸਦੀ ਹੈ, ਇਸੇ ਲਈ ਸੰਸਕਰਣ ਦਾ ਸਵਾਲ ਕਿਸੇ ਵੀ ਫਾਇਰਵਾਲ ਨਿਯਮ ਤੋਂ ਪਹਿਲਾਂ ਆਉਂਦਾ ਹੈ। SOCKS ਤੋਂ ਜਾਣੂ ਇੱਕ ਫੈਚ ਇਸਨੂੰ ਇੱਕ ਹੀ ਕਮਾਂਡ ਵਿੱਚ ਤੈਅ ਕਰ ਦਿੰਦਾ ਹੈ।
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
ਪੂਰੀ ਹੋਈ ਬੇਨਤੀ ਇੱਕੋ ਵੇਲੇ ਦੋ ਗੱਲਾਂ ਸਾਬਤ ਕਰਦੀ ਹੈ: ਪ੍ਰੌਕਸੀ ਨੇ SOCKS ਬੇਨਤੀ ਮੰਨੀ ਅਤੇ ਉਸਨੇ ਨਾਮ ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਕੀਤਾ। ਕਿਸੇ URL ਸਕੀਮ ਦੀ ਲੋੜ ਨਹੀਂ, ਕਿਉਂਕਿ curl ਨੰਗੇ ਹੋਸਟ ਨੂੰ HTTP ਮੰਨਦਾ ਹੈ, ਅਤੇ ਇਹ ਇਸ ਟੈਸਟ ਲਈ ਕਾਫ਼ੀ ਹੈ।
ਇਹ ਫੈਚ ਉਸ ਫੇਲ੍ਹਤ ਨੂੰ ਵੀ ਬਾਹਰ ਕਰਦਾ ਹੈ ਜੋ ਕਲਾਇੰਟ ਲੌਗ ਲੁਕਾਉਂਦਾ ਹੈ। ਪ੍ਰੌਕਸੀ ਬ੍ਰਾਊਜ਼ਰ ਨੂੰ ਇਜਾਜ਼ਤ ਦੇ ਕੇ ਵੀ VPN ਮੰਜ਼ਿਲ ਨੂੰ ਇਨਕਾਰ ਕਰ ਸਕਦੀ ਹੈ, ਅਤੇ ਤਦ ਇਨਕਾਰ CONNECT ਉੱਤੇ ਹੁੰਦਾ ਹੈ, ਕਿਸੇ ਵੀ VPN ਪ੍ਰਮਾਣਿਕਤਾ ਤੋਂ ਪਹਿਲਾਂ। OpenVPN ਸਿਰਫ਼ ਟਾਈਮਆਉਟ ਦੱਸਦਾ ਹੈ, ਇਸ ਲਈ ਪ੍ਰੌਕਸੀ ਦਾ ਆਪਣਾ ਜਵਾਬ ਹੀ ਉਹ ਸਬੂਤ ਹੈ ਜੋ ਤੁਹਾਨੂੰ ਚਾਹੀਦਾ ਹੈ।
ਟਰਾਂਸਪੋਰਟ ਦੋਵਾਂ ਪਾਸਿਆਂ ਤੇ TCP ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ
SOCKS5 ਇੱਥੇ TCP ਸਟ੍ਰੀਮ ਲੈ ਜਾਂਦਾ ਹੈ, ਇਸ ਲਈ ਸੁਰੰਗ ਨੂੰ ਖੁਦ proto tcp-client ਚਾਹੀਦਾ ਹੈ। ਜਿਹੜਾ ਪ੍ਰੋਫ਼ਾਈਲ ਅਜੇ ਵੀ UDP ਉੱਤੇ ਸੈੱਟ ਹੈ ਉਹ ਇਸ ਰਾਹ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ, ਕਿਉਂਕਿ ਕਲਾਇੰਟ ਪ੍ਰੋਟੋਕੋਲ ਦਾ UDP ਐਸੋਸੀਏਸ਼ਨ ਮੋਡ ਨਹੀਂ ਵਰਤਦਾ। ਪ੍ਰੋਫ਼ਾਈਲ ਪਲਟਣਾ ਅਸਲ ਬਦਲਾਅ ਹੈ, ਰਸਮ ਨਹੀਂ: ਦੂਰ ਸਿਰੇ ਨੂੰ ਉਸੇ ਪੋਰਟ ਤੇ TCP ਉੱਤੇ ਸੁਣਨਾ ਪਵੇਗਾ। ਫਿਰ ਪੇਲੋਡ TCP ਦੇ ਅੰਦਰ TCP ਬਣ ਜਾਂਦਾ ਹੈ, ਜਿੱਥੇ ਗੁੰਮ ਹੋਇਆ ਸੈਗਮੈਂਟ ਦੋ ਵਾਰ ਮੁੜ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਰਫ਼ਤਾਰ ਘਟਦੀ ਹੈ, ਜਿਸਨੂੰ ਇੰਟਰੈਕਟਿਵ ਸੈਸ਼ਨ ਵੱਡੇ ਟਰਾਂਸਫ਼ਰਾਂ ਨਾਲੋਂ ਕਿਤੇ ਵੱਧ ਮਹਿਸੂਸ ਕਰਦੇ ਹਨ।
proto tcp-client
remote gw.lab.example 8443
socks-proxy 127.0.0.1 9050
ਇਹ ਨਿਰਦੇਸ਼ ਪ੍ਰੌਕਸੀ ਹੋਸਟ, ਚੋਣਵਾਂ ਪੋਰਟ ਅਤੇ ਚੋਣਵੀਂ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਫਾਈਲ ਲੈਂਦਾ ਹੈ। ਉਹਨਾਂ ਨੂੰ ਪ੍ਰੋਫ਼ਾਈਲ ਵਿੱਚ ਹੀ ਰੱਖੋ ਤਾਂ ਜੋ ਕਿਤੇ ਹੋਰ ਰੱਖੀ ਕਾਪੀ ਉਹੀ ਵਿਵਹਾਰ ਕਰੇ।
ਪੂਰੀ ਚੇਨ ਨੂੰ ਇੱਕ ਕੰਟੇਨਰ ਵਿੱਚ ਸੀਮਤ ਕਰੋ
ਚੇਨ ਹੋਸਟ ਉੱਤੇ ਕਰਨ ਦਾ ਮਤਲਬ ਹੈ ਉਸਦਾ ਡਿਫ਼ਾਲਟ ਰਾਹ ਕਬਜ਼ੇ ਵਿੱਚ ਲੈਣਾ ਅਤੇ resolver ਨੂੰ ਅਜਿਹੀ ਹਾਲਤ ਵਿੱਚ ਛੱਡਣਾ ਜਿਸਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕੋਈ ਸਮਝਾ ਨਾ ਸਕੇ। ਨਾਮ-ਥਾਂ ਜਾਂ ਕੰਟੇਨਰ ਇਸਨੂੰ ਸੀਮਤ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਹੋਸਟ ਆਪਣਾ ਰਾਹ ਰੱਖਦਾ ਹੈ ਜਦਕਿ SOCKS ਹੌਪ ਅਤੇ ਸੁਰੰਗ ਇਕੱਠੇ ਰਹਿੰਦੇ ਹਨ। ਇਸਦੇ ਅੰਦਰ ਕੁਝ ਵੀ ਸੁਰੰਗ ਡਿਵਾਈਸ, ਉਸ ਡਿਵਾਈਸ ਨੂੰ ਸੰਰਚਿਤ ਕਰਨ ਦੇ ਹੱਕ ਅਤੇ ਪਹੁੰਚਯੋਗ ਪ੍ਰੌਕਸੀ ਤੋਂ ਬਿਨਾਂ ਨਹੀਂ ਉੱਠਦਾ। Compose ਸੇਵਾ ਇਹ cap_add: NET_ADMIN ਅਤੇ bind-ਮਾਊਂਟ ਕੀਤੇ /dev/net/tun ਨਾਲ ਪ੍ਰਾਪਤ ਕਰਦੀ ਹੈ।
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ਇਹ ਜੋੜੀ ਕੰਟੇਨਰ ਨੂੰ privileged ਚਲਾਉਣ ਨਾਲੋਂ ਤੰਗ ਹੈ, ਅਤੇ ਡਿਵਾਈਸ ਤੱਕ ਪਹੁੰਚ ਦਾ ਪੂਰਾ ਲੋੜੀਂਦਾ ਹਿੱਸਾ ਇਹੀ ਹੈ। Tor ਕਲਾਇੰਟ ਜਾਂ ਵੱਖਰਾ ਪ੍ਰੌਕਸੀ ਕੰਟੇਨਰ ਸੁਣਨ ਵਾਲਾ ਦੇ ਸਕਦਾ ਹੈ। ਦੋਵਾਂ ਹਾਲਤਾਂ ਵਿੱਚ ਇਸਨੂੰ loopback ਉੱਤੇ ਬੰਨ੍ਹੋ, ਅਤੇ ਪ੍ਰੌਕਸੀ ਨੂੰ ਨੈੱਟਵਰਕ ਉੱਤੇ ਖੋਲ੍ਹਣ ਦੀ ਥਾਂ ਨਾਮ-ਥਾਂ ਤੋਂ ਹੋਸਟ ਰਾਹੀਂ ਇਸ ਤੱਕ ਪਹੁੰਚੋ।
ਨਾਮ ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਉਹ ਥਾਂ ਹੈ ਜਿੱਥੇ ਅਲੱਗਾਅ ਫੇਲ੍ਹ ਹੁੰਦਾ ਹੈ
ਜਿਹੜੀ ਸੁਰੰਗ ਪੈਕਟ ਲੈ ਜਾਂਦੀ ਹੈ ਪਰ ਹੋਸਟ ਦੇ resolver ਨੂੰ ਪੁੱਛਦੀ ਹੈ ਉਸਨੇ ਕੁਝ ਵੀ ਅਲੱਗ ਨਹੀਂ ਕੀਤਾ। ਦੋ ਗੱਲਾਂ ਅਲੱਗਾਅ ਨੂੰ ਅਸਲੀ ਬਣਾਉਂਦੀਆਂ ਹਨ: ਨਾਮ-ਥਾਂ ਦਾ ਆਪਣਾ resolver ਹੋਣਾ, ਅਤੇ ਉਸਦੀਆਂ ਕਿਊਰੀਆਂ ਦਾ ਪ੍ਰੌਕਸੀ ਜਾਂ ਸੁਰੰਗ ਰਾਹੀਂ ਜਾਣਾ, ਕਦੇ ਭੌਤਿਕ ਇੰਟਰਫ਼ੇਸ ਰਾਹੀਂ ਨਹੀਂ। ਟੈਸਟ ਲਈ ਦੋ ਨਾਮ ਵਰਤੋ: ਇੱਕ ਜੋ ਸਿਰਫ਼ ਸੁਰੰਗ ਪਿੱਛੇ ਮੌਜੂਦ ਹੈ, ਅਤੇ ਇੱਕ ਜਨਤਕ ਜਿਸਨੂੰ ਉਹੀ ਰਾਹ ਲੈਣਾ ਚਾਹੀਦਾ ਹੈ।
docker compose exec vpn cat /etc/resolv.conf
docker compose exec vpn getent hosts internal.lab.example
ਜੇ ਦੂਰ ਵਾਲਾ ਨਾਮ ਵਿਸ਼ਲੇਸ਼ਿਤ ਹੁੰਦਾ ਹੈ ਅਤੇ ਜਨਤਕ ਨਹੀਂ, ਤਾਂ ਚੇਨ ਚੋਣਵੀਂ ਹੈ, ਟੁੱਟੀ ਨਹੀਂ, ਅਤੇ ਫ਼ਰਕ ਦੱਸਦਾ ਹੈ ਕਿ ਹਰ ਕਿਊਰੀ ਨੇ ਕਿਹੜਾ ਰਾਹ ਲਿਆ। ਜੇ ਦੋਵੇਂ ਹੋਸਟ ਤੋਂ ਵਿਸ਼ਲੇਸ਼ਿਤ ਹੁੰਦੇ ਹਨ ਪਰ ਕੰਟੇਨਰ ਦੇ ਅੰਦਰ ਕੋਈ ਨਹੀਂ, ਤਾਂ ਕੰਟੇਨਰ ਅਜੇ ਵੀ ਹੋਸਟ ਦਾ resolver ਉਧਾਰ ਲੈ ਰਿਹਾ ਹੈ। ਜਿਹੜੀ resolver ਫਾਈਲ ਮਿਲੀ ਉਸਨੂੰ ਦਰਜ ਕਰੋ, ਕਿਉਂਕਿ ਉਹੀ ਸੈਟਿੰਗ ਹੈ ਜਿਸਨੂੰ ਬਦਲਣਾ ਹੈ।
ਹਰ ਹੌਪ ਨੂੰ ਕ੍ਰਮ ਵਿੱਚ ਸਾਬਤ ਕਰੋ
ਸੂਚੀ ਛੋਟੀ ਹੈ। ਇੱਕ SOCKS5 ਬੇਨਤੀ ਨੂੰ ਜਵਾਬ ਮਿਲਦਾ ਹੈ, ਸੁਰੰਗ ਪ੍ਰੌਕਸੀ ਰਾਹੀਂ ਆਪਣੇ ਸੁਣਨ ਵਾਲੇ ਤੱਕ ਪਹੁੰਚਦੀ ਹੈ, ਅਤੇ ਨਾਮ-ਥਾਂ ਤੋਂ ਨਿਕਲਦੇ ਪੈਕਟ ਉਹ ਪਤਾ ਲੈ ਜਾਂਦੇ ਹਨ ਜਿਸਦੀ ਦੂਰ ਸਿਰਾ ਉਮੀਦ ਰੱਖਦਾ ਹੈ। ਹੋਰ ਸੰਰਚਨਾ ਚੜ੍ਹਾਉਣ ਦੀ ਥਾਂ ਹਰ ਇੱਕ ਨੂੰ ਵੱਖਰੇ ਤੌਰ ਤੇ ਪੁਸ਼ਟੀ ਕਰੋ। ਜਦੋਂ ਕਲਾਇੰਟ ਕਹੇ ਕਿ ਜੁੜਿਆ ਹੈ ਅਤੇ ਕੁਝ ਨਹੀਂ ਹਿੱਲਦਾ, ਤਾਂ ਟੁੱਟਣਾ ਲਗਭਗ ਹਮੇਸ਼ਾ ਦੂਜੇ ਜਾਂ ਤੀਜੇ ਤੱਥ ਵਿੱਚ ਹੁੰਦਾ ਹੈ।
curl --socks5-hostname 127.0.0.1:9050 gw.lab.example
docker compose exec vpn ip route get 203.0.113.10
docker compose exec vpn getent hosts internal.lab.example
ਜਿਹੜਾ ਸੁਮੇਲ ਕੰਮ ਕਰ ਗਿਆ ਉਸਨੂੰ ਲਿਖ ਲਓ: SOCKS ਸੰਸਕਰਣ, ਟਰਾਂਸਪੋਰਟ, resolver ਅਤੇ ਨਾਮ-ਥਾਂ ਸੈਟਿੰਗਾਂ। ਇਸ ਚੇਨ ਨੂੰ ਦੂਜੀ ਵਾਰ ਯਾਦ ਤੋਂ ਹੱਲ ਕਰਨਾ ਨੋਟ ਨਾਲੋਂ ਮਹਿੰਗਾ ਹੈ। ਉਹ ਚਾਰ ਤੱਥ ਟਿਕਟ ਵਿੱਚ ਰੱਖੋ, ਚੈਟ ਥ੍ਰੈਡ ਵਿੱਚ ਨਹੀਂ।
ਜਿਹੜੀ ਚੇਨ ਜੁੜਿਆ ਦੱਸਦੀ ਹੈ ਅਤੇ ਕੁਝ ਨਹੀਂ ਲੰਘਾਉਂਦੀ, ਉਹ ਆਮ ਤੌਰ ਤੇ ਉਸੇ ਹੌਪ ਉੱਤੇ ਫੇਲ੍ਹ ਹੋਈ ਹੈ ਜਿਸਨੂੰ ਤੁਸੀਂ ਅਜੇ ਸਾਬਤ ਨਹੀਂ ਕੀਤਾ। ਹੋਰ ਪਰਤ ਲਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਉਸ ਹੌਪ ਨੂੰ ਜਾਂਚੋ।