AWS Site to Site VPNとubuntu 22.04/StrongswanによるVPN接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a2efc322-a799-7889-887a-350f75bfff5f.png)

# 1.EC2(osaka)作成
大阪リージョン側のstrongswanをインストールするEC2を作成します。

## 1-1.EC2作成
以下でEC2を作成します。
・OS：`ubuntu 22.04`
・キーペア：`(ED25519形式のキーペア)`　※ubuntu仕様
・パブリックIPの自動割当て：`有効化`　※別途EIP紐づけ

## 1-2.EIP関連付け
恒久的にVPNを利用する際はグローバルアドレスを固定したほうが便利なためEIPをEC2に関連付けします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/90684690-fd54-1a33-9124-70473c2bd043.png)


## 1-3.PSK作成
接続で利用するためのPSK用文字列を作成します。
EC2にログインし、以下コマンドを入力して文字列出力します。
なお、S2S-VPNでは2つまでトンネルを作成可能のため、2回実行して2個の文字列を作成します。

```text:urandom
# head -c 24 /dev/urandom | base64
# head -c 24 /dev/urandom | base64
```
<br>
<br>

# 2.Site to Site VPN設定
東京リージョン側でSite to Site VPNをセットアップします。



## 2-1.仮想プライベートゲートウェイの作成
仮想プライベートゲートウェイを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/17ffc500-ffa1-c44d-c090-92ddd15bb8fb.png)

適当な名前を付けて作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/df5e0442-e5c8-f6cb-6950-a052ff8c6d1d.png)

Site to Site VPN接続先となるVPCへアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2d695551-6c97-b20a-5539-9e87e4ad5de2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/9b710021-be5b-61f8-0848-ea70094a007a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ea1bcdfd-703e-9305-b3b2-f99bfb4a2591.png)

<br>

## 2-2.ルートテーブル編集
VPN接続先VPNのルートテーブルにて、VPN接続元セグメントに対して仮想プライベートゲートウェイを宛先としたルーティングを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/bf6fbcd1-7734-73ad-ea58-1773ae9b4193.png)

<br>

## 2-3.Site to Site VPN設定
Site to Site VPN接続を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7edc7de4-bbe2-c863-0c6a-704d3eb071a8.png)

<br>

設定項目を入力します。

項目 | 設定内容
--- | ---
名前タグ | （任意）
ターゲットゲートウェイのタイプ | 選択式：今回は作成済みの仮想プライベートゲートウェイを選択
カスタマーゲートウェイ | 選択式：今回は新規で作成
IPアドレス | 接続元(strongswan側)のグローバルIPアドレスを入力
ARN証明書 | AWS ACMに登録されている証明書を使用する場合に選択（省略可）
BGP ASN | BGP接続する際に設定（省略可）
ルーティングオプション | 選択式：今回は静的で設定
静的IPプレフィックス | VPCにアドバタイズするIPプレフィックスを入力
ローカルIPv4ネットワークCIDR | 接続元(strongswan側)のローカルIPセグメントを入力
リモートIPv4ネットワークCIDR | 接続先(S2S-VPN側)のローカルIPセグメントを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/d6ea0d55-6b56-bb95-d112-056db82ea9fb.png)




項目 | 設定内容
--- | ---
トンネルxの内部IPv4 CIDR | トンネル内で使用するIPv4 CIDR（省略可）
トンネルxの事前共有キー | トンネル内で使用するPSK/今回は事前作成したPSKを入力
トンネルxの詳細オプション | 選択式：今回はデフォルトのまま
トンネルのメンテナンス | AWS側のメンテナンススケジュール制御

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/fafc806e-44a3-50f0-9f70-a6307454894e.png)


<details><summary>トンネル詳細オプションの内容</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/8da6d253-bebf-4846-6887-99486c88deb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/55e396d6-ec60-dbba-ecc4-093fb2d51579.png)

</details>

<br>

VPN接続が作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2bcad850-e7e7-63ac-2838-e7860f2742bd.png)

