クライアントの企業ネットワークに接続するために、私は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.0
36 に変更します (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.1
AnyConnect は、からへのルートも追加します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
すでに機能する何かを見つけていないわけではありませんが、ルート メトリックの使用方法を誤解しているようです。これらは、非常に特殊な状況でのみ、決着をつけるためのものである。リンク先の回答を引用します:
ウィンドウでのルート選択には次のものが含まれます。
- 目的地までの最も具体的なルートを見つける
- 最も低いメトリックを持つ最も具体的なルートを選択します。
スクリプトの脆弱性を軽減したい場合は、プログラムでインターフェース番号を決定する。