Cisco Secure AccessとISRルータを繋げてみた

# はじめに

こちらはCisco Systems 合同会社 社員有志 による Advent Calendar です。
私は今回が初参加となります:christmas_tree:
ぜひ、他の投稿もご覧ください！

https://qiita.com/advent-calendar/2024/cisco

::: note info
免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。
:::

# Cisco Secure Accessとは？

Cisco Secure Accessは、Ciscoが提供するSSE(Security Service Edge)製品です。SSEとは、ゼロトラストアーキテクチャに基づき、ユーザーがどこからでも安全にリソースへアクセスできるようにするためのものです。このような製品が求められる背景には、リモートワークやクラウド利用の拡大に伴い、従来の境界型セキュリティでは保護が不十分となったことがあります。これにより、ネットワーク外部からのアクセスやデバイスごとの厳密な認証・ポリシー適用が不可欠となっています。
Cisco Secure Accessの概要については、[Cisco Secure Access クラウドセキュリティ SSE の概要](https://www.cisco.com/c/ja_jp/products/collateral/security/secure-access-cloud-security-sse-aag.html "Cisco Secure Access概要")も参考にしてみて下さい。

# 今回やったこと
Cisco Secure AccessとISR1100ルータをIPSec IKEv2トンネルで繋げてみました。
Cisco公式のドキュメントに沿って設定しましたが、途中苦戦したところがあったので、最終的に上手く行った設定例とトラブルシュートの内容をお伝えできればと思います！

# 前提条件
* 参照ドキュメント：[Cisco Secure Access Help Center](https://docs.sse.cisco.com/ "Help Center")
  * [ネットワーク トンネル グループの追加](https://docs.sse.cisco.com/sse-user-guide/docs/add-network-tunnel-group)
  * [Cisco ISRでのトンネルの設定](https://docs.sse.cisco.com/sse-user-guide/docs/configure-tunnels-cisco-isr)
* 接続機器：
  * C1161X-8P 
  * IOS XE Software, Version 17.09.03a
  * IPSecを利用するためコンフィグモードで「license boot level securityk9」を設定し再起動しておく。

# 接続構成
以下のような構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928205/81968afb-b41a-e03d-403f-0d3d0147b2b0.png)


# Secure Accessの設定
それでは、[Cisco Secure Access Help Center](https://docs.sse.cisco.com/ "Help Center")にあるCisco Secure Access Overviewの[OPEN HELP →](https://docs.sse.cisco.com/sse-user-guide/docs/welcome-cisco-secure-access "OPEN HELP")をクリックして始めましょう。

<img width="200" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928205/fc252fae-0af9-d117-16eb-e6b02dc188a1.png>

Tipsですが、右下のブルーのタブから言語選択が可能です。
最近はブラウザでの翻訳機能もありますが、こちらのドキュメントでは言語選択ができるので必要に応じて使ってみて下さい。（本投稿では日本語表記にした内容を記載します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928205/1872f7c9-01db-cfec-6f19-2276a3784e48.png)

まずは、Secure Access側の設定です。
左の項目から”ネットワーク トンネル グループの管理＞[ネットワーク トンネル グループの追加](https://docs.sse.cisco.com/sse-user-guide/docs/add-network-tunnel-group)”を選択します。
「手順」の項目に沿って順に進めます。
こちらの内容は手順通りで特に悩むところはありませんでしたが、2点ほど記載しておきます。

* 手順”5.トンネルグループのルーティングのタイプを選択します。”は、今回は「Static Routing」を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928205/08f233a2-3f83-b1a2-8841-ff781d8c3cc9.png)
* 手順”6.に トンネル設定のデータ ページで、ネットワークトンネル情報が完全であることを確認します。”で表示される、Tunnel ID、IP Adsress、Passphraseは後でルータの設定を利用します。（Tunnel IDとIP Addressは自動的にPrimaryとSecondaryの2つ生成されますが、今回はトンネルを1つだけ繋げるためPrimaryの方を利用しました。）今回の構成では以下のような設定です。
    * Tunnel ID: Tokyo-ISR@ 8241491-633406704-sse.cisco.com
    * IP Address: 150.200.250.1
    * Passphrase: PassPhrase123456

# ISRルータの設定
続いて、ルータ側の設定です。
今回はISRルータ(C1100シリーズ)との接続なので、左の項目から”ネットワークトンネルの設定＞[Cisco ISRでのトンネルの設定](https://docs.sse.cisco.com/sse-user-guide/docs/configure-tunnels-cisco-isr)”を選択します。
こちらはいくつか分かり辛い所があったので順に記載します。

* ”前提条件＞ネットワークアクセス”にある `<sse_dc_ip>`は、先ほどSecure Access側の設定で生成された「IP Address: 150.200.250.1」を使います。
* 手順”1.IKEv2プロポーザルを設定します。”についてです。”設定します”と書かれていますが、具体的な設定例は記載がありません。。以下のようにIKEv2プロポーザルを設定して上手く行きました。

```
crypto ikev2 proposal sse-proposal
 encryption aes-gcm-256
 prf sha256
 group 20
```
* 手順”2.IKEv2キーリングとIKEv2プロファイルを定義します。”についてです。（サンプル設定のままでも上手くかもしれませんが、）IKEv2プロファイルのlifetimeとdpdの値は[サポートされているIPsecパラメータ](https://docs.sse.cisco.com/sse-user-guide/docs/supported-ipsec-parameters)の値に合わせ以下の様に設定しました。

```
crypto ikev2 keyring sse-kr
 peer sse
  address 150.200.250.1
  pre-shared-key PassPhrase123456

crypto ikev2 profile sse-profile
 match identity remote address 150.200.250.1 255.255.255.255
 identity local email Tokyo-ISR@8241491-633406704-sse.cisco.com
 authentication remote pre-share
 authentication local pre-share
 keyring local sse-kr
 lifetime 14400
 dpd 30 5 periodic
```

以降は、ドキュメント通りで上手く行きました。
参考までに、各手順の設定例を記載します。

* 手順”3.IPSecのトランスフォームセット、プロファイル、ポリシーを定義します。”
```
crypto ipsec transform-set sse-ts esp-gcm 256
 mode tunnel

crypto ipsec profile sse
 set transform-set sse-ts
 set ikev2-profile sse-profile

crypto ikev2 policy sse
 match address local 202.120.240.2
 proposal sse-proposal
```

* 手順”4.トンネルインターフェイスを作成します。”
```
interface Tunnel1
 ip unnumbered GigabitEthernet0/0/0
 ip tcp adjust-mss 1350
 tunnel source GigabitEthernet0/0/0
 tunnel mode ipsec ipv4
 tunnel destination 150.200.250.1
 tunnel protection ipsec profile sse
```

* 手順”5.ルーティングルールを設定します。”
    * ”前提条件＞ネットワークアクセス”の項目に”トンネルに接続する前に、UDPポート500および4500を開きます。”の記載があるのでWANインタフェースには`For_Internet`のアクセスリストで対象のポートを開ける設定をしました。
```
ip access-list extended traffic-to-sse
 10 permit ip 192.168.33.0 0.0.0.255 any
 
ip access-list extended For_Internet
 10 permit udp any any eq isakmp
 20 permit udp any any eq non500-isakmp

route-map sse-route-map permit 10
 match ip address traffic-to-sse
 set interface Tunnel1

interface GigabitEthernet0/0/0
 ip address 202.120.240.2 255.255.255.192
 ip access-group For_Internet in
 negotiation auto
```

# トラブルシュート
上記では上手く行った設定例をご紹介していますが、実は初めは繋がりませんでした。トンネルステータスを確認すると `Session status: DOWN`でした。
```
C1161X-8P#show crypto session detail 
Crypto session current status

Code: C - IKE Configuration mode, D - Dead Peer Detection     
K - Keepalives, N - NAT-traversal, T - cTCP encapsulation     
X - IKE Extended Authentication, F - IKE Fragmentation
R - IKE Auto Reconnect, U - IKE Dynamic Route Update
S - SIP VPN

Interface: Tunnel1
Session status: DOWN
Peer: 150.200.250.1 port 500 fvrf: (none) ivrf: (none)
      Desc: (none)
      Phase1_id: (none)
  IPSEC FLOW: permit ip   0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0 
        Active SAs: 0, origin: crypto map
        Inbound:  #pkts dec'ed 0 drop 0 life (KB/Sec) 0/0
        Outbound: #pkts enc'ed 0 drop 0 life (KB/Sec) 0/0
```

結論からいうと、問題は以下の2点でした。
* **IKEv2プロポーザルのDH Gropの設定が間違っていた。**
  * `group 20`と設定する必要があるところに`group 19 20`と設定していたため、ISRはgroup 19で動作しSecure Access側がgroup 20で動作しているのと不一致が生じてセッション確立に失敗。
* **IKEv2プロファイルのTunnel IDの設定が間違っていた。**
    * `identity local email`の設定値に「Tokyo-ISR@ 8241491-633406704-sse.cisco.com」を設定するところ、途中Secure Access側でパラメータ変更などを設定した影響かIDが変わっていることに気づかず違うIDを入れていたため不一致が生じてセッション確立に失敗。

トラブルシュートでは主に下記コマンドを活用しました。ログを見てIPSecの確立ステータスのどこで失敗しているかを確認することで、修正ポイントを見つけることが出来ました。

*  `terminal monitor` : 
    * リアルタイムのログメッセージ（特にデバッグメッセージ）を端末（コンソール）に表示させるためのコマンドです
* `debug crypto ikev2` :
    * IKEv2プロトコルに関するデバック情報を表示するためのコマンド。


参考までに実際にどういうエラーが見えたかを記載しておきます。

**DH Groupが一致していないことが判明したログ。**
```
*Aug 23 05:04:59.249: IKEv2:(SESSION ID = 32,SA ID = 2):Processing IKE_SA_INIT message
*Aug 23 05:04:59.249: IKEv2:(SESSION ID = 32,SA ID = 2):Processing invalid ke notification, we sent group 19, peer prefers group 20
```
**Tunnel Groupの値が間違っていることに気づいたログ。**
数字の下一桁が正しくは「4」のところ「3」で設定していた。
```
*Aug 23 05:37:43.026: IKEv2:(SESSION ID = 32,SA ID = 2):Use preshared key for id Tokyo-ISR@8241491-633406703-sse.cisco.com, key len 16

*Aug 23 05:37:43.035: IKEv2:(SESSION ID = 32,SA ID = 2):Auth exchange failed
*Aug 23 05:37:43.035: IKEv2-ERROR:(SESSION ID = 32,SA ID = 2):: Auth exchange failed
```

上記２ヶ所を修正した結果、`Session status: UP-ACTIVE`となり、無事繋がりました！（「ISRルータの設定」で掲載している設定例は修正後の設定です。）

```
C1161X-8P#show crypto session detail 
Crypto session current status

Code: C - IKE Configuration mode, D - Dead Peer Detection     
K - Keepalives, N - NAT-traversal, T - cTCP encapsulation     
X - IKE Extended Authentication, F - IKE Fragmentation
R - IKE Auto Reconnect, U - IKE Dynamic Route Update
S - SIP VPN

Interface: Tunnel1
Profile: sse-profile
Uptime: 00:02:20
Session status: UP-ACTIVE     
Peer: 150.200.250.1 port 4500 fvrf: (none) ivrf: (none)
      Phase1_id: 150.200.250.1
      Desc: (none)
  Session ID: 32  
  IKEv2 SA: local 202.120.240.2/4500 remote 150.200.250.1/4500 Active 
          Capabilities:DN connid:2 lifetime:03:57:40
  IPSEC FLOW: permit ip   0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0 
        Active SAs: 2, origin: crypto map
        Inbound:  #pkts dec'ed 0 drop 0 life (KB/Sec) 4608000/3459
        Outbound: #pkts enc'ed 0 drop 0 life (KB/Sec) 4608000/3459
```

# まとめ
初めは上手く行きませんでしたが、デバックコマンドを活用してエラーログを確認することで原因解決ができ無事繋がりました！エラーログを見るというとても基本的な手段ですが、意外と使える方法なのでもしもの時は皆さんも試してみて下さい。