VPNservice.builder.addAddress - what does it do?

ita*_*ill 7 android android-vpn-service

According to the official documentation:

Add a network address to the VPN interface. Both IPv4 and IPv6 addresses are supported. At least one address must be set before calling establish(). Adding an address implicitly allows traffic from that address family (i.e., IPv4 or IPv6) to be routed over the VPN. @see #allowFamily

However, it is still not clear to me, and digging through dns66's source and Netguard's source did not help much either.

I am not sure it is supposed to be the server address, but I cannot think of anything else which is meaningful. What address do I set if I want to implement a localVPN, before establish()?

This is dns66's source, but I don't see why it adds these addresses (how does it know that 192.168.50.1 will work, if everything "fails")?:

    // Determine a prefix we can use. These are all reserved prefixes for example
    // use, so it's possible they might be blocked.
    for (String prefix : new String[]{"192.0.2", "198.51.100", "203.0.113"}) {
        try {
            builder.addAddress(prefix + ".1", 24);
        } catch (IllegalArgumentException e) {
            continue;
        }

        format = prefix + ".%d";
        break;
    }

    // For fancy reasons, this is the 2001:db8::/120 subnet of the /32 subnet reserved for
    // documentation purposes. We should do this differently. Anyone have a free /120 subnet
    // for us to use?
    byte[] ipv6Template = new byte[]{32, 1, 13, (byte) (184 & 0xFF), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    if (hasIpV6Servers(config, dnsServers)) {
        try {
            InetAddress addr = Inet6Address.getByAddress(ipv6Template);
            Log.d(TAG, "configure: Adding IPv6 address" + addr);
            builder.addAddress(addr, 120);
        } catch (Exception e) {
            e.printStackTrace();

            ipv6Template = null;
        }
    } else {
        ipv6Template = null;
    }

    if (format == null) {
        Log.w(TAG, "configure: Could not find a prefix to use, directly using DNS servers");
        builder.addAddress("192.168.50.1", 24);
    }
Run Code Online (Sandbox Code Playgroud)

Top*_*ter 0

Bridge您基本上添加了(提供整个互联网的路由器)的IP ,对我来说,执行以下操作就足够了:

import android.net.VpnService.Builder;

// ...

boolean is_ip_version_6_supported = true;

Builder builder = new Builder();
builder.setSession("My App's session");

// Specify address of the bridge (or router providing the whole internet),
// to use for IP version 4 and 6 connection capturing (like a firewall).
builder.addAddress("10.1.10.1", 32);
if (is_ip_version_6_supported) {
  builder.addAddress("fd00:1:fd00:1:fd00:1:fd00:1", 128);
}

// ...
Run Code Online (Sandbox Code Playgroud)

注意:我也是初学者,所以,请随意编辑和改进我的帖子;-)
无论如何,您的应用程序将负责将本地捕获的数据包转发到 VPN 服务器并将远程的响应数据包注入回本地。