OpenConnect は VPN のみの宛先に到達できません

OpenConnect は VPN のみの宛先に到達できません

クライアントの企業ネットワークに接続するために、私はCisco AnyConnect Secure Mobility Clientを使用していますが、これは問題なく動作しますが、スプリットトンネリングを使用できないようです(アプリの統計タブによると、VPN自体にトンネルモード(IPv4):スプリットインクルードがあり、私の理解では使用できるはずです)。(はい、スプリットトンネリングが危険である理由は理解していますが、VPNのロックダウンは私の仕事の妨げになり、クライアントのIT部門は請負業者に例外を設けることに興味がありません。そして、私が言ったように、構成と思われる許す。)

スプリット トンネリングを機能させる方法を見つけようとして、代わりに OpenConnect をインストールしたところ、問題なく接続できました。資格情報が受け入れられ、ログに会社の「バナー」メッセージが表示され、正常に機能しています。ただし、VPN 経由でのみアクセスできる宛先はどれも機能しません。

問題はルートにあると思われます。AnyConnect と OpenConnect はどちらも、特定のネットワーク宛先 (同じもの) に複数のルートを追加しますが、ゲートウェイとインターフェイスの値は異なります。たとえば、

あらゆる接続

===========================================================================
Interface List
 14...00 05 9a 3c 7a 00 ......Cisco AnyConnect Secure Mobility Client Virtual Miniport Adapter for Windows x64
[...]
===========================================================================


IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.151     35
[...]
          a.b.c.x  255.255.255.255         On-link           a.b.c.d      2
          a.b.c.y  255.255.255.255         On-link           a.b.c.d      2
          a.b.c.z  255.255.255.255         On-link           a.b.c.d      2
[...]
      192.168.1.1  255.255.255.255         On-link     192.168.1.151     36
[...]
        224.0.0.0        240.0.0.0         On-link           a.b.c.d  10000
[...]
  255.255.255.255  255.255.255.255         On-link           a.b.c.d  10000

オープンコネクト

Interface List
[...]
 63...00 ff 8d 2a 8a 57 ......TAP-Windows Adapter V9
[...]
===========================================================================


IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.151     36
[...]
          a.b.c.x  255.255.255.255      a.b.c.(d+1)    192.168.1.151     36
          a.b.c.y  255.255.255.255      a.b.c.(d+1)    192.168.1.151     36
          a.b.c.z  255.255.255.255      a.b.c.(d+1)    192.168.1.151     36
[...]
        224.0.0.0        240.0.0.0         On-link           a.b.c.d    291
[...]
  255.255.255.255  255.255.255.255         On-link           a.b.c.d    291

ルートを除き0.0.0.0、これらのルートはすべて VPN に接続することで追加されます。 の場合0.0.0.0、OpenConnect はルートのメトリックを0.0.0.036 に変更します (AnyConnect テーブルに表示される値も、完全に切断されている場合と同じです)。 (記録によると、AnyConnect はいくつかの IPv6 ルートも削除しますが、OpenConnect はそれをそのまま残します。これは問題ではないと思います)。

追加内容を明確に対比すると、AnyConnect はゲートウェイに「オンリンク」を使用しますが、OpenConnect は AnyConnect がインターフェイスに使用するものとほぼ同じ IP アドレスを使用します。インターフェイスの場合、OpenConnect はプライベート IP アドレスを使用します。AnyConnect のインターフェイスと OpenConnect のゲートウェイに使用される IP アドレスは、クライアントが所有する範囲内にあります。

メトリックも異なります。AnyConnect は 2 を使用しますが、これは私の0.0.0.0ルートよりも優先度が高く (AnyConnect 経由で切断または接続されると 35 に設定されます)、OpenConnect は 36 を使用します。また、私の0.0.0.0ルートも 36 を使用するように変更されるため、優先度は同じになります (記録によると、私のシステム上の他のすべてのルートは 36 より高いメトリックを使用します)。

192.168.1.1AnyConnect は、からへのルートも追加します192.168.1.151。これは、OpenConnect がインターフェイスに使用するものです。これは、一方に存在し、もう一方に存在しない唯一のルートです。

どちらも224.0.0.0およびのルートを追加し255.255.255.255ますが、AnyConnect はメトリック 10000 (他のどのルートよりも高い) を使用するのに対し、OpenConnect は 291 (他の追加よりも高いが、接続前に存在していた他の既存のルートよりも低い) を使用します。興味深いことに、OpenConnect は他のすべてのルートに異なる値を使用しているにもかかわらず、これら 2 つのルートに対して AnyConnect と同じゲートウェイとインターフェイスを使用します。

