Android本地VPN服务:不能转发数据包
我试图通过VPN服务实现简单的Android防火墙应用程序。
基本方案如下所示:
我试图简单地通过我的VPN服务转发数据包。 所以我已经开始实现ToyVpn Google示例(时间到了这个例子),但是它不工作:当我的VPN运行时,我看到数据包被发送,但我没有回应。
应用程序是在Kotlin上编写的,但对Java爱好者来说并不复杂。
我的生成器配置了IP和路由,如下所示:
val builder = Builder() builder.addAddress("10.0.0.2", 32).addRoute("0.0.0.0", 0) mInterface = builder.establish()
之后,我按照ToyVpn中的方式设置隧道 ,但我的VPN服务器目标IP地址是本地的:
val tunnel = DatagramChannel.open() if (!protect(tunnel.socket())) { throw IllegalStateException("Cannot protect the tunnel"); } tunnel.connect(InetSocketAddress("127.0.0.1", 55555)) tunnel.configureBlocking(false) protect(tunnel.socket())
之后,我试图转发数据包out
FileInputStream的(也取自ToyVpn):
val `in` = FileInputStream(mInterface!!.fileDescriptor) val out = FileOutputStream(mInterface!!.fileDescriptor) var timer = 0 while (true) { var idle = true var length = `in`.read(packet.array()) if (length > 0) { packet.limit(length) tunnel.write(packet); packet.clear() idle = false if (timer < 1) { timer = 1 } } length = tunnel.read(packet) if (length > 0) { if (packet.get(0).toInt() !== 0) { out.write(packet.array(), 0, length) } packet.clear() idle = false if (timer > 0) { timer = 0 } } if (idle) { Thread.sleep(100) timer += if (timer > 0) 100 else -100 if (timer < -15000) { packet.put(0.toByte()).limit(1) for (i in 0..2) { packet.position(0) tunnel.write(packet) } packet.clear() timer = 1 } if (timer > 20000) { throw IllegalStateException("Timed out") } } Thread.sleep(50) }
我的第一个问题:我做错了什么? 代码是清楚的,应该正常工作,但它不!
基本上,我希望我的服务通过IP地址fitler包。 我知道像tPacketCapture这样的大型应用程序从头开始解析数据包,并重建它们。
我的第二个问题:如果我只想获取IP地址,是否有办法简化数据包过滤?
PS:实际上我几天前已经在这里问了一个类似的问题,但是错误还有另外一个与Kotlin语言相关的性质,这个应用程序就是在这个语言上开发的。 我也看到这个和这个问题,但那里的答案没有帮助我。