Java Android本地VPN服务:无法转发数据包
我正在尝试通过VPN服务实现简单的Android防火墙应用程序 基本方案如下所示: 我试图通过我的VPN服务转发数据包。因此,为了我的目的,我开始实施Google示例(不时浏览示例),但它不起作用:当我的VPN运行时,我看到数据包被发送,但我没有得到响应 该应用程序是在Kotlin上编写的,但对于Java爱好者来说并不复杂 MyBuilder配置了IP和路由,如下所示:Java Android本地VPN服务:无法转发数据包,java,android,networking,ip,kotlin,Java,Android,Networking,Ip,Kotlin,我正在尝试通过VPN服务实现简单的Android防火墙应用程序 基本方案如下所示: 我试图通过我的VPN服务转发数据包。因此,为了我的目的,我开始实施Google示例(不时浏览示例),但它不起作用:当我的VPN运行时,我看到数据包被发送,但我没有得到响应 该应用程序是在Kotlin上编写的,但对于Java爱好者来说并不复杂 MyBuilder配置了IP和路由,如下所示: val builder = Builder() builder.addAddress("10.0.0.2", 32).add
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())
之后,我尝试从in
和out
FileInputStream(也取自ToyVpn)转发数据包:
val`in`=FileInputStream(mInterface!!.fileDescriptor)
val out=FileOutputStream(mInterface!!.fileDescriptor)
变量计时器=0
while(true){
var idle=真
var length=`in`.read(packet.array())
如果(长度>0){
数据包限制(长度)
隧道写入(数据包);
packet.clear()
空闲=错误
如果(计时器<1){
计时器=1
}
}
长度=隧道读取(数据包)
如果(长度>0){
if(packet.get(0).toInt()!==0){
out.write(packet.array(),0,长度)
}
packet.clear()
空闲=错误
如果(计时器>0){
计时器=0
}
}
如果(空闲){
线程。睡眠(100)
计时器+=如果(计时器>0)100其他-100
如果(计时器<-15000){
packet.put(0.toByte()).limit(1)
对于(0..2中的i){
数据包位置(0)
隧道写入(数据包)
}
packet.clear()
计时器=1
}
如果(计时器>20000){
抛出IllegalStateException(“超时”)
}
}
线程。睡眠(50)
}
我的第一个问题:我做错了什么?代码是清晰的,应该可以正常工作,但它不是
基本上,我希望我的服务能够通过IP地址过滤数据包。我知道像这样的大型应用程序会从头开始解析数据包,然后重新构建数据包
我的第二个问题:如果我只想获取IP地址,有没有办法使包过滤更简单
p.S.:事实上,几天前我已经问了一个类似的问题,但这个错误还有另一个与Kotlin语言相关的性质,Kotlin语言是在该应用程序上开发的。我也看到了一些问题,但答案对我没有帮助 这是一个很长的时间,但你解决了这个问题吗?
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)
}