Python Cisco Anyconnect



I am trying to connect to CISCO Anyconnect VPN via python function. I have seen the ways given here: Connect CISCO Anyconnect VPN via bash But first I have a couple of problems, the first one being new to Python and second being reluctant to use any/very-few third-party modules/libraries other than. The problem with this is, by default, Python's Windows are synchronous. However, they can be converted to asynchronous operation by making a call to Windows. Personally, I would provide you a working Python 3.x script example (of the above), but my employer may consider it a proprietary work product. Cisco Systems, Inc. Cisco AnyConnect ISE Posture Module: Cisco Systems, Inc. Cisco AnyConnect Network Access Manager: Cisco Systems, Inc. Cisco AnyConnect Network Visibility Module: Cisco Systems, Inc. Cisco AnyConnect Posture Module: Cisco Systems, Inc. Cisco AnyConnect Secure Mobility Client: Cisco Systems, Inc. Cisco AnyConnect Start Before. Cisco anyconnect vpn client free download. Cisco VPN Client Fix A simple utility that aims to help you fix the connection problems when you want to use the Cisco VP.

Cisco ASA で AnyConnect クライアントを使った SSL-VPN の設定をメモしておきます。

構成/環境

以下の構成で検証しました。

Python Cisco Anyconnect

Cisco ASA 以下を使いました。

Cisco Anyconnect 4.8 Download Windows

ハードウェアCisco ASA 5506-X
ソフトウェア9.4(1)
Python

アドレス体系は以下としてあります。

Cisco Anyconnect Vpn Software Download

Code
WAN 側192.168.253.0/24
LAN 側192.168.1.0/24
SSL-VPN 接続時に払い出すアドレス192.168.99.1 〜 100/24

inspection の設定

必須ではありませんが、ICMP パケットを inspection 対象としておきます (inspection 対象にしないと戻りパケット用の ACL を明示的に書かなければならない為)。

NAT の設定

LAN → WAN の通信は送信元アドレスを outside 側インターフェイスで NAT します。

設定のポイント

設定のポイントを幾つか補足します。説明の都合上、若干コンフィグの順序を変えています (設定自体は変えていません)。

SSL-VPN 接続時に払い出すアドレスプール

SSL-VPN 接続時に払い出すアドレスプールを POOL_ANYCONNECT として定義します。また、このアドレス範囲を OBJ_POOL_ANYCONNECT として定義し、(通常の LAN → WAN 通信は NAT させるが)「LAN → SSL-VPN プール」向けの通信は NAT させないようにしています。

SSL-VPN の設定

事前に AnyConnect のイメージを ASA のストレージにコピーしておきます。ここでは outside 側で SSL-VPN (WebVPN) を有効化し、AnyConnect のイメージを指定しています。tunnel-group-listenable に設定すると SSL-VPN 接続時に利用するグループをリスト表示させ、選択出来るようになります。

スプリットトンネルの設定

次はグループポリシーを定義します。SSL-VPN 接続時でも VPN トンネルに流したくないネットワークを ACL で指定し、スプリットトンネルの設定を行っています。

Cisco Anyconnect Log In

split-tunnel-policy は以下 3 種類の指定が出来ます。

各々、以下の意味を持ちます。

オプションSSL-VPN トンネルに流すトラフィック
excludespecified指定した ACL以外のトラフィック
tunnelall全てのトラフィック
tunnelspecified指定した ACL のトラフィック

ユーザの定義

ここでは二人のユーザを定義しました。

Python
ユーザ名パスワード役割
ADMINPASSWORDASA の管理用ユーザ
USERPASSWORDAnyConnect 接続用

USER は属性 (attributes) を service-type remote-access とし、「VPN 用のユーザである」旨を宣言します。

トンネルグループの設定

Login

先程定義した SSL-VPN 接続時に払い出すアドレスプールを指定します。また、group-alias を定義しておくと、AnyConnect クライアントから SSL-VPN 接続を開始する際にリスト表示させるグループ名 (の、別名 = 表示名) を定義することが出来ます。

