【问题标题】:Android VpnService ConfigurationAndroid VpnService 配置
【发布时间】:2015-04-22 23:23:45
【问题描述】:

我正在尝试使用来自 android 的 VpnService 在客户端设置一个简单的 tun 设备,在接收端我有一个 c++ 服务器正在运行。

我在使用 VpnService 时遇到了很多问题。这是我需要的 我需要将所有从 Android 手机出站的数据包路由到 tun 设备,并在程序中通过数据报通道将其路由到服务器。当我发送一个字符串时,它工作正常,但是当我通过这个数据报通道发送其他数据时,我在 Wireshark 中看不到任何 UDP 数据包:\

另外,我是 Java 和 Datagram 频道的新手。这是我的代码

//To establish the tunnel
builder.setSession("MyVPNService")
            .addAddress("192.168.56.0", 32)
            .addDnsServer("8.8.8.4")
            .addRoute("0.0.0.0", 1);

mInterface=builder.establish();

以上配置具体是做什么的? tun设备不应该有一个IP(根据我在linux上的经验),那么什么是“192.168.56.0”,32”。此外,当我尝试添加路线“0.0.0.0”时,0 整个 android 手机都会挂起并重新启动:\

while (true) {
                int length;
                // Read the outgoing packet from the input stream.

                length=in.read(packet_bytes);
                //int length = in.read(packet.array());
                if (length > 0) {
                    // Write the outgoing packet to the tunnel.
                    //packet.limit(length);
                    //tunnel.send(packe,server);
                    tunnel.send(packet,server);
                    packet.put(packet_bytes,0,length);

                    tunnel.write(packet);

                    packet.clear();
                }
                Thread.sleep(200);
                // Read the incoming packet from the tunnel.

                length = tunnel.read(packet);
                if (length > 0) {

                    out.write(packet.array(), 0, length);

                    packet.clear();

                    // If we were sending, switch to receiving.
                }
                Thread.sleep(200);
            }

这是我从界面中取出并放在另一个上的部分。

【问题讨论】:

标签: java android c++ vpn


【解决方案1】:

首先,我先解释一下上面的Builder配置。

builder.setSession("MyVPNService") // This one is optional. 

.addAddress("192.168.56.0", 32) // This is used to assign interface address. First param is IP address, and second in prefix length. "Prefix" length is also commonly known as subnet mask.

.addDnsServer("8.8.8.4") // This configures the DNS network for VPN network. For ex - All DNS resolutions would go to 8.8.8.4:53. Note that the DNS request packets gets routed through the tun interface.

.addRoute("0.0.0.0", 1); // This controls the IP addresses which gets routed through tun interface.

注意 - tun 接口可以支持多个地址系列(IPv4/IPv6)。例如,您可以分配多个接口地址(例如一个 v4、一个 v6 或两个 v6 地址,或任何组合)。

同样,您可以添加您希望 VPN 处理的路由。现在,主要问题是您如何决定我的 VPN 应该处理哪些路由?

嗯,有很多选择。

  1. 路由所有内容 - 添加 0.0.0.0/0(对于 IPv4)和 ::/0(对于 IPv6)将通过 VPN 路由所有目的地的流量(注意:0.0.0.0/0 代表整个 IPv4 范围,即 0.0.0.0到 255.255.255.255)。
  2. 路由特定路由 - 您通常会注意到在 VPN 运行时与 IoT 设备通信不起作用。这通常是由于“路由一切”配置设置破坏了本地网络(例如 chromecast)。因此,排除链路本地流量需要做一些数学运算,包括从上述子网中减去链路本地子网(0.0.0.0/0、::/0(对于 v6 本地子网))。所涉及的数学不是很简单,这使得这个选项更加复杂。至于链接本地子网的构成,这里是来自wikipedia 的列表,以及来自 IETF 的IPv4IPv6 特殊地址的列表。

也就是说,这里有一些问题的答案。

我需要将 Android 手机出站的所有数据包路由到 tun 设备

请参阅上面的“路由所有内容”。

tun 设备不应该有一个 IP 吗?

Linux 上的一个接口可以有多个来自不同地址族的接口地址。

那么什么是“192.168.56.0”,32”。

如上所述,第一部分是 IP 地址,第二部分定义子网掩码。另见CIDR notation

此外,当我尝试添加路由“0.0.0.0”时,0 整个 android 手机都会挂起并重新启动。

0.0.0.0/0 表示整个 IPv4 地址空间将通过 VPN 进行路由。通常,VPN 无法处理我上面提到的链接本地流量。因此,您必须排除某些本地子网(请参阅上面的链接)。至于电话挂起和重启,我不确定这是否与 VPN 有任何关系,除非 VPN 没有正确处理流量(这会导致与网络相关的应用程序中断)。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2014-03-30
    • 2017-12-05
    • 1970-01-01
    • 2016-09-13
    • 2021-11-09
    • 1970-01-01
    • 2013-12-12
    • 2013-07-19
    相关资源
    最近更新 更多