Android подключение к VPN-серверу (IPSe c) с PSK и User / Pass - PullRequest
1 голос
/ 15 апреля 2020

Я хочу подключиться к IPSe c VPN-серверу с PSK и User / Pass, но я также хочу, чтобы он мог работать на более низких Android тоже (версия SDK> = 20)

Я знаю, что Google добавил Ikev2VpnProfile и VPNManager в Android R, но я хочу такую ​​же функциональность в более низких Android, как и другие приложения в Play Store, делают

I Я использую VpnService.Builder для подключения к серверу он тоже работает это, но я не знаю, как я могу настроить конфиги для добавления VpnType, PSK (предварительный общий ключ) и User / Pass

Java Или Kotlin может ответить на любой вопрос

public class VPNService extends VpnService {

    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) {
        // 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("ROYALVPNSession")
                            .addAddress("192.168.0.1", 0)
                            .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());
                    //e. Use a loop to pass packets.
                    while (true) {
                        //get packet with in
                        //put packet to tunnel
                        //get packet form tunnel
                        //return packet with out
                        //sleep is a must
                        Thread.sleep(100);
                    }

                } 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;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        if (mThread != null) {
            mThread.interrupt();
        }
        super.onDestroy();
    }

}
...