Обнаружение запроса приложения из службы VPN Service + Блокировка пакетов

Я пытаюсь выяснить, какое приложение на моем устройстве выполнило любой запрос на использование Интернета (называемый любым api и т. Д.). Для этого я создал класс, расширенный из класса «VpnService», чтобы убедиться, что мой трафик устройств проходит через меня, хотя Я фактически не подключался к VPN, а просто подделываю его и позволяю трафику проходить через меня до 0.0.0.0. Код ниже, он работает нормально, но я хочу выяснить, какое приложение инициировало запрос на использование Интернета или чей пакет входит в / из основного цикла while. Кроме того, есть ли способ, которым я могу остановить запросы из любого приложения – в любом случае [входящие и исходящие]?

*private Thread mThread; private ParcelFileDescriptor mInterface; //a. Configure a builder for the interface. Builder builder = new Builder(); // Services interface @Override public int onStartCommand(Intent intent, int flags, int startId) { this.getApplicationInfo(); // Start a new session by creating a new thread. mThread = new Thread(new Runnable() { @Override public void run() { try { //a. Configure the TUN and get the interface. mInterface = builder.setSession("MyVPNService") .setMtu(1500) .addAddress("192.168.1.66", 32) .addRoute("0.0.0.0", 0).establish(); //b. Packets to be sent are queued in this input stream. FileInputStream in = new FileInputStream( mInterface.getFileDescriptor()); //b. Packets received need to be written to this output stream. FileOutputStream out = new FileOutputStream( mInterface.getFileDescriptor()); //c. The UDP channel can be used to pass/get ip package to/from server DatagramChannel tunnel = DatagramChannel.open(); // Connect to the server, localhost is used for demonstration only. tunnel.connect(new InetSocketAddress("127.0.0.1", 8087)); //d. Protect this socket, so package send by it will not be feedback to the vpn service. protect(tunnel.socket()); // ByteBuffer packet = ByteBuffer.allocate(32767); //e. Use a loop to pass packets. while (true) { //---> Here in this loop the packets are coming in and out.. } } } catch (Exception e) { // Catch any exception e.printStackTrace(); } finally { try { if (mInterface != null) { mInterface.close(); mInterface = null; } } catch (Exception e) { } } } }, "MyVpnRunnable"); //start the service mThread.start(); return START_STICKY; }* 

Рено Джонс

Solutions Collecting From Web of "Обнаружение запроса приложения из службы VPN Service + Блокировка пакетов"

Боюсь, это невозможно сделать только с помощью VpnService. Вы не можете получить необходимую информацию с помощью обычных API-интерфейсов VpnService.

Однако это тривиально с iptables (и, конечно, укоренившимся телефоном …) следующим образом:

iptables -t mangle -A PREROUTING -m owner --uid-owner bad_app_uid -j DROP

Вам нужно будет

  1. Root телефон
  2. Скомпилируйте свой собственный бинарный iptables со всеми необходимыми расширениями
  3. Построить командную строку iptables в Java
  4. Запустить iptables

Я не имею понятия о блокировке входящего трафика для каждого приложения – но это не кажется очень необходимым.

Если вы хотите попробовать, https://github.com/shadowsocks/shadowsocks-android компилирует iptables, который, как я думаю, может просто запускаться для вас тоже. Кстати, я не имею никакого отношения к упомянутому приложению.

EDIT: Android 5.0 VpnService имеет несколько новых API, таких как addAllowedApplication и addDisallowedApplication , но «запретить» здесь означает, что указанное приложение просто обойдет VPN.

TrafficStats может рассказать вам в течение определенного времени, какое приложение имеет доступ к Интернету. Затем используйте iptables для блокировки доступа в Интернет для определенного приложения.