我正在尝试使用Android的VpnService在客户端设置一个简单的tun设备,在接收端我运行了一个c ++服务器。
我在使用VpnService时遇到很多问题。这就是我需要的, 我需要将从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”,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);
}
这是我从界面中取出它并将其放在另一个上的部分。
答案 0 :(得分:0)
首先,让我开始解释上面的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应该处理哪些路由?
有很多选择。
也就是说,这是您问题的一些答案。
我需要将Android手机出站的所有数据包都路由到tun设备
请参见上方的“路由所有内容”。
tun设备不是应该具有一个IP吗?
Linux上的接口可以从不同的地址族分配多个接口地址。
那么什么是“ 192.168.56.0”,32“。
如上所述,第一部分是IP地址,第二部分定义了子网掩码。另请参见CIDR notation。
此外,当我尝试添加路由“ 0.0.0.0”时,整个Android手机都会挂起并重新启动。0
0.0.0.0/0表示整个IPv4地址空间都将通过VPN路由。如上所述,通常,VPN无法处理链接本地流量。因此,您将必须排除某些本地子网(请参阅上面的链接)。至于电话的挂起和重启,除非VPN无法正确处理流量(这将导致与网络相关的应用中断),否则我不确定这是否与VPN有关。