Fortigate（その２：VXLAN under NAT）

# NAT環境下の拠点間接続時の同一ネットワーク（VXLAN over IPsec under NAT）
「[その１](https://qiita.com/infinite1oop/items/db21099ad9e7e4fce926)」の続き。NAT環境下の拠点間接続時に同一ネットワークを実現する。調査及びトライ＆エラーの結果、IPsec+NATトラバーサルを使わざるを得ないようであった。

## ネットワーク
下記のようなネットワーク構成。中央にNATが存在し、左が内側、右が外側である。末端のPCどうしが同一ネットワークに属する。
![VXLANoverIPsec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c30a046c-b313-e18e-c929-5baa262b421b.png)

## 設定
各種項目作成については、「[その１](https://qiita.com/infinite1oop/items/db21099ad9e7e4fce926)」も参照されたし。特記事項がなければ、基本的に左側のForigateの設定を記載している。

### ループバック（Loopback）
後述するVXLANの宛先として、Loopback IPアドレスを作成する。
![NetworkInterface_CreateLoopback.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9d9e607b-6aee-16f1-38c1-302c137b9137.png)
ここでは、左側FortigateのLoopback IPアドレスとして”1.1.1.1”、右側FortigateのLoopback IPアドレスとして”1.1.1.2”を用いる。

### VXLAN
CLIによる作成。VNIとして、10を用いる。これは、双方のFortigateで同じ値。
```
FG1 (vxlan) # show
config system vxlan
    edit "vxlan"
        set interface "Lo"
        set vni 10
        set remote-ip "1.1.1.2"
    next
end
```

### ソフトウェアスイッチ（Bridge）
ここは「[その１](https://qiita.com/infinite1oop/items/db21099ad9e7e4fce926)」と同じ。作成したVXLANとInternal（ここではPort4および5）とをつなぐソフトウェアスイッチ（Bridge）を作成。
![NetworkInterface_CreateSoftwareSwitch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ac22eb76-5ad4-53be-f3ca-077997154fdf.png)

### WAN
- 左側Fortigate：DHCPによるIPアドレス（10.1.1.x/24）
- 右側Fortigate：10.1.3.1/24（固定）

### ネットワークインターフェース
最終的には下記となる（一部後述するVPN記述含む）。

##### 左側Fortigate
![Inside_Network.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f4b7943f-4fcb-a904-1925-f19cea1d8aa0.png)

##### 右側Fortigate
![Outside_Network.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/841ef703-32be-b51f-a1e1-1c311437ee5a.png)

### IPsec VPN
IPsecトンネルにて、「カスタム」を選択して作成する。

#### 左側Fortigate（NAT inside）
リモートゲートウェイのスタティックIPアドレスとして、対向peerのIPアドレス”10.1.3.1”を指定する。NATトラバーサルを有効化することも重要。
![Inside_IPsecTunnel3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/82270e40-0b59-9177-2357-b6358db19a65.png)
事前認証鍵を指定する。
![VPN_Password.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/09893508-e239-dd86-9c09-30deb399abb2.png)
オートネゴシエーション選択。
![Inside_IPsecTunnel5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4a09201f-1d35-047e-afd9-b308aafa3906.png)
IPsec対象とするIPアドレスは指定しない。
![Inside_IPsecTunnel4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/020b9d31-d850-374b-2385-a8aa3ad34883.png)

#### 右側Fortigate（NAT outside）
NAT外側では、対向PeerのIPアドレスが不定となる。リモートゲートウェイのダイアルアップユーザを選択する。NATトラバーサルを有効化することも同じ。
![Outside_IPsecTunnel3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/561423a1-9e30-51b2-30d8-0baec1e54a94.png)
事前認証鍵指定は先ほどと同様。なお、ダイアルアップユーザの場合、オートネゴシエーション指定はできない。また、IPsec対象とするIPアドレスは指定しない。

### Static Route
#### 左側Fortigate（NAT inside）
![Inside_StaticRoute.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b60dd8e9-6014-2b61-2d96-64a79add29ed.png)
対向PeerのIPアドレス（10.1.3.1）へのルートを作成。今回の最大のポイントと感じたのは、対向PeerのループバックIPアドレス（1.1.1.1）のインターフェースとして、VPNトンネル（vpn1）を指定することであった。

#### 右側Fortigate（NAT outside）
![Outside_StaticRoute.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/dc188163-4cb4-821e-8c05-4fa9ec903823.png)
同じく対向PeerのループバックIPアドレス（1.1.1.2）のインターフェースとして、VPNトンネル（vpn2）を指定。

### Firewall
Fortigate内外（WAN-LAN間）を通信させるためのFirewall設定。VPNトンネル、ソフトウェアスイッチ、ループバックIPアドレス間通信を許可する。
![Inside_Firewall.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f9bbca74-d832-547a-0e80-77d6ab8d62f1.png)
右側Fortigateでは、上記vpn1がvpn2に置き換わるだけである。

## 検証
pingによる検証。パケットはESPとなってしまい、見ることができないので、Wiresharkで取得したデータは省略。左側Fortigateのルーティングテーブルは下記となる。
```
FG1 # get route info routing-table all
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       V - BGP VPNv4
       * - candidate default

Routing table for VRF=0
C       1.1.1.1/32 is directly connected, Lo
S       1.1.1.2/32 [10/0] via vpn1 tunnel 10.1.3.1, [1/0]
C       10.1.1.0/24 is directly connected, wan1
S       10.1.3.1/32 [10/0] via 10.1.1.1, wan1, [1/0]
C       192.168.10.0/24 is directly connected, internal
```
右側ortigateのルーティングテーブルは下記となる。
```
FG2 # get route info routing-table all
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       V - BGP VPNv4
       * - candidate default

Routing table for VRF=0
S*      0.0.0.0/0 [15/0] via vpn2 tunnel 10.1.3.2, [1/0]
S       1.1.1.1/32 [10/0] via vpn2 tunnel 10.1.3.2, [1/0]
C       1.1.1.2/32 is directly connected, Lo
C       10.1.3.0/24 is directly connected, wan1
C       192.168.30.0/24 is directly connected, internal
```
なお、IPsecトンネルが確立されている状況は下記となる。
![Inside_IPsecTunnel.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/19e8f844-3ece-d8f1-7a89-5f6a75e8a8bc.png)
![Outside_IPsecTunnel.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fa4d4659-bb9b-e623-fecc-688b61038e17.png)

## 終わりに
VXLANはUDPパケットなので、理論的には、NAT環境下でIPsecなしでも実現できるのではあるが、このあたりはFortigateの仕様なのであろう。