ਇੱਕ ਹੀ Linux ਹੋਸਟ 'ਤੇ ਦੂਜਾ OpenVPN ਕਲਾਇੰਟ ਜੋੜਨਾ ਦੋ ਵਿੱਚੋਂ ਇੱਕ ਥਾਂ 'ਤੇ ਅਸਫਲ ਹੁੰਦਾ ਹੈ। ਜਾਂ ਤਾਂ ਅੰਦਰਲਾ ਕਲਾਇੰਟ ਆਪਣੇ ਸਰਵਰ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦਾ ਕਿਉਂਕਿ ਬਾਹਰਲੇ ਟਨਲ ਨੇ ਉਹ ਟਰਾਂਸਪੋਰਟ ਕਬਜ਼ੇ ਵਿੱਚ ਲੈ ਲਿਆ ਹੈ, ਜਾਂ ਦੂਜਾ ਕਲਾਇੰਟ ਰੂਟ ਟੇਬਲ ਦੁਬਾਰਾ ਲਿਖਦਾ ਹੈ ਅਤੇ ਪਹਿਲਾ ਟਨਲ ਕੰਮ ਕਰਨਾ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ। ਦੋਵੇਂ ਸਮੱਸਿਆਵਾਂ ਰਾਊਟਿੰਗ ਵਿੱਚ ਹਨ, ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ ਨਹੀਂ, ਅਤੇ ਦੋਵੇਂ ਨਵੇਂ ਟਨਲ ਦੇ ਕੋਈ ਵੀ ਐਪਲੀਕੇਸ਼ਨ ਟ੍ਰੈਫਿਕ ਲਿਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਹੱਲ ਹੋ ਜਾਂਦੀਆਂ ਹਨ। ਇੱਥੇ ਪਤੇ ਉਦਾਹਰਨ ਲਈ ਹਨ: tun0 ਬਾਹਰਲਾ ਟਨਲ ਹੈ, 203.0.113.9 ਅੰਦਰਲਾ ਸਰਵਰ ਹੈ, ਅਤੇ TCP 9999 ਉਹ ਫਲੋ ਹੈ ਜਿਸਨੂੰ ਅੰਦਰਲਾ ਰਸਤਾ ਵਰਤਣਾ ਚਾਹੀਦਾ ਹੈ।

ਅਸਫਲਤਾ ਦੇ ਦੋ ਢੰਗ, ਇੱਕ ਰੂਟ ਟੇਬਲ

ਅੰਦਰਲਾ ਕਲਾਇੰਟ ਆਪਣੇ ਸਰਵਰ ਵੱਲ UDP ਸਾਕਟ ਖੋਲ੍ਹਦਾ ਹੈ, ਅਤੇ ਉਹ ਸਾਕਟ ਕਿਸੇ ਹੋਰ ਵਾਂਗ ਮੌਜੂਦਾ ਰੂਟ ਟੇਬਲ ਦੀ ਪਾਲਣਾ ਕਰਦਾ ਹੈ। ਜੇ ਬਾਹਰਲੇ ਟਨਲ ਕੋਲ ਪਹਿਲਾਂ ਹੀ ਡਿਫੌਲਟ ਹੈ, ਤਾਂ ਹੈਂਡਸ਼ੇਕ ਪੈਕਟ ਬਾਹਰਲੇ ਟਨਲ ਵਿੱਚ ਚਲੇ ਜਾਂਦੇ ਹਨ। ਇਹ ਤਾਂ ਹੀ ਕੰਮ ਕਰਦਾ ਹੈ ਜਦੋਂ ਬਾਹਰਲਾ ਸਰਵਰ ਅੰਦਰਲੇ ਸਰਵਰ ਤੱਕ ਪਹੁੰਚ ਸਕਦਾ ਹੈ ਅਤੇ ਦੂਜਾ ਪਾਸਾ ਫਲੋ ਲਿਜਾਣ ਲਈ ਸਹਿਮਤ ਹੁੰਦਾ ਹੈ; ਨਹੀਂ ਤਾਂ ਹੈਂਡਸ਼ੇਕ ਰੁਕ ਜਾਂਦਾ ਹੈ ਅਤੇ ਕਲਾਇੰਟ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ।

