繁体   English   中英

Android VpnService配置

[英]Android VpnService Configuration

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

我在VpnService上遇到很多问题。 这就是我需要的,我需要将Android手机出站的所有数据包都路由到tun设备,然后在程序中将其通过Datagram通道路由到服务器。 当我发送一个字符串时,它工作正常,但是当我通过该数据报通道发送其他数据时,我在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();

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

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

这是我从界面上将其放到另一个上的部分。

首先,让我开始解释上面的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表示法

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM