FortiGateとStrongSwanでSite-Site IPsec VPNを張る

一部書きかけなので、気が向いたら追記しますが、とりあえず繋がるところまでは記載しました。

# 前提条件

- 環境
    - FortiGate 90D(v5.6.7 build1653)
    - Debian GNU/Linux 9
        - strongSwan U5.5.1/K4.9.0-8-amd64

- ネットワーク用件
    - FortiGate/Debian共にグローバルIPv4アドレスが付いていること
    - Debian側はWAN(Public)/LAN(Private)のイメージで2つのネットワークに所属していること

- ネットワーク構成
![Network.png](https://qiita-image-store.s3.amazonaws.com/0/25028/3531a81a-87fe-172b-c576-f3ef186e082b.png)

# FortiGateの設定

## VPNトンネルの作成

1. 「VPN」→「IPsecウィザード」を選択し、ウィザードに従って設定していきます。
2. 「名前」にはわかりやすい名前を設定し、「テンプレートタイプ」は「カスタム」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/ab4718c4-370b-53dc-30e5-6034a197bbe3.png)
3. 「リモートゲートウェイ」は「固定IPアドレス」を、「IPアドレス」にはDebian側のWANアドレスを入力します。   
「インターフェイス」は通常「wan1」だと思われますが、環境によって合わせてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/0b3486e9-bb6e-b0f2-9238-77f7eb03b435.png)
4. 「方式」は「事前共有鍵」を、「事前共有鍵」にはDebian側のipsec.secretsで設定した、キーを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/004c87c6-b357-915f-f4e9-d06c43e0af40.png)
5. フェーズ1の設定を次のようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/c82008da-0316-6891-d8d0-2443770752c5.png)
6. フェーズ2の設定を次のようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/8cb08b24-4efd-4d3d-a13a-a2777ab15bce.png)

ここまででVPNトンネルの作成は完了です。

## インターフェイスの設定

1. 「ネットワーク」→「インターフェイス」を選択します。
2.  先ほど指定したインターフェイスの下に、指定した名前でトンネルインターフェイスが作成されているため、ダブルクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/11177428-fa21-dcdb-417f-d2749f38cda5.png)
3．「IP」に「10.1.1.1」と入力し、必要に応じてPINGが通るようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/9a19b0dc-a416-3667-80cd-7742fb5815e2.png)

ここまででインターフェイスの設定は完了です。

## ルーティングの設定

1. 「ネットワーク」→「スタティックルート」を選択します。
2. 「新規作成」→「IPv4 Static Route」を選択します。
3. 「宛先」に「10.99.4.0/24」と入力し、「インターフェイス」はVPNトンネルで指定した名前を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25028/101e9e9f-b266-bb9d-9529-7ab9601b8718.png)
4．「OK」をクリックし、ルートを追加します。

## ポリシーの設定

通常のファイヤーウォールポリシーを追加します。

# Debianの設定

## strongSwanのインストール

```
# apt install strongswan
```

```/etc/ipsec.conf
conn %default
  authby=secret
  type=tunnel
  auto=route
  compress=no

conn FortiGate
  left=AAA.AAA.AAA.AAA
  leftsubnet=0.0.0.0/0
  right=BBB.BBB.BBB.BBB
  rightsubnet=0.0.0.0/0
  leftfirewall=no
  leftupdown=/etc/strongswan.d/updown.sh
  keyexchange=ikev1
  ike=aes256-sha256-ecp521
  esp=aes256-sha256-ecp521
  mark=42
  # mark=42の42が後で出てくる、vtiのKeyと一致する必要あり
```

```/etc/ipsec.secrets
BBB.BBB.BBB.BBB AAA.AAA.AAA.AAA : PSK "SuperSecretPSK"
```

ここまでの設定だと、なぜかDebian側からFortiGate側へのパケットが、トンネルデバイスではなく、
eth0などから抜けてしまうため、次の設定が必要です。


```/etc/strongswan.d/charon.conf
# 下記のパラメタのみ書き換え
install_routes = no
```

トンネルが張れた時に呼ばれるスクリプト

```/etc/strongswan.d/updown.sh
!/bin/bash

PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// })
PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// })

echo ${PLUTO_VERB}
echo ${PLUTO_CONNECTION}

VTI_INTERFACE="vti"${PLUTO_MARK_IN_ARR}

case "${PLUTO_VERB}" in
    up-client)
        ip tunnel add ${VTI_INTERFACE} mode vti local ${PLUTO_ME} remote ${PLUTO_PEER} key 42
        ip link set ${VTI_INTERFACE} up
        ip link set ${VTI_INTERFACE} up mtu 1350
        ip addr add 10.1.1.2/32 dev ${VTI_INTERFACE}

        ip route add 10.1.1.1/32 dev ${VTI_INTERFACE}
        ip route add 192.168.0.0/16 dev ${VTI_INTERFACE}
        ;;

    down-client)
        $IP link del ${VTI_INTERFACE}
        ;;
esac
```

strongSwanを起動します。

```
# systemctl start strongswan
```

```/etc/sysctl.conf
# 次の内容を追記
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
```

sysctlの設定を反映

```
sysctl -p
```

状態の確認

```
# ipsec status
Routed Connections:
   FortiGate{1}:  ROUTED, TUNNEL, reqid 1
   FortiGate{1}:   0.0.0.0/0 === 0.0.0.0/0
Security Associations (1 up, 0 connecting):
   FortiGate[1]: ESTABLISHED 20 minutes ago, AAA.AAA.AAA.AAA[AAA.AAA.AAA.AAA]...BBB.BBB.BBB.BBB[BBB.BBB.BBB.BBB]
   FortiGate{2}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: c0bad4f9_i baf54487_o
   FortiGate{2}:   0.0.0.0/0 === 0.0.0.0/0
```

# 参考ページ

- [新しいstrongswanにVPN接続してもパケットが通らなかった : blog.akimasa.jp](https://blog.akimasa.jp/2018/09/15/%E6%96%B0%E3%81%97%E3%81%84strongswan%E3%81%ABvpn%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%82%82%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%81%8C%E9%80%9A%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F/)