ਦੂਜੀ ਅਸਫਲਤਾ ਸਰਵਰ ਦੇ push ਤੋਂ ਆਉਂਦੀ ਹੈ। ਆਮ push redirect-gateway def1 ਹੈ, ਜੋ ਡਿਫੌਲਟ ਰੂਟ ਬਦਲਣ ਦੀ ਥਾਂ 0.0.0.0/1 ਅਤੇ 128.0.0.0/1 ਸਥਾਪਤ ਕਰਦਾ ਹੈ। ਇਸ ਲਈ ਜੋ ਦੋ ਕਲਾਇੰਟ ਆਪੋ-ਆਪਣੀ /1 ਜੋੜੀ ਸਥਾਪਤ ਕਰਦੇ ਹਨ, ਉਹ ਟਕਰਾਉਂਦੇ ਹਨ, ਅਤੇ ਲਗਭਗ ਹਰ ਮੰਜ਼ਿਲ ਲਈ ਨਵੀਂ ਜੋੜੀ ਜਿੱਤਦੀ ਹੈ। ਜਦੋਂ ਦੂਜੇ ਦੇ ਜੁੜਨ ਤੋਂ ਬਾਅਦ ਟਨਲ ਮਰ ਜਾਵੇ ਤਾਂ ਟੇਬਲ ਵਿੱਚ ਉਹ ਦੋ ਪ੍ਰੀਫਿਕਸ ਵੇਖੋ, ਕਿਉਂਕਿ ਡਿਫੌਲਟ ਰੂਟ ਆਪ ਕਦੇ ਨਾ ਬਦਲਿਆ ਹੋਵੇ।

ਫਲੋ ਨੂੰ ਨਿਸ਼ਾਨ ਲਗਾਓ ਅਤੇ ਉਸਨੂੰ ਟੇਬਲ ਦਿਓ

ਚੁਣੇ ਟ੍ਰੈਫਿਕ ਨੂੰ mangle ਟੇਬਲ ਵਿੱਚ ਨਿਸ਼ਾਨ ਲਗਾ ਕੇ ਅਤੇ ਨੀਤੀ ਨਿਯਮ ਵਿੱਚ ਉਸ ਨਿਸ਼ਾਨ ਨਾਲ ਮੇਲ ਕਰਕੇ ਦਿਸ਼ਾ ਦਿਓ। ਨਿਯਮ ਉਸ ਸਮਰਪਿਤ ਟੇਬਲ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਦਾ ਹੈ ਜਿਸਦਾ ਡਿਫੌਲਟ ਰੂਟ ਅੰਦਰਲਾ ਯੰਤਰ ਹੈ, ਇਸ ਲਈ ਸਿਰਫ ਨਿਸ਼ਾਨ ਲੱਗੇ ਪੈਕਟ ਅੰਦਰਲਾ ਰਸਤਾ ਲੈਂਦੇ ਹਨ।

iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200

ਇਸ ਨਿਯਮ ਸਮੂਹ ਵਿੱਚ ਬਹੁਤੀਆਂ ਅਸਫਲਤਾਵਾਂ ਦੋ ਗਲਤੀਆਂ ਤੋਂ ਆਉਂਦੀਆਂ ਹਨ। ਫਾਇਰਵਾਲ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਨਿਸ਼ਾਨ ਮੁੱਲ ਅਤੇ ਨਿਯਮ ਵੱਲੋਂ ਮੇਲਿਆ ਮੁੱਲ ਇੱਕੋ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਕਿਉਂਕਿ ਅੰਤਰ ਨਾ ਕੋਈ ਗਲਤੀ ਦਿੰਦਾ ਹੈ ਨਾ ਅਸਰ। ਅਤੇ PREROUTING ਸਿਰਫ ਬਾਹਰੋਂ ਆਉਣ ਵਾਲੇ ਪੈਕਟ ਵੇਖਦਾ ਹੈ, ਇਸ ਲਈ ਇਸ ਹੋਸਟ 'ਤੇ ਸ਼ੁਰੂ ਹੋਏ ਕਨੈਕਸ਼ਨ ਨੂੰ ਨਿਸ਼ਾਨ ਲੱਗਣ ਤੋਂ ਪਹਿਲਾਂ ਉਸੇ ਮੇਲ ਵਾਲਾ OUTPUT ਨਿਯਮ ਚਾਹੀਦਾ ਹੈ।

