YAMAHAルータとSSG5のIPSec VPN構築

# はじめに

あまりIPSecについて理解が浅いので、実際に実機を使って環境構築して学んでみようと思います。


# 仕様

## 使用する機器

|メーカー|機器|FWバージョン|用途|
|-|-|-|-|
|Juniper|SSG5|6.3.0r27.0|拠点側|
|YAMAHA|RTX1200|10.01.78|本社側（メイン）|
|YAMAHA|RTX810|11.01.34|本社側（サブ）|

## 構成


### 構成図
SSG5を拠点側、RTX1200を本社側メイン、RTX830を本社側サブという建付けにします。
RTX1200とRTX830はVRRPによる冗長構成を取ります。
拠点側から本社側にアクセスする際にNAPTもかけます。

![ipsec.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/2cb42496-5bd1-d3f0-843f-7bf5ca954bb0.png)

### ネットワークアドレス
使用するネットワークセグメントは以下の通り。
|ネットワークアドレス|用途|
|-|-|
|192.168.100.0/24|拠点側ネットワーク|
|192.168.254.0/24|IP-VPN（と見立てたネットワーク）|
|172.16.1.0/24|本社側ネットワーク|
|172.17.1.0/30|SSG5とRTX1200のIPSec VPN|
|172.17.1.4/30|SSG5とRTX810のIPSec VPN|

## 設定

### 本社側メイン（RTX1200）
最低限の設定だけ抜粋しています。
```
# SSG5側のloopbackアドレス
ip route 172.17.1.254/32 gateway tunnel 2
ip lan1 address 172.16.1.253/24
ip lan2 address 192.168.254.1/24
ip lan1 vrrp 1 172.16.1.249 priority=200 preempt=on
ip lan1 vrrp shutdown trigger 1 route 172.17.1.254/32
ip keepalive 1 icmp-echo 5 3 172.17.1.2 log=on
tunnel select 2
 ipsec tunnel 1
  ipsec sa policy 1 2 esp aes256-cbc sha256-hmac
  ipsec ike always-on 2 on
  ipsec ike duration ipsec-sa 2 3600
  ipsec ike encryption 2 aes256-cbc
  ipsec ike group 2 modp1024
  ipsec ike hash 2 sha256
  ipsec ike keepalive use 2 on dpd
  ipsec ike local address 2 192.168.254.1
  ipsec ike pfs 2 on
  ipsec ike pre-shared-key 2 RTX1200
  ipsec ike remote address 2 192.168.254.254
  ipsec auto refresh 2 on
 ip tunnel address 172.17.1.1/30
 tunnel enable 2
```

### 本社側サブ（RTX810）
最低限の設定だけ抜粋しています。
```
# SSG5側のloopbackアドレス
ip route 172.17.1.254/32 gateway tunnel 2 keepalive 1
ip icmp redirect send off
ip lan2 address 192.168.254.2/24
ip lan1 address 172.16.1.254/24
ip lan1 vrrp 1 172.16.1.249 priority=100 preempt=on
ip lan1 vrrp shutdown trigger 1 route 172.17.1.254/32
ip keepalive 1 icmp-echo 5 3 172.17.1.6 log=on
tunnel select 2
 ipsec tunnel 1
  ipsec sa policy 1 2 esp aes256-cbc sha256-hmac
  ipsec ike always-on 2 on
  ipsec ike duration ipsec-sa 2 3600
  ipsec ike encryption 2 aes256-cbc
  ipsec ike group 2 modp1024
  ipsec ike hash 2 sha256
  ipsec ike keepalive use 2 on dpd
  ipsec ike local address 2 192.168.254.2
  ipsec ike pfs 2 on
  ipsec ike pre-shared-key 2 RTX810
  ipsec ike remote address 2 192.168.254.254
  ipsec auto refresh 2 on
 ip tunnel address 172.17.1.5/30
 tunnel enable 2
```

### 拠点側（SSG5）
最低限の設定だけ抜粋しています。