接続テスト

AnyConnect クライアントから ASA の outside 側アドレス (今回は 192.168.253.100) を指定して接続を開始します。ASA へ公的な証明書をインストールしたり、ASA 自体を自己証明局にすることも出来ます。しかしデフォルトの状態でも ASA は自己証明書を持っており、明示的に証明書を指定しない場合はこの自己証明書が利用されます。今回はこの自己証明書を利用している為、SSL-VPN 接続時に警告が表示されました。Connect Anyway をクリックして続行します。

グループ名 (の、別名 = Alias) はデフォルトで表示されているはずです。後はユーザ名とパスワードを入力し、OK を押して SSL-VPN 接続を確立します。

SSL-VPN が正常に確立していれば PC-A → PC-B で通信出来るようになっているはずです。PC-A から PC-B へ Ping し、疎通出来ていることを確認します。

同セグメント宛の通信を許可する

SSL-VPN 接続が確立した際、デフォルトの状態では「クライアントの同セグメントにはアクセス出来ない」状態になってしまうようです。ですので、例えば「自宅から学校のネットワークに AnyConnect で SSL-VPN した際、自宅の (同セグメントにある) プリンタにアクセス出来ない」といった問題が起きてしまいます。これは AnyConnect クライアントの設定画面にある「Allow local (LAN) access when using VPN (if configured)」をチェックし、SSL-VPN を再接続することで回避出来ます (デフォルトではチェックが入っていない為、同セグメントにアクセス出来なくなっています)。


証明書について

上述の々になりますが、SSL-VPN 接続時に利用する証明書は以下、いずれを利用することも出来ます。

  1. 外部の CA 局で発行した証明書を利用する
  2. ASA 自身を CA 局 (自己証明局) にして発行した証明書を利用する
  3. ASA がデフォルトで持っている自己証明書を利用する

SSL-VPN 設定の際、明示的にサーバ証明書を指定しなかった場合は「ASA がデフォルトで持っている自己証明書」が使われます (ので、警告は出るものの、SSL-VPN 接続は出来ます)。

クライアントの同セグをスプリットトンネルの ACL に含めるとマズイ??

今回は WAN を 192.168.253.0/24、LAN を 192.168.1.0/24 としています。

ですので、スプリットトンネル用の ACL は以下の通り、LAN のアドレス「192.168.1.0/24」を設定しました。

しかし、仮にこれを以下のように「WAN も含めた 192.168.0.0/16」と書くとどうなるか、実験してみます。

この場合、以下のような結果になります。

フロー結果
PC-A から PC-B への PingOK
PC-A から同セグメントの PC への PingNG

AnyConnect でスプリットトンネルを行うと、SSL-VPN クライアントのルーティングテーブルへ「スプリットトンネルとして定義されている経路」がインストールされるます。しかし、その際に (今回実験したように)「同セグがスプリットトンネルの ACL に含まれている」と同セグ宛の通信が SSL-VPN トンネルに向いてしまい、結果として '同セグへ通信出来ない' という事象になるようです。これを仕様として記載しているドキュメントを見つけたわけでは無いのですが、実際にスプリットトンネル用の ACL を書く際は「集約した際に思いがけず、SSL-VPN クライアント側のネットワークを含めてしまう」ことが無いように気をつけた方が良いのかも知れません… (正しいお作法があれば是非、知りたいです、、、)

トラブルシューティング

設定したのに上手く通信出来ない… 場合は debugshow コマンドでトラブルシューティング出来ます。また、「SSL-VPN 接続自体は確立しているのに、通信が出来ない (パケットがどこかでドロップしている)」場合は packet-tracer で送信元/宛先を指定し、'そのフローがどこでドロップしているのか?' をトラブルシューティング出来ます。以下は packet-tracer のコマンド例です。ICMP のメッセージタイプは適当に指定しています。