Java Android VPN服务配置 我试图使用Android的VPNService在客户端建立一个简单的TUN设备,在接收端我有一个C++服务器运行。p>

Java Android VPN服务配置 我试图使用Android的VPNService在客户端建立一个简单的TUN设备,在接收端我有一个C++服务器运行。p>,java,android,c++,vpn,Java,Android,C++,Vpn,我对VPN服务有很多问题。这就是我需要的, 我需要所有从Android手机发出的数据包都被路由到tun设备,在程序中,我通过数据报通道将其路由到服务器。当我发送字符串时,它工作正常,但当我通过此数据报通道发送其他数据时,我在Wireshark中看不到任何UDP数据包:\ 此外,我还不熟悉Java和数据报通道。这是我的密码 //To establish the tunnel builder.setSession("MyVPNService") .addAddress("19

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

此外,我还不熟悉Java和数据报通道。这是我的密码

//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”时,整个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);
            }

这是我从接口中取出并放在另一个接口上的部分

首先,让我从解释上面的配置开始

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应该处理哪些路由?

嗯,有很多选择

  • 路由所有内容-添加0.0.0.0/0(对于IPv4)和::/0(对于IPv6)将通过VPN路由所有目的地的流量(注意:0.0.0.0/0表示整个IPv4范围,即0.0.0.0到255.255.255.255)
  • 特定于路由的路由-您通常会注意到,当VPN运行时,与物联网设备通话不起作用。这通常是由于“路由所有内容”配置设置中断了本地网络(例如chromecast)。因此,排除链路本地流量需要进行一些数学计算,包括从上述子网中减去链路本地子网(0.0.0.0/0,::/0(对于v6本地子网))。涉及的数学不是很简单,这使得这个选项更加复杂。关于构成链接本地子网的内容,这里列出了IETF和特殊地址的列表
  • 也就是说,以下是对您的问题的一些回答

    我需要所有从Android手机传出的数据包被路由到tun设备

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

    tun设备不应该有一个IP吗

    linux上的接口可以从不同的地址族中分配多个接口地址

    那么什么是“192.168.56.0”,32“

    如上所述,第一部分是IP地址,第二部分定义子网掩码。另请参阅

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


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

    这将有助于[1]:面临类似问题?你能解决问题吗?