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

Я пытаюсь выяснить, какое приложение на моем устройстве выполнило любой запрос на использование Интернета (называемый любым 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;
    }*

Рено Джонс

Ответ 1

Я смог понять это с помощью кода "StrongSwan".

Спасибо команде Strongswan.

Ответ 2

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

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

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

Вам нужно

  • root
  • скомпилируйте собственный бинарный iptables со всеми необходимыми расширениями
  • построить командную строку iptables в Java
  • запустить iptables

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

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

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

Ответ 3

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