如何在android中通过我的vpn服务应用程序记录/检查网络流量



我读过https://developer.android.com/guide/topics/connectivity/vpn但我有几个问题:

  1. 我是否根据下面粘贴的代码创建了一个vpn客户端,如果是,vpn服务器在哪里
  2. 我的vpn服务正在运行(正如我在模拟器的设置中看到的那样(,我如何知道网络流量是否流经我的vpn业务
  3. 如何记录网络流量的详细信息?(网络请求的目的地地址等(

这是代码:-

public class vpnService extends VpnService {
public vpnService() {
}
private Thread mThread;
private ParcelFileDescriptor mInterface;
Builder builder=new Builder();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mThread=new Thread(new Runnable(){
@Override
public void run() {
try{
mInterface=builder.setSession("vpnService")
.addAddress("192.168.0.1",24)
.addDnsServer("8.8.8.8")
.addRoute("0.0.0.0",0).establish();
FileInputStream in=new FileInputStream(mInterface.getFileDescriptor());
FileOutputStream out=new FileOutputStream(mInterface.getFileDescriptor());
DatagramChannel tunnel=DatagramChannel.open();
tunnel.connect(new InetSocketAddress("127.0.0.1",8087));
protect(tunnel.socket());
while(true){
Thread.sleep(100);
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(mInterface!=null){
mInterface.close();
mInterface=null;
}
}
catch(Exception e){
}
}
}
},"vpnRunnable");
mThread.start();
return START_STICKY;
}
@Override
public void onDestroy() {
if(mThread!=null){
mThread.interrupt();
}
super.onDestroy();
}

}

我是否根据下面粘贴的代码创建了一个vpn客户端,如果是,vpn服务器在哪里?

不,您只是指示Android将设备的网络数据包发送到您的VpnService

我如何知道网络流量是否流经我的vpn服务

您当前没有发送任何数据。要发送数据,您需要从in FileOutputStream读取IPv4数据包,并将其写入隧道通道

如何记录网络流量的详细信息

in FileOutputStream读取数据包后,可以使用pcap4j库解析数据包,然后将其记录到logcat控制台。例如:

IpV4Packet pkt = IpV4Packet.newPacket(buf, 0, len);
Log.d("PKT", (String.format("[%s] %s -> %s [%d B]n",
hdr.getProtocol(),
hdr.getSrcAddr().getHostAddress(), hdr.getDstAddr().getHostAddress(),
pkt.length())))

你可以在这里找到一个VPNService的例子

最新更新