ਦੂਜੇ ਕਲਾਇੰਟ ਤੋਂ ਰੂਟ ਦੀ ਮਾਲਕੀ ਲੈ ਲਓ

ਦੋ ਵਿਕਲਪ ਦੂਜੇ ਕਲਾਇੰਟ ਨੂੰ ਟੇਬਲ ਸੋਧਣ ਤੋਂ ਰੋਕਦੇ ਹਨ, ਅਤੇ ਉਹ ਵੱਖ-ਵੱਖ ਥਾਵਾਂ 'ਤੇ ਕੰਮ ਕਰਦੇ ਹਨ। route-nopull push ਕੀਤੇ ਰੂਟ ਵਿਕਲਪਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਕੁਝ ਵੀ ਸਥਾਪਤ ਨਹੀਂ ਹੁੰਦਾ। route-noexec push ਕੀਤੇ ਵਿਕਲਪਾਂ ਨੂੰ ਕਲਾਇੰਟ ਦੇ ਵਾਤਾਵਰਨ ਵਿੱਚ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ ਪਰ ਟੇਬਲ ਬਦਲਾਅ hook 'ਤੇ ਛੱਡ ਦਿੰਦਾ ਹੈ, ਅਤੇ ਇਹੀ ਤੁਸੀਂ ਉਦੋਂ ਚਾਹੁੰਦੇ ਹੋ ਜਦੋਂ ਸਰਵਰ ਨੇ ਕੀ ਪੇਸ਼ ਕੀਤਾ ਇਹ ਵੇਖਣਾ ਹੋਵੇ।

Hook push ਕੀਤੇ ਮੁੱਲਾਂ ਨਾਲ ਆਪਣੇ ਵਾਤਾਵਰਨ ਵਿੱਚ ਚੱਲਦਾ ਹੈ, ਅਤੇ ਉਸਨੂੰ ਸਿਰਫ ਤੁਹਾਡੇ ਮਨਜ਼ੂਰ ਕੀਤੇ ਐਂਟਰੀਆਂ ਜੋੜਨੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ। ਇਸਨੂੰ idempotent ਬਣਾਓ: ਦੁਬਾਰਾ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਉਸਦੀ ਮਾਲਕੀ ਵਾਲੀ ਟੇਬਲ ਖਾਲੀ ਕਰੋ, ਅਤੇ ਇਹ ਨਾ ਮੰਨੋ ਕਿ ਪਿਛਲੀ ਵਾਰ ਸਾਫ਼ ਹਾਲਤ ਛੱਡੀ ਸੀ। ਦੁਬਾਰਾ ਜੁੜਨ 'ਤੇ hook ਫਿਰ ਬੁਲਾਇਆ ਜਾਂਦਾ ਹੈ, ਅਤੇ ਸਾਫ਼ ਕੀਤੇ ਬਿਨਾਂ ਜੋੜਨ ਵਾਲਾ hook ਨਕਲੀ ਰੂਟ ਇਕੱਠੇ ਕਰਦਾ ਹੈ।