このタイミングでトンネル2個分のグローバルIPアドレスが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/fd4151fb-5880-2973-5834-fe36f61665d4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4745b69b-0e8a-ada4-58da-583590a5578f.png)

<br>

## 2-4.VPNコンフィグダウンロード
VPN設定から設定をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/e47a109b-b992-e4c4-525d-6e385ec03f4b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/7e7bb733-6174-2811-3c20-e2dc6373b7c9.png)

サンプルコンフィグがテキストファイルでダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/781e6cf3-dc48-7fa0-8be7-1c53c0faedac.png)


<br>
<br>

# 3.strongswan設定
接続元側EC2のStrongswan等の設定を行います。

:::note warn
以降は`root`権限で操作を実行します。
:::

## 3-1.NW設定
今回はAWS SecurityGroup側で制御を行うため、ubuntu側はファイアーウォール設定を無効化しておきます。

まずはAWS SecurityGroupでインバウンド通信の許可を設定します。

**■SSH(TCP22)**
タイプ：`SSH`

**■ipsec(UDP500)**
タイプ：`カスタムUDP`
ポート範囲：`500`

**■ipsec(UDP4500)**
タイプ：`カスタムUDP`
ポート範囲：`4500`

<br>

その後、ubuntuファイアーウォールを停止します。

```text:firewall無効化
# ufw disable
```





## 3-2.カーネルパラメータ設定

```text:カーネルパラメータ設定
# vi /etc/sysctl.conf
----------------------------
net.ipv4.ip_forward = 1 
net.ipv6.conf.all.forwarding = 1 
net.ipv4.conf.all.accept_redirects = 0 
net.ipv4.conf.all.send_redirects = 0
```

```text:カーネルパラメータ更新
# sysctl -p
```

```text:カーネルパラメータ一覧表示
# sysctl -a
```
parameter | 設定内容
--- | ---
net.ipv4.ip_forward = 1 | あるNICから来たパケットを別のNICへ送出する(IPv4)
net.ipv6.conf.all.forwarding = 1  | あるNICから来たパケットを別のNICへ送出する(IPv6)
net.ipv4.conf.all.accept_redirects = 0  | ICMPリダイレクトされたパケットの受入無効化
net.ipv4.conf.all.send_redirects = 0 | ICMPリダイレクトされたパケットの送出無効化


<br>

## 3-3.strongswanインストール
以下コマンドにてインストールを実施します。
```text:strongswan-install
# apt update
# apt install -y strongswan
```

<br>

## 3-4.strongswan設定（/etc/ipsec.conf）

```text:/etc/ipsec.conf
# vi /etc/ipsec.conf
----------------------------
config setup
        charondebug="all"
        uniqueids=yes

conn Tunnel1
    type=tunnel
    auto=start
    keyexchange=ikev2
    authby=psk
    leftid=<接続元のグローバルIPアドレス>
    leftsubnet=10.0.1.0/24
    right=<接続先のグローバルIPアドレス/トンネル1>
    rightsubnet=172.16.1.0/24
    aggressive=no
    ikelifetime=28800s
    lifetime=3600s
    margintime=270s
    rekey=yes
    rekeyfuzz=100%
    fragmentation=yes
    replay_window=1024
    dpddelay=30s
    dpdtimeout=120s
    dpdaction=restart
    ike=aes128-sha1-modp1024
    esp=aes128-sha1-modp1024
    keyingtries=%forever


conn Tunnel2
    type=tunnel
    auto=start
    keyexchange=ikev2
    authby=psk
    leftid=<接続元のグローバルIPアドレス>
    leftsubnet=10.0.1.0/24
    right=<接続先のグローバルIPアドレス/トンネル2>
    rightsubnet=172.16.1.0/24
    aggressive=no
    ikelifetime=28800s
    lifetime=3600s
    margintime=270s
    rekey=yes
    rekeyfuzz=100%
    fragmentation=yes
    replay_window=1024
    dpddelay=30s
    dpdtimeout=120s
    dpdaction=restart
    ike=aes128-sha1-modp1024
    esp=aes128-sha1-modp1024
    keyingtries=%forever
```

