Android ਦੇ VpnService ਵਿੱਚ ਬਾਹਰ ਕਰਨ ਦਾ ਕੋਈ ਰੂਟ ਨਹੀਂ ਹੈ, ਅਤੇ API ਪੜ੍ਹਨ ਦੀ ਕੋਈ ਵੀ ਮਾਤਰਾ ਇੱਕ ਨਹੀਂ ਬਣਾਏਗੀ। Builder.addRoute() ਟਨਲ ਵਿੱਚ ਹਮੇਸ਼ਾ ਸਿਰਫ਼ ਮੰਜ਼ਿਲਾਂ ਜੋੜਦਾ ਹੈ, ਇਸ ਲਈ LAN ਖੰਡ ਨੂੰ ਸਥਾਨਕ ਰੱਖਣ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਉਹ ਖੰਡ ਕਦੇ ਵੀ ਰੂਟ ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਆਉਂਦੀ। ਇਸ ਦੀ ਥਾਂ ਤੁਸੀਂ ਖੰਡ ਦਾ ਪੂਰਕ ਜੋੜਦੇ ਹੋ, ਜੋ ਆਮ ਪ੍ਰੀਫਿਕਸ ਵਜੋਂ ਪ੍ਰਗਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਕੰਮ ਗਣਿਤ ਹੈ, ਅਤੇ ਇਹ ਕੁਝ ਅੰਦਾਜ਼ੇਯੋਗ ਥਾਵਾਂ ’ਤੇ ਅਸਫਲ ਹੁੰਦਾ ਹੈ।

ਹੇਠਾਂ ਦਿੱਤੀਆਂ ਜਾਂਚਾਂ ਕ੍ਰਮ ਵਿੱਚ ਕਰੋ। ਹਰ ਇੱਕ ਮੰਨਦੀ ਹੈ ਕਿ ਪਿਛਲੀ ਟਿਕੀ, ਇਸ ਲਈ ਹੇਠਾਂ ਲੱਛਣ ਪੈਚ ਕਰਨ ਦੀ ਥਾਂ ਪਹਿਲੀ ਅਸਫਲਤਾ ’ਤੇ ਰੁਕੋ।

ਟਨਲ ਜੋ ਦਾਅਵਾ ਕਰਦੀ ਹੈ ਉਸ ਤੋਂ ਸ਼ੁਰੂ ਕਰੋ

0.0.0.0/0 ਨੂੰ addRoute() ਵਿੱਚ ਦੇਣਾ Android ਨੂੰ ਦੱਸਦਾ ਹੈ ਕਿ ਹਰ IPv4 ਮੰਜ਼ਿਲ ਟਨਲ ਦੀ ਹੈ। ਇਸੇ ਲਈ ਬਹੁਤ ਸਾਰੇ ਕਲਾਇੰਟ ਵੰਡਵੀਂ ਟਨਲਿੰਗ ਲਈ ਅਸਮਰੱਥ ਦਿਸਦੇ ਹਨ: ਉਹ ਪੂਰੀ ਪਤਾ ਜਗ੍ਹਾ ਦਾ ਦਾਅਵਾ ਕਰਦੇ ਹਨ ਅਤੇ ਫਿਰ ਉਸ ਵਿੱਚੋਂ ਘਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਨ। ਬਿਲਡਰ ਵਿੱਚ ਕੁਝ ਵੀ ਨਹੀਂ ਘਟਾਉਂਦਾ। ਜਿਸ ਨੈੱਟਵਰਕ ਨੂੰ ਤੁਸੀਂ ਸਥਾਨਕ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਸੀ ਉਸ ਲਈ ਵਧੇਰੇ ਖਾਸ ਰੂਟ ਲੋਕਾਂ ਦੀ ਉਮੀਦ ਦੇ ਉਲਟ ਕਰਦਾ ਹੈ, ਕਿਉਂਕਿ ਸਭ ਤੋਂ ਲੰਮਾ ਮਿਲਦਾ ਪ੍ਰੀਫਿਕਸ ਜਿੱਤਦਾ ਹੈ ਅਤੇ ਉਹ ਨੈੱਟਵਰਕ ਟਨਲ ਦੇ ਅੰਦਰ ਆ ਜਾਂਦਾ ਹੈ।

