我试图通过VPN将数据包发送出去的VPN的到合适的硬件,而无需使用任何真正的VPN服务器,这样我就可以登录数据包被发送过。
我能够得到InetAddress
的wlan0
接口我想要的包居然去,但我也不太清楚,如果这是在所有(它显示了我当前的IP地址)的正确的地方。
然后我用一个DatagramChannel
(称为socket
和IntetAddress
是uplink
)就可以了:
socket.connect(new InetSocketAddress(uplink, 0));
和写入数据包到它:
socket.write(packet);
但没有什么棒,我只是得到
java.net.SocketException: sendto failed: EINVAL (Invalid argument)
我试图做创建的Android防火墙/过滤应用类似的东西。 我在这中间,所以采取什么我与盐的合适尺寸的晶说。 :-)
与你/我的情况的问题是,你正在做的包关闭的VpnService给你的虚拟网络接口,但此时你服用这些数据包,写出来与插座。 套接字是为了处理应用程序有效载荷的客户端和服务器,而不是数据包之间的传送。
(如果如果使用的DatagramSocket的,你是采用Socket,UDP,TCP)插座将带你把它的任何数据,它自己创造的包内包的数据。 在你的情况,你交给套接字的数据本身就是一个数据包,这样的话你结束了一个包内的数据包(有可能是UDP数据包内的TCP数据包)。
当包裹包到达服务器的插槽,网络接口和ServerSocket上月底将解开有效载荷,并发现这是一个数据包。 也许行不通的,因为无论是从服务器端读取套接字(如Web服务器)期待的应用有效载荷(例如HTTP标头的/ etc。)。
现在,当你有一个真正的VPN隧道,该隧道的服务器端可能是拉你的“包裹包”有效载荷进行接收,然后直接交给该数据包的网络接口的UDP数据包,可以解释数据包本身的。
如果没有这种真正的VPN隧道,你VpnService IMPL实质上有可能成为一个虚拟的网络接口本身,处理TCP / UDP /等。 虚拟网络接口和代码之间的协议。 基本上,从您的VPN接口读取数据包必须书面向您发送的套接字之前被当作应用数据流(整理和重新组合数据包)。 然后,你必须以某种方式承认你只是从接口消耗的数据包。 然后,你必须从你的套接字(这是一个有效载荷数据流)拿进来的数据,并把它分解成数据包,然后可以发送回您的VPN接口的输出流。 最后,你需要处理确认交通虚拟VPN接口将根据你发送的数据包发送。 这是不平凡的事。
我真希望我是错的这一切,并有人用Java编写一个简单的“虚拟网络接口”,可以用来把真正的VPN隧道的地方。 我一直没能找到它。
您可以使用NetworkInterface的API的编程获取为wlan0地址。
我也试图做类似的事情...我能看到在虚拟接口的数据包。但是我不能够通过本地接口发送数据包..
我能够连接与DatagramChannel到为wlan0,但为wlan0连接到外部服务器是停留在SYN_SEND ..
你可以尝试更高的端口。 这个工作对我来说: InetSocketAddress(uplink, 3022)
我不知道如何确保该端口没有被使用。
你是如何获得为wlan0的地址? 我用亚行外壳ifconfig和粘贴地址。