VPNservice.builder.addAddress - 它做了什么?

时间:2018-04-10 13:36:34

标签: android android-vpn-service

根据官方文件:

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

然而,我仍然不清楚,挖掘dns66的来源和Netguard的来源也没有多大帮助。

我不确定它应该是服务器地址,但我想不出任何其他有意义的东西。如果我想在establish()之前实现localVPN,我会设置什么地址?

这是dns66的来源,但我不明白为什么它会添加这些地址(如果所有内容"失败")它如何知道192.168.50.1将起作用?:?:

    // 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);
    }

1 个答案:

答案 0 :(得分:0)

您基本上添加了Bridge(提供整个Internet的路由器)的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);
}

// ...

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