ਰੂਟ ਸੂਚੀ ਹੀ ਪੂਰੀ ਨੀਤੀ ਹੈ। ਇਸ ਦੇ ਪਿੱਛੇ ਹਰ ਮੰਜ਼ਿਲ ਲਈ ਵੀਟੋ ਨਹੀਂ ਹੈ, ਅਤੇ Builder ਹਵਾਲਾ ਅਜਿਹਾ ਕੋਈ ਢੰਗ ਸੂਚੀਬੱਧ ਨਹੀਂ ਕਰਦਾ ਜੋ ਇੱਕ ਦੇਵੇ।

ਪ੍ਰੀਫਿਕਸ ਗਣਿਤ ਤੋਂ ਪੂਰਕ ਬਣਾਓ

ਬਾਹਰ ਕੀਤੇ ਪ੍ਰੀਫਿਕਸ ਦਾ ਪੂਰਕ ਪਤਾ ਰੁੱਖ ਦੀ ਜੜ੍ਹ ਤੱਕ ਦੇ ਰਾਹ ’ਤੇ ਉਸ ਦੇ ਭੈਣ-ਭਰਾਵਾਂ ਦਾ ਸਮੂਹ ਹੈ। 1 ਤੋਂ ਬਾਹਰ ਕੀਤੀ ਲੰਬਾਈ ਤੱਕ ਹਰ ਲੰਬਾਈ ਲਈ, ਤੁਹਾਡਾ ਪ੍ਰੀਫਿਕਸ ਰੱਖਣ ਵਾਲਾ ਉਸ ਲੰਬਾਈ ਦਾ ਬਲਾਕ ਲਓ, ਪ੍ਰੀਫਿਕਸ ਦੇ ਠੀਕ ਹੇਠਾਂ ਬਿੱਟ ਪਲਟੋ ਅਤੇ ਨਤੀਜਾ ਦਿਓ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਚਲਾਉਣ ਤੱਕ ਇਹ ਅਮੂਰਤ ਲੱਗਦਾ ਹੈ।

10.0.0.0/8 ਬਾਹਰ ਕਰਨ ਨਾਲ ਅੱਠ ਰੂਟ ਮਿਲਦੇ ਹਨ: 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8। ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ 10.0.0.0/8 ਨਹੀਂ ਰੱਖਦਾ, ਅਤੇ ਮਿਲ ਕੇ ਉਹ ਬਾਕੀ ਸਭ ਢੱਕਦੇ ਹਨ।

ਅੱਠ ਲਾਈਨਾਂ ਕਿਸੇ ਵੀ ਪ੍ਰੀਫਿਕਸ ਲਈ ਉਹ ਸੂਚੀ ਬਣਾਉਂਦੀਆਂ ਹਨ:

import ipaddress
def complement(addr, length):
    base = int(ipaddress.IPv4Address(addr))
    out = []
    for k in range(1, length + 1):
        block = base & (0xFFFFFFFF << (32 - k))
        sibling = block ^ (1 << (32 - k))
        out.append(f"{ipaddress.IPv4Address(sibling)}/{k}")
    return out
print(complement("10.0.0.0", 8))

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

ਪਤਾ ਪਰਿਵਾਰ ਅਤੇ ਟਨਲ ਦਾ ਦਾਇਰਾ ਜਾਂਚੋ

IPv4 ਰੂਟ IPv6 ਲਈ ਕੁਝ ਨਹੀਂ ਕਰਦੇ। ਜੇ ਟਨਲ IPv6 ਪਤਾ ਦਾਅਵਾ ਕਰਦੀ ਹੈ, ਤਾਂ IPv6 LAN ਪ੍ਰੀਫਿਕਸ ਨੂੰ ਆਪਣਾ ਪੂਰਕ ਚਾਹੀਦਾ ਹੈ, ਜੋ 128 ਬਿੱਟ ’ਤੇ ਉਸੇ ਗਣਿਤ ਨਾਲ ਬਣਾਇਆ ਜਾਂਦਾ ਹੈ। ਕਾਗਜ਼ ’ਤੇ ਬਾਹਰ ਕਰਨਾ ਕੰਮ ਕਰਨ ਅਤੇ ਸਥਾਨਕ ਡਿਵਾਈਸ ਪਹੁੰਚ ਤੋਂ ਬਾਹਰ ਰਹਿਣ ਦਾ ਆਮ ਕਾਰਨ ਇਹ ਹੈ: ਹੋਸਟ ਤੱਕ IPv6 ਰਾਹੀਂ ਪਹੁੰਚਿਆ ਗਿਆ, ਅਤੇ ਸਿਰਫ਼ IPv4 ਕੱਟਿਆ ਗਿਆ। ਗਣਿਤ ਗਲਤ ਹੈ ਦਾ ਸਿੱਟਾ ਕੱਢਣ ਤੋਂ ਪਹਿਲਾਂ ਦੋਵੇਂ ਪਰਿਵਾਰ ਜਾਂਚੋ।