これはWindows 10 Pro x64マシンです。Cisco AnyConnectはバージョン4.5.03040、OpenConnect GUIは「バージョン1.5.3(32 ビット) [...] OpenConnect v7.08 に基づいています。

ルーティングや VPN についてはあまり詳しくありません。これだけの情報にたどり着くだけでも、かなり検索して読みふけりました。この作業を始める前は、「スプリット トンネリング」という言葉さえ知りませんでした。また、出回っている情報の多くは古くなっています。Windows 10 では、AnyConnect でのスプリット トンネリングについて、ここや他の多くの回答で推奨されている「リモート ネットワークで既定のゲートウェイを使用する」オプションをオフにすることはできません。他に提供できる関連情報があるかどうかはわかりませんが、他に必要なことがあれば喜んで提供します。明らかに、クライアントの IP アドレスをマスクしようとしていますが、特定のアドレスはここではあまり重要ではないと思います (マスクする理由があるかどうかもわかりませんが、共有する情報ではないので、共有しません)。

答え1

KRyan の回答に基づいて、openconnect スクリプト (openconnect gui フォルダー内の vpnc-script.js) を次のように変更したところ、同様の状況で役立ちました。

for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
        var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
        var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
        var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
        exec("route add " + network + " mask " + netmask);
    } 

=>

for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) {
        var network = env("CISCO_SPLIT_INC_" + i + "_ADDR");
        var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK");
        var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN");
        exec("route add " + network + " mask " + netmask + " " + internal_gw+" metric 2 if "+env("TUNIDX"));
    } 

(175行目)

私の考えでは、バグは次の通りです:

// Calculate the first usable address in subnet
var internal_gw_array = new Array(
    address_array[0] & netmask_array[0],
    address_array[1] & netmask_array[1],
    address_array[2] & netmask_array[2],
    (address_array[3] & netmask_array[3]) + 1
);
var internal_gw = internal_gw_array.join(".");

によって渡された内部IPのネットマスク255.255.255.255ではvar netmask_array = env("INTERNAL_IP4_NETMASK").split(".");、このゲートウェイトリック(最終的にルートはインターフェースに向かうので、ゲートウェイIPはここでは無意味です)は失敗するようです。

答え2

ルートに問題があるというのは正しかったです。正しく解決するには多くの試行錯誤が必要でしたが、最終的には接続後にルートを手動で更新することでうまくいきました。

奇妙なことに、route CHANGE動作しませんでした。route ADD接続後にこれらのルートがすでに存在していたことが判明したにもかかわらず、 を使用する必要がありました。同じ宛先、マスク、ゲートウェイを使用していましたが、その後 をMETRIC 2 IF 17使用しました (「TAP-Windows アダプター V9」インターフェイスは 17 を使用していたため、再起動するたびに変更されると思われます。切断と再接続では、今のところ一貫して 17 が使用されているようですが、質問にあるように、当時は 63 を使用していました)。これを実行すると、route PRINTその宛先に対して に 2 つのエントリがリストされ (OpenConnect によって追加されたものと私が追加したもの)、接続できるようになりました。

しかし、私が絶対に奇妙だと思うのは、新しく追加したルートのメトリックが 37 であることです。これは、コマンドに入力した 2 ではなくroute ADD、既存のエントリの 36 よりも大きい値です。しかし、とにかく、動作します。

幸運なことに、私たちのプロジェクトではhostsファイル(開発者が作業を開始するときに自分のhostsファイルにコピーし、ビルドツールでチェックするためのファイル)が維持されているので、ルートを調整するバッチスクリプトを書くことができました。これを実行しようとしている他の人のために、私のバッチスクリプトは次のようになります。

FOR /F "tokens=1" %%i IN (\path\to\our\development\hosts) DO (
    route ADD %%i MASK 255.255.255.255 a.b.c.d METRIC 2 IF 17
)

ファイルhosts形式はシステム ファイルと同じです: a.b.c.d URL。このスクリプトはコメントをサポートしていません (ただし、 はroute ADD単に失敗すると思います)。また、空白行が問題になるかどうかもわかりません (ただし、おそらく が失敗するだけですroute ADD)。

17 は一定ではないと思われるので、おそらく調整する必要があるでしょう。その場合、それが何であるかを判断する方法を調べ、代わりに変数を使用します。(この回答も更新します。)

答え3

すでに機能する何かを見つけていないわけではありませんが、ルート メトリックの使用方法を誤解しているようです。これらは、非常に特殊な状況でのみ、決着をつけるためのものである。リンク先の回答を引用します:

ウィンドウでのルート選択には次のものが含まれます。

  • 目的地までの最も具体的なルートを見つける
  • 最も低いメトリックを持つ最も具体的なルートを選択します。

スクリプトの脆弱性を軽減したい場合は、プログラムでインターフェース番号を決定する

関連情報