:::note info
VPN monitorの送信元インタフェイスをloopbackインタフェイスとすることで、monitorで送出されるpingの送信元IPアドレスを指定しています。

当初送信元インタフェイスをe0/0に指定していたのですが、e0/0のインタフェイスIPアドレスが送信元IPアドレスになってしまって、本社側ルータからの戻りの通信ができなくなってしまっていました。
:::

```
# 拠点側LANの設定
set interface "bgroup0" zone "Trust"
set interface bgroup0 port ethernet0/3
set interface bgroup0 ip 192.168.100.251/24

set interface "ethernet0/0" zone "Untrust"
set interface ethernet0/0 ip 192.168.254.254/24

# IPSec Tunnelの設定（本社メイン）
set interface "tunnel.1" zone "Untrust"
set interface tunnel.1 ip 172.17.1.2/30

# IPSec Tunnelの設定（本社サブ）
set interface "tunnel.2" zone "Untrust"
set interface tunnel.2 ip 172.17.1.6/30

# IPSec monitorの送信元インタフェイスとして使用するLoopbackインタフェイス
set interface "loopback.1" zone "Untrust"
set interface loopback.1 ip 172.17.1.254/32

# IPSec P1/P2の設定
set ike p1-proposal "pre-g2-aes256-sha256" preshare group2 esp aes256 sha2-256 second 28800
set ike p2-proposal "g2-esp-aes256-sha256" group2 esp aes256 sha2-256 second 3600

# IPSecの設定（本社メイン）
set ike gateway "RTX1200" address 192.168.254.1 Main outgoing-interface "ethernet0/0" preshare RTX1200 proposal "pre-g2-aes256-sha256"
set ike gateway "RTX1200" dpd-liveness interval 10
set ike gateway "RTX1200" dpd-liveness always-send
set ike gateway "RTX1200" dpd-liveness reconnect 60

set vpn "RTX1200" gateway "RTX1200" no-replay tunnel idletime 0 proposal "g2-esp-aes256-sha256"
set vpn "RTX1200" monitor source-interface loopback.1 destination-ip 172.17.1.1 rekey
set vpn "RTX1200" id 0x7 bind interface tunnel.1

# IPSecの設定（本社サブ）
set vpn "RTX810" gateway "RTX810" no-replay tunnel idletime 0 proposal "g2-esp-aes256-sha256"
set vpn "RTX810" monitor source-interface loopback.1 destination-ip 172.17.1.5 rekey
set vpn "RTX810" id 0x8 bind interface tunnel.2

set ike gateway "RTX810" address 192.168.254.2 Main outgoing-interface "ethernet0/0" preshare RTX810 proposal "pre-g2-aes256-sha256"
set ike gateway "RTX810" dpd-liveness interval 10
set ike gateway "RTX810" dpd-liveness always-send
set ike gateway "RTX810" dpd-liveness reconnect 60

# ポリシの設定（NAPTをかける）
set policy id 2 from "Trust" to "Untrust"  "Any" "172.16.251.0/24" "ICMP-ANY" nat src permit log
set policy id 2
set dst-address "172.18.80.0/24"
exit

# ルーティングの設定
set route 0.0.0.0/0 interface bgroup0 gateway 192.168.100.1
set route 172.16.1.0/24 interface tunnel.1 metric 10
set route 172.16.1.0/24 interface tunnel.2 metric 20
```


# 検証
それでは状態確認して、検証していきます。
## IPSecの状態
まずはそれぞれの機器のIPSecの状態を確認します。

### 本社側メイン(RTX1200)

```
RTX1200# show ipsec sa gateway
sgw  flags local-id         remote-id        # of sa
--------------------------------------------------------------------------
2    U K   192.168.254.1    192.168.254.254  i:1 s:1 r:3
```

