久しぶりにGNS3（その４：トンネリング：IPsec）

# IPsecにトライ
今回はGNS3にて、トンネリングで頻繁に使われるIPsec環境を構築する。

## 参考サイト

1. [【わかりやすい】 【図解】IPSecの仕組みとは？IPSec-VPN とSSL-VPNの違い](https://www.kagoya.jp/howto/it-glossary/security/ipsec-vpn/)
1. [IPSec サイト間VPNの設定例](https://www.n-study.com/internet-vpn/site-to-site-vpn-configuration-example/)
1. [GNS3：VPNの設定(GRE, IPsec)](https://degitech91.com/gns3-vpn-1/)

1では、VPNでよく利用される、IPSec-VPNとSSL-VPNとの違いが、ネットワークレイヤをもとに説明されており、2および3では、GNS3での設定方法が記載されている。

## 構築したネットワーク
![IPsec_topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1f080801-984f-8614-c3f9-95b21b646dc6.png)

ルーターR1とルーターR2とを間をIPsec化（トンネリング）する。また、R1およびR2には、それぞれ、ローカルネットワーク10.1.1.0/24および10.2.2.0/24が接続されている。

### 各ルーターの設定およびルーティング情報
（PC1およびPC2の設定は自明のため省略。）

#### R1
IKE（鍵交換プロトコル）の設定。

```
crypto isakmp policy 11
 encr aes
 authentication pre-share
 group 2
crypto isakmp key testpwd address 192.168.20.22
```

- Priority：11（1:High-65534:Low）
- 暗号化アルゴリズム：AES
- 事前鍵交換方式（パスワード：testpwd）
- Diffie-Hellman交換：グループ2
- 相手先IPアドレス：192.168.20.22（対向ルーターR2）

IPsecの設定。

```
crypto ipsec transform-set IPSEC-TEST esp-aes esp-sha-hmac 
```

- transform-set名称：IPSEC-TEST
- 暗号化アルゴリズム：AES
- ハッシュアルゴリズム：SHA

暗号マップ設定。

```
crypto map To_R2 11 ipsec-isakmp 
 set peer 192.168.20.22
 set transform-set IPSEC-TEST 
 match address 100

access-list 100 permit ip any any
```

- マップ名称：To_R2
- シーケンス番号：11（正直よくわからず）
- 相手先IPアドレス：192.168.20.22（対向ルーターR2）
- 適用するIPSec transform-set名称
- アクセスリスト番号100の適用
- アクセスリスト100：すべてのIPアドレスを対象

物理I/FおよびStaticルート設定。

```
interface FastEthernet0/0
 ip address 192.168.10.11 255.255.255.0
 crypto map To_R2
         
interface FastEthernet0/1
 ip address 10.1.1.254 255.255.255.0

ip route 0.0.0.0 0.0.0.0 FastEthernet0/0
```

- IPアドレス設定
- FastEthernet0/0の暗号マップTo_R2を適用
- StaticルートとしてFastEthernet0/0を選択

設定されたルーティング情報は下記のとおり。

```
R1#show ip route
（略）

C    192.168.10.0/24 is directly connected, FastEthernet0/0
     10.0.0.0/24 is subnetted, 1 subnets
C       10.1.1.0 is directly connected, FastEthernet0/1
S*   0.0.0.0/0 is directly connected, FastEthernet0/0
```

#### R2
R1とほぼ同じのため、説明省略。

```
crypto isakmp policy 11
 encr aes
 authentication pre-share
 group 2
crypto isakmp key testpwd address 192.168.10.11

crypto ipsec transform-set IPSEC-TEST esp-aes esp-sha-hmac 

crypto map To_R1 11 ipsec-isakmp 
 set peer 192.168.10.11
 set transform-set IPSEC-TEST 
 match address 100

interface FastEthernet0/0
 ip address 192.168.20.22 255.255.255.0
 crypto map To_R1
 
interface FastEthernet0/1
 ip address 10.2.2.254 255.255.255.0

ip route 0.0.0.0 0.0.0.0 FastEthernet0/0
        
access-list 100 permit ip any any
```

```
R2#show ip route
（略）

C    192.168.20.0/24 is directly connected, FastEthernet0/0
     10.0.0.0/24 is subnetted, 1 subnets
C       10.2.2.0 is directly connected, FastEthernet0/1
S*   0.0.0.0/0 is directly connected, FastEthernet0/0
```


#### ISP
```
interface FastEthernet0/0
 ip address 192.168.10.1 255.255.255.0

interface FastEthernet0/1
 ip address 192.168.20.1 255.255.255.0
```

```
ISP#show ip route
（略）

C    192.168.10.0/24 is directly connected, FastEthernet0/0
C    192.168.20.0/24 is directly connected, FastEthernet0/1
```

ここはほぼ自明。説明略。

## 実験
### R1からPC2(R2のローカルネットワーク上のPC)へのping
```
R1#ping 10.2.2.2 repeat 30 

Type escape sequence to abort.
Sending 30, 100-byte ICMP Echos to 10.2.2.2, timeout is 2 seconds:
.................!!!!!!!!!!!!!
Success rate is 43 percent (13/30), round-trip min/avg/max = 32/45/68 ms
```

この時のR1-ISP間のWiresharkデータはこちら。
![FromR1toPC2_20211120のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/909b7a8b-b534-ef6e-163a-5295b83f08ef.png)

IPsecでトンネリング（かつ暗号化：ESP）されているため、宛先IPアドレスである「10.2.2.2」を見ることはできない。

また、ping自体は成功しているが、IKEのネゴシエーションに時間がかかっていることがわかる（赤枠部分）。一度成功すれば、その後のpingは問題ないようだ。ただし、IKEのKeepAliveやSAのLifetimeは別の話であろう。（専門家ではないので、これらの詳細説明は勘弁。）

### PC1(R1のローカルネットワーク上のPC)からPC2(R2のローカルネットワーク上のPC)へのping
```
PC1> ping 10.2.2.2 -c 10
84 bytes from 10.2.2.2 icmp_seq=1 ttl=62 time=82.148 ms
10.2.2.2 icmp_seq=2 timeout
10.2.2.2 icmp_seq=3 timeout
10.2.2.2 icmp_seq=4 timeout
84 bytes from 10.2.2.2 icmp_seq=5 ttl=62 time=89.729 ms
10.2.2.2 icmp_seq=6 timeout
10.2.2.2 icmp_seq=7 timeout
84 bytes from 10.2.2.2 icmp_seq=8 ttl=62 time=67.324 ms
10.2.2.2 icmp_seq=9 timeout
84 bytes from 10.2.2.2 icmp_seq=10 ttl=62 time=62.365 ms

```

この時のPC1-R1間のWiresharkデータはこちら。
![PC1toPC2_20211120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/957d711c-7d12-0d85-148e-3b12759519c8.png)

この時のR1-ISP間のWiresharkデータはこちら。
![PC1toPC2inR1ISP_20211120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a6a5eec9-d36a-3b2b-b208-d68a485d6c56.png)

GNS3上のルーターの能力の問題なのか、すべてのICMPパケットがR1から創出されていない。GNS3の設定を色々試してみたが、よくわからず。高スペックのマシンを用いれば状況は変わるのかもしれない（真偽不明）。

### ISPからPC2へのping
```
ISP#ping 10.2.2.2 repeat 10

Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 10.2.2.2, timeout is 2 seconds:
..........
Success rate is 0 percent (0/10)
```

前述のとおり、ISPにはIPアドレス10.2.2.2(PC2)へのルーティング情報が存在しないので、当然応答なし。

## 終わりに（EIGRPを無理やり設定しても不可）
IPsecではマルチキャストを使うことはできない。なので、ここでは、上述のとおりStaticルートを用いているが、マルチキャストパケットを使うルーティングプロトコルであるEIGRPを設定してみたが、やはりNG。次のようなメッセージが表示された。

```
R1(config)#no ip route 0.0.0.0 0.0.0.0 fastEthernet 0/0
R1(config)#router eigrp 11
R1(config-router)#network 192.168.10.0

*Mar  1 01:11:26.251: %CRYPTO-4-RECVD_PKT_NOT_IPSEC: Rec'd packet not an IPSEC packet. (ip) vrf/dest_addr= /224.0.0.10, src_addr= 192.168.10.1, prot= 88

```

IPsec上でマルチキャストパケットを扱うには、「GRE over IPSec」を使うらしい。なので、次回はこれを試してみる。