ਇੱਕ ਮਾਲਕ ਚੁਣੋ ਅਤੇ ਉਸਨੂੰ ਲਿਖ ਲਓ। ਜੋ ਪ੍ਰੋਫਾਈਲ ਦੋਵੇਂ ਵਿਕਲਪ ਸੈੱਟ ਕਰਦੀ ਹੈ, ਜਾਂ ਜੋ hook ਹੱਥੀ ਸਕ੍ਰਿਪਟ ਨਾਲ ਮੁਕਾਬਲਾ ਕਰਦਾ ਹੈ, ਉਹ ਅਜਿਹੀ ਟੇਬਲ ਬਣਾਉਂਦਾ ਹੈ ਜਿਸਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕੋਈ ਸਮਝਾ ਨਹੀਂ ਸਕਦਾ।

ਦੋਵੇਂ ਸਰਵਰ ਪਤੇ ਪਿੰਨ ਕਰੋ

ਅੰਦਰਲੇ ਕਲਾਇੰਟ ਦੇ ਜੁੜਨ ਤੋਂ ਪਹਿਲਾਂ ਅੰਦਰਲੇ ਸਰਵਰ ਨੂੰ ਬਾਹਰਲੇ ਯੰਤਰ ਰਾਹੀਂ ਹੋਸਟ ਰੂਟ ਚਾਹੀਦਾ ਹੈ। ਉਹੀ ਐਂਟਰੀ ਅੰਦਰਲੇ ਟਰਾਂਸਪੋਰਟ ਨੂੰ ਡਿਫੌਲਟ ਦੀ ਪਾਲਣਾ ਕਰਨ ਦੇਣ ਦੀ ਥਾਂ ਬਾਹਰਲੇ ਟਨਲ ਅੰਦਰ ਰੱਖਦੀ ਹੈ।

ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9

ਮੁੱਖ ਟੇਬਲ ਵਿੱਚ ਬਾਹਰਲੇ ਸਰਵਰ ਲਈ ਵੀ ਮੇਲ ਖਾਂਦਾ ਹੋਸਟ ਰੂਟ ਜੋੜੋ, ਨਹੀਂ ਤਾਂ ਦੁਬਾਰਾ ਜੁੜਨ 'ਤੇ ਬਾਹਰਲੇ ਕਲਾਇੰਟ ਦਾ ਆਪਣਾ ਟਰਾਂਸਪੋਰਟ ਉਸਦੇ ਆਪਣੇ ਟਨਲ ਵਿੱਚ ਰੂਟ ਹੋ ਸਕਦਾ ਹੈ। ਕ੍ਰਮ ਚੋਣਵਾਂ ਨਹੀਂ ਹੈ: ਇਹ ਐਂਟਰੀਆਂ ਸੰਬੰਧਿਤ ਇੰਟਰਫੇਸ ਬਣਨ ਤੋਂ ਬਾਅਦ ਜੋੜੋ, ਭਾਵ ਕਨੈਕਸ਼ਨ ਤੋਂ ਬਾਅਦ ਚੱਲਣ ਵਾਲਾ hook ਜਾਂ ਸਕ੍ਰਿਪਟ। ਬੰਦ ਯੰਤਰ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਨ ਵਾਲਾ ਰੂਟ ਹਟਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ ਜਾਂ ਅਣਡਿੱਠ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਸ ਲਈ ਬੂਟ ਵੇਲੇ ਲਿਖੀ ਐਂਟਰੀ ਤੁਹਾਡੇ ਮੰਨੇ ਕ੍ਰਮ ਵਿੱਚ ਨਹੀਂ ਟਿਕਦੀ।

ਪੂਰੀ ਟੇਬਲ ਪੜ੍ਹਨ ਦੀ ਥਾਂ ਖੋਜ ਜਾਂਚੋ। ਰੂਟ ਖੋਜ ਦਾ ਆਉਟਪੁੱਟ ਉਹ ਯੰਤਰ ਅਤੇ ਸਰੋਤ ਪਤਾ ਦੱਸਦਾ ਹੈ ਜੋ kernel ਵਰਤੇਗਾ, ਅਤੇ ਕਲਾਇੰਟ ਆਪਣਾ ਸਾਕਟ ਖੋਲ੍ਹਦਿਆਂ ਠੀਕ ਉਹੀ ਪਾਉਂਦਾ ਹੈ।

