安卓VpnService配置

3
我正在尝试使用Android中的VpnService在客户端上设置一个简单的tun设备,并在接收端运行一个c++服务器。但是我在使用VpnService时遇到了许多问题。这就是我需要的,我需要将Android手机发出的所有数据包路由到tun设备,并在程序中通过Datagram通道将其路由到服务器。当我发送字符串时,它可以正常工作,但是当我通过此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();

上述配置到底是做什么的?从我的经验来看,tun设备应该只有一个IP,那么"192.168.56.0", 32是什么意思呢?当我尝试添加路由“0.0.0.0”,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);
            }

这是我从接口中取出数据并放到另一个地方的过程。

这将有所帮助: - M Bilal
遇到类似的问题了吗?你能解决这个问题吗? - thedarkpassenger
1个回答

5

首先,让我解释一下上面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时与物联网设备通信无法正常工作。这通常是由于“路由所有”配置设置破坏了本地网络连接(例如-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”,0时,整个Android手机都会挂起并重新启动。

0.0.0.0/0 表示整个 IPv4 地址空间将通过 VPN 进行路由。通常,VPN 无法处理本地链路流量,如我上面所提到的。因此,您需要排除某些本地子网(请参见上面的链接)。至于手机挂起和重新启动,我不确定这是否与 VPN 有任何关系,除非 VPN 没有正确处理流量(这将导致与网络相关的应用程序出现问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接