ਦਾਇਰਾ ਜਾਂਚ ਦਾ ਦੂਜਾ ਅੱਧ ਹੈ। Android ਨੈੱਟਵਰਕ ਅਤੇ ਐਪ ਅਨੁਸਾਰ ਰੂਟਿੰਗ ਟ੍ਰੈਕ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਉਹੀ ਪ੍ਰੀਫਿਕਸ ਇੱਕ ਐਪ ਲਈ ਟਨਲ ਰਾਹੀਂ ਅਤੇ ਦੂਜੇ ਲਈ ਸਿੱਧਾ ਜਾ ਸਕਦਾ ਹੈ, VPN ਕਿਵੇਂ ਐਲਾਨਿਆ ਗਿਆ ਇਸ ’ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ।

DNS ਅਤੇ ਪ੍ਰਤੀ-ਐਪ ਨਿਯਮ ਸਹੀ ਥਾਂ ’ਤੇ ਰੱਖੋ

ਰੂਟ ਬਾਹਰ ਕਰਨਾ ਰਿਜ਼ੌਲਵਰ ਨਹੀਂ ਬਦਲਦਾ। ਸਥਾਨਕ ਹੋਸਟਨਾਮ ਅਜੇ ਵੀ ਟਨਲ ਦੇ DNS ਸਰਵਰ ਤੋਂ ਜਵਾਬ ਲੈ ਸਕਦਾ ਹੈ ਜਦੋਂ ਕਿ ਇਸ ਦਾ ਪਤਾ ਸਥਾਨਕ ਰੂਪ ਵਿੱਚ ਰੂਟ ਹੁੰਦਾ ਹੈ, ਅਤੇ ਅਸੰਗਤੀ ਉਸ ਨਾਮ ਵਜੋਂ ਦਿਸਦੀ ਹੈ ਜੋ ਉਸ ਚੀਜ਼ ਵਿੱਚ ਹੱਲ ਹੁੰਦਾ ਹੈ ਜਿੱਥੇ LAN ਨਹੀਂ ਪਹੁੰਚ ਸਕਦਾ। ਰਿਜ਼ੌਲਵਰ ਨੀਤੀ ਜਾਣਬੁੱਝ ਕੇ ਸੈੱਟ ਕਰੋ, ਖੋਜ ਡੋਮੇਨ ਜਾਂ ਵੰਡਵੇਂ DNS ਨਿਯਮ ਨਾਲ। ਇਹ ਨਾ ਮੰਨੋ ਕਿ ਰੂਟਾਂ ਨੇ ਤੁਹਾਡੇ ਲਈ ਇਹ ਤੈਅ ਕੀਤਾ ਹੈ।

addDisallowedApplication() ਇੱਕ ਐਪ ਨੂੰ ਟਨਲ ਤੋਂ ਬਾਹਰ ਰੱਖਦਾ ਹੈ; ਅੰਦਰ ਰਹਿਣ ਵਾਲੀਆਂ ਐਪਾਂ ਲਈ ਮੰਜ਼ਿਲ ਬਾਹਰ ਨਹੀਂ ਰੱਖਦਾ। protect() ਤੁਹਾਡੇ ਖੋਲ੍ਹੇ ਸਾਕਟ ਨੂੰ ਟਨਲ ਤੋਂ ਬਚਣ ਦਿੰਦਾ ਹੈ, ਅਤੇ ਇਸ ਤਰ੍ਹਾਂ ਟਨਲ ਆਪਣੀ ਆਵਾਜਾਈ ਫੜਨ ਤੋਂ ਬਚਦੀ ਹੈ। ਦੋਵਾਂ ਵਿੱਚੋਂ ਕੋਈ ਪੂਰਕ ਦੀ ਥਾਂ ਨਹੀਂ ਲੈਂਦਾ।

ਆਪਣੀ ਸੂਚੀ ਨਾਲ ਨਹੀਂ, ਖੋਜ ਨਾਲ ਪੁਸ਼ਟੀ ਕਰੋ

ਟਨਲ ਚਾਲੂ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡੀ ਬਣਾਈ ਸੂਚੀ ਦੁਬਾਰਾ ਪੜ੍ਹਨ ਦੀ ਥਾਂ ਡਿਵਾਈਸ ਨੂੰ ਪੁੱਛੋ ਕਿ ਪਤਾ ਅਸਲ ਵਿੱਚ ਕਿੱਥੇ ਜਾਂਦਾ ਹੈ। iproute2 ਵਾਲੇ ਬਿਲਡ ’ਤੇ, adb shell ip route get 10.1.2.3 ਕਰਨਲ ਵੱਲੋਂ ਚੁਣੇ ਇੰਟਰਫ਼ੇਸ ਦਾ ਨਾਮ ਦੱਸਦਾ ਹੈ। ਜਨਤਕ ਪਤੇ ਲਈ ਉਹੀ ਕਮਾਂਡ ਚਲਾਓ ਅਤੇ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਇਹ ਟਨਲ ਦਾ ਨਾਮ ਦੱਸਦਾ ਹੈ।

ਦੋ ਹੋਰ ਜਾਂਚਾਂ ਚੱਕਰ ਬੰਦ ਕਰਦੀਆਂ ਹਨ। ਪਹਿਲਾਂ ਸਥਾਨਕ ਨਾਮ ਹੱਲ ਕਰੋ, ਫਿਰ ਹੱਲ ਹੋਏ ਪਤੇ ’ਤੇ adb shell ip route get ਚਲਾਓ ਅਤੇ ਟਨਲ ਨਾ ਹੋਣ ਵਾਲਾ ਇੰਟਰਫ਼ੇਸ ਮੰਗੋ, ਕਿਉਂਕਿ ਸਫਲ adb shell ping -c 1 host.lan ਪਹੁੰਚ ਸਿੱਧ ਕਰਦਾ ਹੈ, ਰਾਹ ਨਹੀਂ। ਟਨਲ ਇੱਕ ਦਾਅਵਾ ਕਰੇ ਤਾਂ IPv6 ’ਤੇ ਪਤਾ-ਪਰਿਵਾਰ ਜਾਂਚ ਦੁਹਰਾਓ। ਤੁਸੀਂ ਭੇਜਦੇ API ਪੱਧਰ ’ਤੇ ਜਾਂਚ ਕਰੋ, ਕਿਉਂਕਿ VPN ਨੈੱਟਵਰਕ ਰੂਟਿੰਗ ਟੇਬਲ ਸਾਹਮਣੇ ਕਿਵੇਂ ਆਉਂਦੇ ਹਨ ਇਹ ਰਿਲੀਜ਼ਾਂ ਵਿਚਕਾਰ ਬਦਲਿਆ ਹੈ। ਕਾਗਜ਼ ’ਤੇ ਸਹੀ ਦਿਸਣ ਵਾਲੀ ਰੂਟ ਸੂਚੀ ਅਤੇ ਗਲਤ ਇੰਟਰਫ਼ੇਸ ਚੁਣਨ ਵਾਲੀ ਖੋਜ ਵੱਖ-ਵੱਖ ਬੱਗ ਹਨ, ਅਤੇ ਵਰਤੋਂਕਾਰਾਂ ਤੱਕ ਸਿਰਫ਼ ਦੂਜਾ ਪਹੁੰਚਦਾ ਹੈ।

ਜੇ ਬਾਹਰ ਕਰਨ ਦੀ ਸੂਚੀ ਵਧਦੀ ਰਹੇ, ਤਾਂ ਰੂਟ ਬਣਾਉਣਾ ਬੰਦ ਕਰੋ ਅਤੇ ਦੂਰ ਦੇ ਨੈੱਟਵਰਕ ਨੂੰ ਮੁੜ-ਨੰਬਰ ਦਿਓ ਜਾਂ ਇਸ ਦੀ ਥਾਂ ਟਨਲ ਸੰਕੁਚਿਤ ਕਰੋ। ਜਨਰੇਟਰ ਗੁੰਮ API ਲਈ ਇੱਕ ਜੁਗਾੜ ਹੈ, ਡਿਜ਼ਾਈਨ ਸਾਧਨ ਨਹੀਂ।

ਸੰਬੰਧਿਤ ਲੇਖ