ਜ਼ੰਜੀਰ ਦੀ ਪਰਖ ਕਰੋ ਅਤੇ ਅਸਫਲਤਾ ਦਿਖਣ ਯੋਗ ਬਣਾਓ

ਅੰਦਰਲਾ ਕਲਾਇੰਟ ਜੁੜਦਿਆਂ ਬਾਹਰਲੇ ਇੰਟਰਫੇਸ 'ਤੇ ਕੈਪਚਰ ਕਰੋ। ਅੰਦਰਲਾ ਹੈਂਡਸ਼ੇਕ ਬਾਹਰਲੇ ਟਨਲ ਅੰਦਰ ਇਨਕ੍ਰਿਪਟਿਡ ਪੇਲੋਡ ਵਜੋਂ ਦਿਖਣਾ ਚਾਹੀਦਾ ਹੈ; ਜੇ ਇਹ 203.0.113.9 ਵੱਲ ਸਾਧਾਰਨ UDP ਵਜੋਂ ਦਿਖੇ, ਤਾਂ ਹੋਸਟ ਰੂਟ ਨਹੀਂ ਹੈ ਅਤੇ ਜ਼ੰਜੀਰ ਕਦੇ ਬਣੀ ਹੀ ਨਹੀਂ।

ਭੌਤਿਕ ਅਪਲਿੰਕ 'ਤੇ ਚੁੱਪਚਾਪ ਵਾਪਸ ਜਾਣ ਵਾਲੀ ਜ਼ੰਜੀਰ ਸਭ ਤੋਂ ਮਾੜਾ ਨਤੀਜਾ ਹੈ, ਕਿਉਂਕਿ ਇੰਟਰਫੇਸ ਦੀ ਹਾਲਤ ਕੁਝ ਨਹੀਂ ਐਲਾਨਦੀ ਅਤੇ ਅੰਦਰਲਾ ਟ੍ਰੈਫਿਕ ਗਲਤ ਸਰੋਤ ਪਤੇ ਤੋਂ ਨਿਕਲਦਾ ਹੈ। ਜੇ ਬਾਹਰਲਾ ਟਨਲ ਡਿੱਗਣ 'ਤੇ ਦੂਜਾ ਕਲਾਇੰਟ ਸਿੱਧਾ ਦੁਬਾਰਾ ਜੁੜ ਸਕਦਾ ਹੈ, ਤਾਂ ਉਹ ਰਸਤਾ ਬੰਦ ਕਰੋ ਜਾਂ ਅਸਫਲਤਾ ਦਿਖੇ ਇਸ ਲਈ ਉਸਨੂੰ ਬਾਹਰਲੇ ਇੰਟਰਫੇਸ ਨਾਲ ਬੰਨ੍ਹੋ।

ਦੋ ਫਲੋ ਅਤੇ ਇੱਕ ਨਿਯਮ ਡੰਪ ਨਾਲ ਮੁਕੰਮਲ ਕਰੋ: ਨਿਸ਼ਾਨ ਲੱਗਿਆ ਅਤੇ ਬਿਨਾਂ ਨਿਸ਼ਾਨ ਵਾਲਾ ਕਨੈਕਸ਼ਨ ਵੱਖਰੇ ਰਸਤੇ ਲੈਣੇ ਚਾਹੀਦੇ ਹਨ, ਅਤੇ ip rule show ਨੂੰ ਤੁਹਾਡੀ ਚਾਹੀ ਤਰਜੀਹ ਸੂਚੀਬੱਧ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ। ਜੇ ਦੋਵੇਂ ਫਲੋ ਇੱਕੋ ਰਸਤਾ ਲੈਂਦੇ ਹਨ, ਤਾਂ ਨਿਸ਼ਾਨ ਉੱਥੇ ਲਾਗੂ ਨਹੀਂ ਹੋ ਰਿਹਾ ਜਿੱਥੇ ਤੁਸੀਂ ਸੋਚਦੇ ਹੋ।

ਸੰਬੰਧਿਤ ਲੇਖ