```
RTX1200# show ipsec sa gateway 2 detail
SA[1] Duration: 17577s
Local ID: 192.168.254.1
Remote ID: 192.168.254.254
Protocol: IKE
Algorithm: AES256-CBC, SHA2-256, MODP 1024bit
SPI: 1d 72 c7 62 86 bb 65 98 77 72 9d 61 6d c7 30 d5
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[2] Duration: 3236s
Local ID: 192.168.254.1
Remote ID: 192.168.254.254
Direction: send
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: 51 b5 0e 7b
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[3] Duration: 3195s
Local ID: 192.168.254.1
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: bd f9 93 02
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[4] Duration: 3236s
Local ID: 192.168.254.1
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: d9 7f 6d 1b
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[5] Duration: 3156s
Local ID: 192.168.254.1
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: 7c 9e e8 a0
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
```

### 本社側サブ(RTX810)
```
RTX810# show ipsec sa gateway
sgw  flags local-id         remote-id        # of sa
--------------------------------------------------------------------------
2    U K   192.168.254.2    192.168.254.254  i:1 s:1 r:3
```
```
RTX810# show ipsec sa gateway 2 detail
SA[1] Duration: 24411s
Local ID: 192.168.254.2
Remote ID: 192.168.254.254
Protocol: IKE
Algorithm: AES256-CBC, SHA2-256, MODP 1024bit
SPI: ff 85 90 fe 91 6c f5 de 20 20 6d f4 d5 80 4f ef
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[2] Duration: 3070s
Local ID: 192.168.254.2
Remote ID: 192.168.254.254
Direction: send
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: 51 b5 0e 7c
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[3] Duration: 3028s
Local ID: 192.168.254.2
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: a2 dc 6a 3e
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[4] Duration: 3070s
Local ID: 192.168.254.2
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: 85 4a 37 b9
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
SA[5] Duration: 2800s
Local ID: 192.168.254.2
Remote ID: 192.168.254.254
Direction: receive
Protocol: ESP (Mode: tunnel)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA2-256)
SPI: 2f b9 16 e2
Key: ** ** ** ** **  (confidential)   ** ** ** ** **
----------------------------------------------------
```


### 拠点側(SSG5)
```
SSG5-> get ike cookie

IKEv1 SA -- Active: 2, Dead: 0, Total 2

80102f/0003, 192.168.254.254:500->192.168.254.2:500, PRESHR/grp2/AES256/SHA2-256, xchg(5) (RTX810/grp-1/usr-1)
resent-tmr 322 lifetime 28800 lt-recv 28800 nxt_rekey 24749 cert-expire 0
initiator, err cnt 0, send dir 0, cond 0x0
nat-traversal map not available
ike heartbeat              : disabled
ike heartbeat last rcv time: 0
ike heartbeat last snd time: 0
XAUTH status: 0
DPD seq local 603356368, peer 858920808

80102f/0003, 192.168.254.254:500->192.168.254.1:500, PRESHR/grp2/AES256/SHA2-256, xchg(5) (RTX1200/grp-1/usr-1)
resent-tmr 322 lifetime 28800 lt-recv 28800 nxt_rekey 17745 cert-expire 0
initiator, err cnt 0, send dir 0, cond 0x0
nat-traversal map not available
ike heartbeat              : disabled
ike heartbeat last rcv time: 0
ike heartbeat last snd time: 0
XAUTH status: 0
DPD seq local 857176791, peer 2065584233


IKEv2 SA -- Active: 0, Dead: 0, Total 0
```


## 疎通確認

### 本社側メイン(RTX1200)経由
拠点側からpingを打ってみます。

```
C:\Users\doraemon>ping 172.16.1.249

172.16.1.249 に ping を送信しています 32 バイトのデータ:
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253

172.16.1.249 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 2ms、最大 = 2ms、平均 = 2ms
```

### 本社側サブ(RTX810)経由
こんどは、本社側メインのLAN2を抜線してpingを打ってみます。

```
C:\Users\doraemon>ping 172.16.1.249

172.16.1.249 に ping を送信しています 32 バイトのデータ:
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253
172.16.1.249 からの応答: バイト数 =32 時間 =2ms TTL=253

172.16.1.249 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 2ms、最大 = 2ms、平均 = 2ms
```