Cisco ASA で AnyConnect (SSL-VPN) を設定する
Cisco ASA で AnyConnect クライアントを使った SSL-VPN の設定をメモしておきます。
構成/環境¶
以下の構成で検証しました。
Cisco ASA 以下を使いました。
項目 | 値 |
---|---|
ハードウェア | Cisco ASA 5506-X |
ソフトウェア | 9.4(1) |
アドレス体系は以下としてあります。
項目 | 値 |
---|---|
WAN 側 | 192.168.253.0/24 |
LAN 側 | 192.168.1.0/24 |
SSL-VPN 接続時に払い出すアドレス | 192.168.99.1 〜 100/24 |
基本的な設定¶
ホスト名やアドレス、ルーティング等の基本設定を済ませておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
inspection の設定¶
必須ではありませんが、ICMP パケットを inspection 対象としておきます (inspection 対象にしないと戻りパケット用の ACL を明示的に書かなければならない為)。
1 2 3 4 5 |
|
NAT の設定¶
LAN → WAN の通信は送信元アドレスを outside 側インターフェイスで NAT します。
1 2 3 4 5 |
|
AnyConnect の設定¶
ここからが肝心の AnyConnect (SSL-VPN) 設定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
設定のポイント¶
設定のポイントを幾つか補足します。説明の都合上、若干コンフィグの順序を変えています (設定自体は変えていません)。
SSL-VPN 接続時に払い出すアドレスプール¶
SSL-VPN 接続時に払い出すアドレスプールを POOL_ANYCONNECT として定義します。また、このアドレス範囲を OBJ_POOL_ANYCONNECT として定義し、(通常の LAN → WAN 通信は NAT させるが)「LAN → SSL-VPN プール」向けの通信は NAT させないようにしています。
1 2 3 4 5 6 7 |
|
SSL-VPN の設定¶
事前に AnyConnect のイメージを ASA のストレージにコピーしておきます。ここでは outside 側で SSL-VPN (WebVPN) を有効化し、AnyConnect のイメージを指定しています。tunnel-group-list を enable に設定すると SSL-VPN 接続時に利用するグループをリスト表示させ、選択出来るようになります。
1 2 3 4 5 6 7 8 |
|
スプリットトンネルの設定¶
次はグループポリシーを定義します。SSL-VPN 接続時でも VPN トンネルに流したくないネットワークを ACL で指定し、スプリットトンネルの設定を行っています。
1 2 3 4 5 6 7 |
|
split-tunnel-policy は以下 3 種類の指定が出来ます。
1 2 3 4 5 6 7 |
|
各々、以下の意味を持ちます。
オプション | SSL-VPN トンネルに流すトラフィック |
---|---|
excludespecified | 指定した ACL 以外のトラフィック |
tunnelall | 全てのトラフィック |
tunnelspecified | 指定した ACL のトラフィック |
ユーザの定義¶
ここでは二人のユーザを定義しました。
ユーザ名 | パスワード | 役割 |
---|---|---|
ADMIN | PASSWORD | ASA の管理用ユーザ |
USER | PASSWORD | AnyConnect 接続用 |
USER は属性 (attributes) を service-type remote-access とし、「VPN 用のユーザである」旨を宣言します。
1 2 3 4 5 |
|
トンネルグループの設定¶
先程定義した SSL-VPN 接続時に払い出すアドレスプールを指定します。また、group-alias を定義しておくと、AnyConnect クライアントから SSL-VPN 接続を開始する際にリスト表示させるグループ名 (の、別名 = 表示名) を定義することが出来ます。
1 2 3 4 5 6 7 8 |
|
接続テスト¶
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 し、疎通出来ていることを確認します。
1 2 3 4 5 6 7 8 9 |
|
同セグメント宛の通信を許可する¶
SSL-VPN 接続が確立した際、デフォルトの状態では「クライアントの同セグメントにはアクセス出来ない」状態になってしまうようです。ですので、例えば「自宅から学校のネットワークに AnyConnect で SSL-VPN した際、自宅の (同セグメントにある) プリンタにアクセス出来ない」といった問題が起きてしまいます。これは AnyConnect クライアントの設定画面にある「Allow local (LAN) access when using VPN (if configured)」をチェックし、SSL-VPN を再接続することで回避出来ます (デフォルトではチェックが入っていない為、同セグメントにアクセス出来なくなっています)。
証明書について¶
上述の々になりますが、SSL-VPN 接続時に利用する証明書は以下、いずれを利用することも出来ます。
- 外部の CA 局で発行した証明書を利用する
- ASA 自身を CA 局 (自己証明局) にして発行した証明書を利用する
- 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」を設定しました。
1 |
|
しかし、仮にこれを以下のように「WAN も含めた 192.168.0.0/16」と書くとどうなるか、実験してみます。
1 |
|
この場合、以下のような結果になります。
フロー | 結果 |
---|---|
PC-A から PC-B への Ping | OK |
PC-A から同セグメントの PC への Ping | NG |
AnyConnect でスプリットトンネルを行うと、SSL-VPN クライアントのルーティングテーブルへ「スプリットトンネルとして定義されている経路」がインストールされるます。しかし、その際に (今回実験したように)「同セグがスプリットトンネルの ACL に含まれている」と同セグ宛の通信が SSL-VPN トンネルに向いてしまい、結果として "同セグへ通信出来ない" という事象になるようです。これを仕様として記載しているドキュメントを見つけたわけでは無いのですが、実際にスプリットトンネル用の ACL を書く際は「集約した際に思いがけず、SSL-VPN クライアント側のネットワークを含めてしまう」ことが無いように気をつけた方が良いのかも知れません… (正しいお作法があれば是非、知りたいです、、、)
トラブルシューティング¶
設定したのに上手く通信出来ない… 場合は debug や show コマンドでトラブルシューティング出来ます。また、「SSL-VPN 接続自体は確立しているのに、通信が出来ない (パケットがどこかでドロップしている)」場合は packet-tracer で送信元/宛先を指定し、"そのフローがどこでドロップしているのか?" をトラブルシューティング出来ます。以下は packet-tracer のコマンド例です。ICMP のメッセージタイプは適当に指定しています。
1 |
|