parameter | 設定内容
--- | ---
charondebug | ログ出力量設定
uniqueids | 接続IDについて枯渇時に再利用を許可するか
conn | 接続名
type | 接続タイプ(tunnel,transport,passthrough,drop)
auto | 接続自動設定(start,add,ignore)
keyexchange | ikeプロトコルバージョン(ikeのみ)
authby | 認証方式(secret,never,null,rsasig,...)
leftid | 自身のVPN用IPアドレス
leftsubnet | 自身側のプライベートサブネット
right | 他方のVPN用IPアドレス
rightsubnet | 他方側のプライベートサブネット
aggressive | アグレッシブモードの使用
ikelifetime | 再認証間隔
lifetime | 接続最長時間
margintime | ローカル側の接続最長時間
rekey | コネクション再接続是非
rekeyfuzz | marginbytes、marginpackets、marginintimeの増加係数
fragmentation | IKEフラグメンテーションの許可
replay_window | IPSecウインドウサイズ
dpddelay | ハートビート間隔
dpdtimeout | タイムアウト間隔
dpdaction | タイムアウト時の動作(restart,hold,clear)
ike | アルゴリズム指定（※）
esp | アルゴリズム指定（※）
keyingtries | 認証試行回数


>(※)アルゴリズム指定については以下のような形式で記載
　　`encryption - integrity[-prf] - dhgroup`
>
>dhgroupについては以下形式で表記
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/12a4fea1-9eed-80aa-eb96-4cae5bdabfc0.png)
>https://docs.strongswan.org/docs/5.9/config/IKEv2CipherSuites.html


その他詳細は以下のマニュアルを参照のこと。

https://libreswan.org/man/ipsec.conf.5.html

https://wiki.strongswan.org/projects/strongswan/wiki/ConfigSetupSection



<br>


## 3-5.strongswan設定（/etc/ipsec.secrets）
secret認証を設定します。

`/etc/ipsec.secret`ファイルに認証設定を追加します。
左側アドレス、右側アドレス、認証方式、認証文字列(secret)を記載します。

```text:/etc/ipsec.secrets
# vi /etc/ipsec.secrets
----------------------------
<接続元のグローバルIPアドレス> <接続先のグローバルIPアドレス/トンネル1> : PSK "V8UAMWSzWtF3JYKwEHAJaV6T883VxNVi"
<接続元のグローバルIPアドレス> <接続先のグローバルIPアドレス/トンネル2> : PSK "I0GGy7OCQNcPmKdJYfEqPlYjyi1bGeng"
```


:::note warn
VPN構成時に`/etc/ipsec.secret`ファイルは権限が`600`となっている必要があります。
```text:check
# ls -l /etc/ipsec.secrets
-rw------- 1 root root 237 10月 29 20:47 /etc/ipsec.secrets
```
:::


<br>


## 3-6.strongswan起動
`ipsec`コマンドを利用してVPN接続を構成します。

```text:ipsec-restart
# ipsec restart
```

ステータス確認にて`Security Associations (2 up, 0 connecting):`と表示されればVPN接続されています。

```text:ipsec-status
# ipsec status
Security Associations (2 up, 0 connecting):
     Tunnel2[2]: ESTABLISHED 77 seconds ago, 10.0.1.11[<接続元GIP>]...<接続先GIP1>[<接続先GIP1>]
     Tunnel2{2}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c3d08fff_i cd91a79f_o
     Tunnel2{2}:   10.0.1.0/24 === 172.16.1.0/24
     Tunnel1[1]: ESTABLISHED 78 seconds ago, 10.0.1.11[<接続元GIP>]...<接続先GIP2>[<接続先GIP2>]
     Tunnel1{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c1819185_i cd9f2a38_o
     Tunnel1{1}:   10.0.1.0/24 === 172.16.1.0/24

```

AWS側からも接続確立が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/0793d0a1-eb42-8364-79d5-932d2335c749.png)