Как создать обходной туннель для защиты от VPN-сервиса - PullRequest
0 голосов
/ 28 июня 2019

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

Я перепробовал много адресов и портов, но получаю исключение недоступности порта.

private Thread mThread;
    public static ParcelFileDescriptor mInterface;
    Builder builder;
    public static boolean isRunning = false;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Start a new session by creating a new thread.
        isRunning = true;
        mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // Configure
                    builder = new Builder();
                    mInterface = builder.setSession("MyVPNService")
                            .addAddress("10.0.0.1", 32)
                            .addRoute("0.0.0.0", 0)
                            .establish(); //Connection established
                    System.out.println("Started vpn");
                    System.out.println(Inet4Address.getLocalHost().getHostAddress());

                    //Incoming packets
                    FileInputStream in = new FileInputStream(
                            mInterface.getFileDescriptor());

                    //Outgoing Packets
                    FileOutputStream out = new FileOutputStream(
                            mInterface.getFileDescriptor());

                    System.out.println(mInterface.getFileDescriptor().hashCode());

                    DatagramChannel tunnel = DatagramChannel.open();
                    DatagramSocket newSocket = new DatagramSocket();
                    tunnel.connect(new InetSocketAddress(80));
                    protect(newSocket);

                    while (isRunning) {

                        //Incoming packets
                        ByteBuffer buffer = ByteBuffer.allocate(Short.MAX_VALUE);
                        byte[] packet = buffer.array();

                        int length = in.read(packet);
                        if (length > 0){

                            IpV4Packet ıpV4Packet = IpV4Packet.newPacket(packet, 0, packet.length);

                            if (ıpV4Packet.getHeader() != null){
                                //Caught a packet
                                System.out.printf("New Packet IPv4: Protocol: %s \t From: %s \t To: %s",
                                        ıpV4Packet.getHeader().getProtocol().toString(),
                                        ıpV4Packet.getHeader().getSrcAddr().toString(),
                                        ıpV4Packet.getHeader().getDstAddr().toString());
                            }else{
                                IpV6Packet ipV6packet = IpV6Packet.newPacket(packet, 0, packet.length);
                                if (ipV6packet.getHeader() != null){
                                    System.out.printf("New Packet IPv6: Protocol: %s \t From: %s \t To: %s",
                                            ipV6packet.getHeader().getProtocol().toString(),
                                            ipV6packet.getHeader().getSrcAddr().toString(),
                                            ipV6packet.getHeader().getDstAddr().toString());
                                }

                            }

                            buffer.limit(length);
                            newSocket.send(new DatagramPacket(packet,packet.length)); //Problem is here
                            buffer.clear();

                        }
                        System.out.println();
                        Thread.sleep(100);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    isRunning = false;

                } finally {
                    try {
                        if (mInterface != null) {
                            mInterface.close();
                            mInterface = null;
                        }
                    } catch (Exception e) {

                    }
                }
            }

        }, "MyVpnRunnable");

        //start the service
        mThread.start();
        return START_STICKY;
    }

Как я могу отправить обнаруженные пакетык месту назначения?

...