gpt4 book ai didi

java - Android VpnService 配置

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:10 27 4
gpt4 key购买 nike

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

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

另外,我是 Java 和数据报 channel 的新手。这是我的代码

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

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

最佳答案

首先,让我先解释一下 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 接口(interface)可以支持多个地址族 (IPv4/IPv6)。例如,您可以分配多个接口(interface)地址(比如一个 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特殊地址。

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

I need ALL packets outbound from the Android phone to be routed to the tun device

参见上面的“路由一切”。

Isn't a tun device supposed to have ONE IP?

Linux 上的一个接口(interface)可以从不同的地址族分配给它多个接口(interface)地址。

Then what is "192.168.56.0", 32".

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

Also when I try to add a route "0.0.0.0", 0 the whole android phone hangs and restarts.

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

关于java - Android VpnService 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810727/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com