VPNService protect не работает

Пытаюсь создать VpnClient на Android. Создал сервис:

public class VPNService extends VpnService {
private ParcelFileDescriptor pfd;
Thread clientReaderThread, serverReaderThread;
private boolean stop;

private ServiceBinder binder;

private Socket vpnSocket;

@Override
public void onCreate() {
    super.onCreate();
    
    binder = new ServiceBinder();
}

@Override
public int onStartCommand(Intent arg0, int arg1, int arg2) {
    VpnService.Builder vpnBuilder = new VpnService.Builder();
    vpnBuilder.addAddress("192.168.35.1", 24); 
    vpnBuilder.addRoute("0.0.0.0", 0); 
    try {
        pfd = vpnBuilder.establish();
    } catch (Exception e) {
        Log.e("MyVPN", e.toString());
    }
    new Thread(() -> {
        try {
        vpnSocket = new Socket();
        vpnSocket.bind(new InetSocketAddress(0));
        boolean bol = protect(vpnSocket);
        vpnSocket.connect(new InetSocketAddress("178.68.14.91", 4410));
        } catch (IOException e) {
        Log.e("MyVPN", e.toString() + " ");
        }
    }).start();
    ClientReader clientReader = new ClientReader(new FileInputStream(pfd.getFileDescriptor()));
    ServerReader serverReader = new ServerReader(new FileOutputStream(pfd.getFileDescriptor()));
    clientReaderThread = new Thread(clientReader);
    serverReaderThread = new Thread(serverReader);
    clientReaderThread.start();
    //serverReaderThread.start();
    
    return START_NOT_STICKY;
}

public void stop() {
    if (pfd != null) {
        try {
            pfd.close();
        } catch (IOException e) {
        }
    }
    stop = true;
    stopSelf();
}

@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public void onDestroy() {
    stop();
    super.onDestroy();
}

private class ClientReader implements Runnable {
    FileInputStream in;
    public ClientReader(FileInputStream in) {
        this.in = in;
    }
    @Override
    public void run() {
        byte[] buffer = new byte[4096];
        int read;
        OutputStream outStream;
        try {
            outStream = vpnSocket.getOutputStream();
        } catch (Exception e) {
            Log.i("MyVPN", e.toString());
            return;
        }
        
        while (!stop) {
            try {
                read = in.read(buffer);
                outStream.write(buffer, 0, read);
            } catch (IOException e) {
                //Log.i("MyVPN", e.toString());
            }
        }
    }
}

private class ServerReader implements Runnable {
    FileOutputStream out;
    public ServerReader(FileOutputStream out) {
        this.out = out;
    }
    @Override
    public void run() {
        while (!stop) {
            
        }
    }
}

protected class ServiceBinder extends Binder {
    protected VPNService getService() {
        return VPNService.this;
    }
}

При этом после включения VPN до IP 178.68.14.91 по сокету vpnSocket ничего не приходит. Нет даже соединения, то есть не срабатывает даже accept на ServerSocket. Хотя protect возвращает true. А если VPN убрать, то по этому сокету всё отлично доходит до получателя.


Ответы (1 шт):

Автор решения: Сергей Евтухов

Причина оказалась предельно простой и вообще не связанной с программой. Работал Adguard и каким-то образом мешал передаче трафика. Выключение или исключение из фильтрации моей программы моментально решило проблему. Тем не менее, в процессе поисков, наткнулся в иностранном сообществе на рекомендацию использовать ConnectivityManager bindProcessToNetwork (или для android < 6 метод - setProcessDefaultNetwork, того же класса) для привязки процесса к определенной сети. Так что если у кого-то, по какой-то причине, VpnService protect не будет работать можно попробовать такой подход.

→ Ссылка