23

AndroidデバイスでVPN接続をプログラムで設定する作業を行っています。OS 2.3.5 以前を使用しているデバイスでは、これを正常に行うことができました (非表示のクラスに到達するためにリフレクションを使用しました)。しかし、Android 4.0 では、古いクラスを取り除き、代わりに VPNService クラスを使用しています。

開始するのに最適な場所は、提供されている Android の ToyVPN の例を使用することだと考えましたが、多くの課題に直面しています。サンプル コードでは、サーバー アドレスを送信するだけで済みます。

InetSocketAddress server = new InetSocketAddress(mServerAddress, Integer.parseInt(mServerPort));

次に、チャネルを開いて VPN トンネルを作成します。

tunnel = DatagramChannel.open();

しかし、私の場合、サーバーアドレス、ユーザー名、およびパスワードを送信する必要があります。これまでのところ、私はそうする方法を理解していません。私の最善の推測は、次のようなことをすることでした:

Authenticator.setDefault(new Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user","pass".toCharArray());
        }});

    try {
        // Create a DatagramChannel as the VPN tunnel.

        tunnel = DatagramChannel.open();

しかし、これはうまくいきませんでした。だから私が求めているのは:

  1. ToyVpn で使用されている方法以外に、VPN 接続をプログラムで作成する方法はありますか?
  2. そうでない場合、サーバーへの接続を確立するときに資格情報を送信するにはどうすればよいですか?

編集

VPN の種類 (PPTP、L2TP、L2TP/IPSec PSK または L2TP/IPSec CRT) を指定する必要があることを忘れていました。

4

2 に答える 2

3

プログラムで VPN 接続を設定する方法があります。OpenVPN for Android (ics-openvpn)プロジェクトのソースを確認することをお勧めします。アプリが直接接続する必要がない場合は、インテントを使用して ics-openvpn から接続をトリガーすることもできます。OpenVPN は幅広い設定を提供しますが、サーバーと互換性があるかどうかを確認する必要があります.

Android 4.0 (ICS) で導入された VpnService クラスは、ネットワーク インターフェイス (tun モードのみ)、一部のルート、および DNS サーバーの作成など、一部の設定しか実行できません。アプリがルート権限なしで接続できるようにするためには、引き続き必要です。VpnService の使用方法の詳細については、こちらを確認してください。

私が ics-openvpn のコードを調査した限り、アプリはアプリの APK で実行可能な OpenVPN バイナリを統合しています。アプリはこのバイナリを実行し、ローカル ソケットを介してコマンドを送受信します。バイナリはほとんどすべてを処理します。入力を解析して、呼び出す VpnService.Builder のメソッドと、ソケットを介して送り返す情報を確認するだけです (これには、確認、構成ファイル、資格情報、バイト数が含まれます)。など)

于 2015-02-25T18:16:57.093 に答える