Ciscoルーターのリモートアクセス設定


# Ciscoルーターのリモートアクセス設定
苦闘してリモートアクセス設定を実施した記録である。結果として妥協。

## トポロジー
リモートアクセス設定を行うルーターはCisco C841M。身の回りにあった機器を下記図のように構成した。
![トポロジー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/698f614c-8e41-7635-b49e-2a316a6d8d7f.png)
C841MのWAN側に別のルーターYが存在し、C841MとPC-AとがルーターYからDHCPによりIPアドレスを取得（172.16.0.xxx/24）。C841MのVLAN10にPC-Bが存在している（C841MのDHCPによりIPアドレスを取得）。また、C841MにはNATあり。PC-AがC841MにアクセスしてPC-Bと疎通ができるような設定を行う（リモートアクセス（VPN）の結果として、PC-Aには「10.2.2.208」のIPアドレスがアサイン）。PCにはWindows10を用いた。

## トライ（失敗）
失敗の記録である。最初に記載するが、私が用いた環境依存により、失敗している可能性はあることに注意。

### まずはオーソドックス
C841Mやリモートアクセスをキーワードに検索。
- [リモート アクセス IPsec VPN を設定する](https://community.cisco.com/t5/cisco-start-ドキュメント/リモート-アクセス-ipsec-vpn-を設定する/ta-p/3292247)
- [リモートアクセスVPNに接続できるが、社内の機器と通信できない](https://community.cisco.com/t5/ルータ-cisco-841mj/リモートアクセスvpnに接続できるが-社内の機器と通信できない/td-p/3045190)
これらをトライしたがNG。

### ClientにLinux(lubuntu)を利用（NATトラバーサル）
Linuxで、NATトラバーサル（UDPポート4500）を有効にすると、C841Mまでのアクセスは成功した。調べると、Windows10でNATトラバーサルを利用するには、レジストリAssumeUDPEncapsulationContextOnSendRuleの数値を「2」にする必要があるらしいことがわかった。次のような記事が見つかる。
- [Windows10でVPN（L2TP/IPsec）が接続できない場合の確認項目](https://uluma-coma.net/blog/2021/02/27/windows10でvpn（l2tp-ipsec）が接続できない場合の確認項目/ )
- [L2TP / IPsec VPN Does won’t Connect in Windows 10 Fix](https://thegeekpage.com/l2tp-ipsec-vpn-does-wont-connect/)
- [L2TP VPNに繋がらない 809エラーの場合の対処法](https://mebee.info/2020/02/21/post-6060/)

しかし、これでも接続できず。さらに、XBox系のサービスを停止する、Firewallの設定を見直す、、などの記事も見つかるが、いずれもNG。PatchをUninstallするなどの下記記事も見つかるが、これもだめだった。

- [Client VPN Error After January Windows Updates](https://community.meraki.com/t5/Security-SD-WAN/Client-VPN-Error-After-January-Windows-Updates/m-p/137113)

また、Linuxでは、C841MまでのアクセスはOKだが、PC-Bまでの疎通はできず。

### その他の検索
他にも、いくつか見つかり（下記）、トライしたがダメだった。
- [Cisco 841M で L2TP アクセスを許可する。(途中経過メモ)](https://dynamic-one.com/archives/51690717.html)
- [CISCO 841M 設定：その９：VPNの設定](https://tm-b.hatenablog.com/entry/2017/08/13/011251)
- [Cisco 841M/JルータでCisco VPN Client（IPSec）のホスト設定をする](https://bisonicr.ldblog.jp/archives/55429225.html)
- [IOS VPN（ルータ）： 既存の L2L VPN への新しい L2L のトンネルまたはリモート アクセスの追加](https://www.cisco.com/c/ja_jp/support/docs/routers/3800-series-integrated-services-routers/107553-iosrouter-l2ltunnel.html)
- [L2TP over IPsec on Cisco IOS Router Using Windows 8](https://community.cisco.com/t5/security-documents/l2tp-over-ipsec-on-cisco-ios-router-using-windows-8/ta-p/3142831)

### FortiClient VPN
VPNで有名どころのFortigateのソフトウェアである、FortiClient VPNでも試したがNG。

## Shrew Soft VPN Client（成功）
VPNクライアントソフトを探していたところ
- [Shrew Soft VPN Clientを使用したリモートアクセスVPN](https://community.cisco.com/t5/セキュリティ-ドキュメント/shrew-soft-vpn-clientを使用したリモートアクセスvpn/ta-p/3137928)

という記事にあった、[Shrew Soft VPN Client](https://www.shrew.net/home)を利用して、リモートアクセスもPC-AからPC-Bへの疎通もOKとなった。本ソフトウェアは、Cisco VPN Clientの代替となっているらしい。

### C841MのConfiguration
上述の[記事](https://community.cisco.com/t5/セキュリティ-ドキュメント/shrew-soft-vpn-clientを使用したリモートアクセスvpn/ta-p/3137928)にそって設定を行う。ただし、記事内容の一部に不適切と思えるところがあり、適宜修正している。（さらに、用いたトポロジーに合わせて修正あり。）

関連するところのみ記載する。「//」以降が補足コメントである。

```
#show running-config 

aaa new-model
!
aaa authentication login AUTH local  // ログイン認証にローカルデータベースを利用し名称を「AUTH」とする
aaa authorization network NET local  // ネットワークサービス認可にローカルデータベースを利用し名称を「NET」とする
!
aaa session-id common
!
ip dhcp excluded-address 10.10.10.1
ip dhcp excluded-address 10.2.2.1                // LAN側のDHCPの除外IPアドレス
ip dhcp excluded-address 10.2.2.201 10.2.2.210
!
ip dhcp pool pool10  // 10.10.10.0/25のDHCPプール（管理用ネットワーク）
 import all
 network 10.10.10.0 255.255.255.128
 default-router 10.10.10.1 
 dns-server 10.10.10.1 
 lease 0 2
!
ip dhcp pool pool2  // 10.2.2.0/24のDHCPプール（今回使用するネットワーク）
 import all
 network 10.2.2.0 255.255.255.0
 default-router 10.2.2.1 
 dns-server 10.2.2.1 
 lease 0 2
!
object-group network local_lan_subnets  // LAN側ネットワークの定義 
 10.10.10.0 255.255.255.128
 10.2.2.0 255.255.255.0
!
username admin privilege 15 secret 5 Himitsu
username user1 privilege 15 password 7 Himitsu // VPNアクセス用アカウント
!
crypto isakmp policy 1     // ISAKMPポリシー定義
 encr aes                  // AES
 authentication pre-share  // 事前共有鍵方式
 group 2                   // DHグループ2
 lifetime 3600
crypto isakmp keepalive 10
!
crypto isakmp client configuration group RA  // ISAKMPグループポリシー定義
 key password                                // 事前共有鍵（password）
 domain test.com                             // ドメイン名
 pool Test1                                  // IPアドレスプール
 acl split                                   // スプリットトンネリング有効化（アクセスリスト名「split」)
 save-password
 netmask 255.255.255.0
crypto isakmp profile ISAKMP-PROFILE     // ISAKMPプロファイル定義
   match identity group RA               // ポリシーグループ名
   client authentication list AUTH       // AAA認証とのリンク（名称「AUTH」）
   isakmp authorization list NET         // AAA認可とのリンク（名称「NET」）
   client configuration address respond  // リモートからのアドレスリクエストに応答
   client configuration group RA         // 必要か不明、、、
   virtual-template 1                    // 仮想I/F
!
crypto ipsec transform-set TS-IPSEC esp-aes esp-sha-hmac  // IPSECトランスフォームセット定義
 mode tunnel
!
crypto ipsec profile IPSEC-PROFILE  // IPSECプロファイル
 set transform-set TS-IPSEC         // IPSECトランスフォームセット
 set isakmp-profile ISAKMP-PROFILE  // ISAKMPプロファイル
!
interface GigabitEthernet0/0  // VLAN10
 switchport access vlan 10
 no ip address
!
interface GigabitEthernet0/1  // VLAN10
 switchport access vlan 10
 no ip address
!
interface GigabitEthernet0/2  // 指定なし（VLAN1）
 no ip address
!
interface GigabitEthernet0/3  // 指定なし（VLAN1）
 no ip address
!
interface GigabitEthernet0/4  // WAN
 description PrimaryWANDesc_
 ip address dhcp              // DHCPによりIPアドレス取得
 ip nat outside               // NAT外側
 ip virtual-reassembly in
 duplex auto
 speed auto
!
interface GigabitEthernet0/5
 no ip address
 shutdown
 duplex auto
 speed auto
!
interface Virtual-Template1 type tunnel         // 仮想トンネルI/F
 ip unnumbered GigabitEthernet0/4               // 物理I/Fとのリンク
 tunnel source GigabitEthernet0/4               // ソースI/F
 tunnel mode ipsec ipv4                         // IPv4 IPSEC
 tunnel protection ipsec profile IPSEC-PROFILE  // IPSECプロファイルとのリンク
!
interface Vlan1   // 管理用LAN
 description $ETH_LAN$
 ip address 10.10.10.1 255.255.255.128
 ip nat inside    // NAT内側
 ip virtual-reassembly in
!
interface Vlan10  // 今回のアクセス対象となるLAN
 ip address 10.2.2.1 255.255.255.0
 ip nat inside    // NAT内側
 ip virtual-reassembly in
!
ip local pool Test1 10.2.2.201 10.2.2.210  // リモートアクセス時に割り当てられるIPアドレスプール
ip forward-protocol nd
ip http server
ip http access-class 23
no ip http secure-server
!
ip nat inside source list nat-list interface GigabitEthernet0/4 overload  // NAT
!
ip access-list extended nat-list  // NAT用アクセスリスト
 permit ip object-group local_lan_subnets any
 deny   ip any any
ip access-list extended split  // スプリットトンネリング用アクセスリスト
 permit ip 10.10.10.0 0.0.0.127 any
 permit ip 10.2.2.0 0.0.0.255 any
!
access-list 23 permit 10.10.10.0 0.0.0.127
!
line con 0
 login authentication local_access
 no modem enable
line vty 0 4
 access-class 23 in
 privilege level 15
 login authentication local_access
 transport input telnet ssh
line vty 5 15
 access-class 23 in
 privilege level 15
 transport input telnet ssh

Ginza#show vlan-switch 

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi0/2, Gi0/3
10   VLAN0010                         active    Gi0/0, Gi0/1

```

### Shrew Soft VPN Clientの設定
さきほどの[記事](https://community.cisco.com/t5/セキュリティ-ドキュメント/shrew-soft-vpn-clientを使用したリモートアクセスvpn/ta-p/3137928)に沿って設定を行う。
- General - Remote Host：172.16.0.11 / Port：500
- Authentication Method：Mutual PSK+XAuth
- Authentication - Mutual PSK+XAuth - Local Identity - Identification Type：Key Identifier
- Authentication - Mutual PSK+XAuth - Local Identity - Key ID string：RA
- Authentication - Mutual PSK+XAuth - Remote Identity - Identitication Type：IP Address
- Authentication - Mutual PSK+XAuth - Remote Identity - Use a discovered remote host address：チェック
- Authentication - Mutual PSK+XAuth - Credentials - Pre Shared Key：password
- Phase 1 - Cipher Algorithm：aes
- Phase 1 - Hash Algorithm：sha1
- Phase 2 - Transform Algorithm：esp-aes
- Phase 2 - HMAC Algorithm：sha1
- Policy - Remote Network Resouce：10.2.2.0/255.255.255.0

## 実験
UsernameとPasswordとを入力しConnectする。
![connect.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d83031fd-7300-d0be-f675-24932e696da1.png)
接続が成功すると、下記のように「tunnel enabled」が表示される。
![connectedのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f3aa03cb-c5c4-77fb-c567-024ecf9eea42.png)
同時に接続状況を下記する。
![securitypolicies2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7c312bf9-2d6a-531f-17cb-8276f701f815.png)
![securityassociations2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0d00d39b-0348-c749-136e-f6d856b86409.png)
![firewallrules2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5dd702c0-6931-200e-c9cc-6eff1567ad6d.png)

また、PC-Aには下記のような新しいネットワークインターフェースが見える。
![ipconfig2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e53c0bd3-e4f6-296c-9c8a-47ecb844377e.png)
C841Mで設定したドメイン名「test.com」やリモートアクセス用に割り当てたプールからのIPアドレス「10.2.2.208/24」が割り当てられている。ここで、PC-AからPC-Bへpingを実施する。
![ping.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f4efdc4c-60bd-20b4-512e-15d0d6a60836.png)

新しいネットワークインターフェース（ここでは「イーサネットアダプター　ローカルエリア接続*11）が作られるため、Wireshark（npcap）では直接的にパケットをキャプチャすることができない。そのかわりに、Shrew Soft VPN Clientでは、オプション設定により、ネットワークデータをキャプチャできる。
![option2のコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0b12616b-9f49-1b43-3afd-9410c712cc53.png)
「packet dump」にチェックを入れることにより、Wiresharkで読み込み可能な「pcap」ファイルが作成される（暗号化前データと後データ）。これにより、先程のpingをキャプチャしたものが下記である。
暗号化前データ：
![pingFrom208to2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/2352d093-3123-b1bd-072f-e669e6705f09.png)
暗号化後データ：
![pingFrom208to2(ESP).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4feb8891-776f-fe9c-4c58-a27c2e669e8c.png)
なお、IKEやIPsecのログデータやIKEのキャプチャデータも作成されるが、ここでは省略。

## おわりに
VPNクライアントソフトウェアを入れずに、Windows10だけでなんとかしたかったのであるが、GiveUp。時間ができたら、またトライするかも。