Oracle Cloud:OCI-C(VPNaaS)とOCI(Libreswan)でVPN接続してみてみた

#■概要

OCI-C(Oracle Cloud Infrastructure Classic)サイトで、データセンターとIPネットワーク間のVPN接続を設定するには、VPN as a Service(VPNaaS)を使用します。 
これにより、データセンターとIPネットワークに追加されたインスタンス間の安全な通信チャネルが提供されます。 

OCI(Oracle Cloud Infrastructure)サイトは、OCI-CのVPNaaS と接続するために OCI側に今回はDRGではなく、LibreswanのCompute Instance を作成してIPSec VPN接続を行います

##●NW構成イメージ
<img width="1207" alt="構成(大).png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/425b96c8-a6d9-5080-0991-5757d3650f7a.png">




#■OCI-C側手順
・IPNetwork、Compute Instance を上記NW構成イメージのように作成配置します
本手順ではVPnaaS作成を行います
##●VPNaaS作成設定
・OCI-Cコンソール画面
OCI-CコンソールのNetwork画面の左ペインより、[VPN]->[VPNaaS]->[VPN Connections]画面にて、[Create VPN Connection]ボタンをクリック
<img width="640" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/6c4e9fd7-4946-b4bb-9bf3-632a87122b46.png">

・Create VPN Connection 画面

以下項目を記入し[Create]ボタンをクリックしてVPnaaSを作成

	                     - Name：VPnaaSの適当な名前を記入
	               - IP Network：OCI-CのIP Network CIDERを記入
	         - Customer Gateway：OCIのLibreswanインスタンスのPublic IPを記入
	- Customer Reachable Routes：OCIのVCN CIDER を記入
	           - Pre-shared key：VPN接続するための適当なパスワードを記入

<img width="639" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/264d3ade-9ab9-1bd8-88b3-3fae8336e1ce.png">

・作成後のコンソール画面
VPNaaSが作成されていることを確認
Tunnel Status は OCI側と疎通していないためDown状態
<img width="946" alt="05_VPN接続前.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/4a3f5242-57f5-14e9-b5a7-5daed8bceaf3.png">


#■OCI側手順
LibreswanインスタンスをVPN Gatewayとするための設定を行います

##●Libreswan のCompute VNIC設定
デフォルトでは、すべてのVNICはネットワークトラフィックで送信元/宛先のチェックを実行し,VNICが送信元または宛先でない場合、パケットは廃棄されます。
VNICがトラフィックを転送する必要がある場合,VNICの"Skip Source/Destination Check"のチェックをしてVNICの送信元/宛先のチェックを無効にします。

① LibreswanのComputeインスタンス画面の左ペインにある[Attached VNICs]をクリックし、Gateway とするVNICを選択して、Edit VNICをクリック
<img width="629" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/7973f706-1abb-4117-8040-36dab009675e.png">


② "Skip Source/Destination Check"をチェックして[Update VNIC]をクリック
<img width="317" alt="06-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/a1a7eeea-0029-b6e4-d376-f3646018fe89.png">


##●Route Table 設定
以下２つのRouteを追加
　①LibreSwanがVPN通信できるよう Internet Gateway 0.0.0.0/0 のRouteを追加
　②OCIインスタンスから、OCI-C側のCIDR 192.168.0.0/16 は Libreswanインスタンス(172.24.1.3)を通るようRouteを追加

<img width="491" alt="14_Routetable(ALL).png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/664385e0-ac77-6c34-e336-088e2907641e.png">

##●Security List設定

	- IPsec VPN接続用に以下ポートアクセスを許可
		Internet Key Exchange (IKE) プロトコル用：UDP ポート 500 
		IKE NAT-Traversal 用：UDP ポート 4500 
		Encapsulated Security Payload (ESP) IPsec パケット用 ：プロトコル 50 
	- IPsec VPN接続用にOCI-Cインスタンスからのポートアクセスを許可
		ここでは、192.168.100.0/24 のAll Protocols を許可

<img width="665" alt="ALL.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/9da5a564-c006-f4fc-4dc8-d114358afb59.png">



##●Libreswanインストール
Libreswan用Compute Instanceを作成し、yumでLibreswanをインストール

```shell-session
[root@libreswan-inst01 ~]$ yum -y install libreswan
	Loaded plugins: langpacks, ulninfo
	ol7_UEKR5                                                | 2.5 kB     00:00
	ol7_addons                                               | 2.5 kB     00:00
	ol7_developer                                            | 2.5 kB     00:00
	・・・
	Installed:
	  libreswan.x86_64 0:3.23-5.0.1.el7_5

	Dependency Installed:
	  ldns.x86_64 0:1.6.16-10.el7         unbound-libs.x86_64 0:1.6.6-1.el7

	Complete!
```

##●Libreswan Version確認

```shell-session
[root@libreswan-inst01 ~]$ ipsec --version
	Linux Libreswan 3.23 (netkey) on 4.14.35-1818.2.1.el7uek.x86_64
```

##●LibreSwan設定

・/etc/sysctl.conf設定
以下内容を追加

```bash:/etc/sysctl.conf
	net.ipv4.ip_forward = 1
	net.ipv4.conf.all.accept_redirects = 0
	net.ipv4.conf.all.send_redirects = 0
	net.ipv4.conf.default.send_redirects = 0
	net.ipv4.conf.ens3.send_redirects = 0
	net.ipv4.conf.default.accept_redirects = 0
	net.ipv4.conf.ens3.accept_redirects = 0
	net.ipv4.conf.all.rp_filter = 0
	net.ipv4.conf.default.rp_filter = 0
	net.ipv4.conf.ens3.rp_filter = 0
	net.ipv4.conf.ip_vti0.rp_filter = 0
	net.ipv4.conf.all.rp_filter = 0
```

・/etc/sysctl.conf設定反映
sysctl コマンドで設定を反映してエラー出力が無いことを確認

```shell-session
[root@libreswan-inst01 ~]$ sysctl -p
	net.ipv4.ip_forward = 1
	net.ipv4.conf.all.accept_redirects = 0
	net.ipv4.conf.all.send_redirects = 0
	net.ipv4.conf.default.send_redirects = 0
	net.ipv4.conf.ens3.send_redirects = 0
	net.ipv4.conf.default.accept_redirects = 0
	net.ipv4.conf.ens3.accept_redirects = 0
	net.ipv4.conf.all.rp_filter = 0
	net.ipv4.conf.default.rp_filter = 0
	net.ipv4.conf.ens3.rp_filter = 0
	net.ipv4.conf.ip_vti0.rp_filter = 0
	net.ipv4.conf.all.rp_filter = 0
```


・/etc/ipsec.conf設定
以下内容を追加

```bash:/etc/ipsec.conf
	config setup
           plutoopts="--perpeerlog"
           protostack=auto
           nat_traversal=yes
	include /etc/ipsec.d/*.conf
```

・/etc/ipsec.d/VPNaaS.conf作成設定
OCI-C接続用設定ファイルを作成して設定

```bash:/etc/ipsec.d/VPNaaS.conf
[root@libreswan-inst01 ~]$ vi /etc/ipsec.d/VPNaaS.conf
	conn vpnaas1
	     authby=secret
	     auto=start
	     pfs=yes
	     leftid=146.56.1.108     #OCI-C VPNaaS IPSec Public IP
	     left=146.56.1.108       #OCI-C VPNaaS IPSec Public IP
	     leftsubnets={192.168.200.0/24} #OCI-C IP-Network CIDR
	     right=172.24.1.5            #OCI Libreswan local VPC internal address
	     rightid=129.213.179.43    #OCI Libreswan Public IP address
	     rightsubnet=172.24.0.0/16    #OCI VPC CIDR
```

・/etc/ipsec.d/VPNaaS.secrets作成設定
OCI-C接続用設定ファイルを作成して設定
Secret Keyは VPNaaS作成で設定した"Pre-shared key"を記入

```bash:/etc/ipsec.d/VPNaaS.secrets
[root@libreswan-inst01 ~]# vi /etc/ipsec.d/VPNaaS.secrets
	#OCI-C_VPNaaS-Public-IP  OCI_LibreSWAN-PublicIP   :   PSK    "Secret Key(VPNaaS Pre-shared key)"
	146.56.1.108 129.213.179.43   :    PSK    "password"
```

・Libreswan IPsec起動

```shell-session
[root@libreswan-inst01 ~]# systemctl restart ipsec
```


・Libreswan設定 Verifyチェック
すべて[OK]であることを確認

```shell-session
[root@libreswan-inst01 ~]# ipsec verify
	Verifying installed system and configuration files

	Version check and ipsec on-path                         [OK]
	Libreswan 3.23 (netkey) on 4.14.35-1818.2.1.el7uek.x86_64
	Checking for IPsec support in kernel                    [OK]
	 NETKEY: Testing XFRM related proc values
	         ICMP default/send_redirects                    [OK]
	         ICMP default/accept_redirects                  [OK]
	         XFRM larval drop                               [OK]
	Pluto ipsec.conf syntax                                 [OK]
	Two or more interfaces found, checking IP forwarding    [OK]
	Checking rp_filter                                      [OK]
	Checking that pluto is running                          [OK]
	 Pluto listening for IKE on udp 500                     [OK]
	 Pluto listening for IKE/NAT-T on udp 4500              [OK]
	 Pluto ipsec.secret syntax                              [OK]
	Checking 'ip' command                                   [OK]
	Checking 'iptables' command                             [OK]
	Checking 'prelink' command does not interfere with FIPS [OK]
	Checking for obsolete ipsec.conf options                [OK]
```


・Libreswan IPsec接続確認
OCI-C側のVPNaaS作成設定済みの場合、上記IPsec起動によりVPN接続が確立される

```shell-session
[root@libreswan opc]# ipsec auto --status |grep "==="
　　000 "vpnaas1/1x0": 172.24.0.0/16===172.24.1.3<172.24.1.3>[200.200.200.201]...100.100.100.101<100.100.100.101>===192.168.100.0/24; erouted; eroute owner: #8883
```

・自動起動設定

```shell-session
[root@libreswan-inst01 ~]# systemctl status ipsec
	● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
	Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled; vendor preset: disabled)
	・・・
	==> disabledであること確認

[root@libreswan-inst01 ~]# systemctl enable ipsec
	Created symlink from /etc/systemd/system/multi-user.target.wants/ipsec.service to /usr/lib/systemd/system/ipsec.service.

[root@libreswan-inst01 ~]# systemctl status ipsec
	● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
	   Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disabled)
	・・・
	==> enabledであること確認
```

・OCI-CのVPNaaSのStatus確認
OCI-CのコンソールでVPNaaSのStatusがUPになっていることを確認
<img width="945" alt="05_VPN接中.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/927442ea-5931-57b4-3563-485997f86687.png">


#■VPN接続確認
##●OCI-C：VPNaaSとOCI:Libreswan間疎通確認
・Libreswan - VPnaaS間のローカルアドレス疎通確認

```shell-session
[root@libreswan-inst01 ~]# ping 192.168.200.254
	PING 192.168.200.254 (192.168.200.254) 56(84) bytes of data.
	64 bytes from 192.168.200.254: icmp_seq=1 ttl=64 time=274 ms
	64 bytes from 192.168.200.254: icmp_seq=2 ttl=64 time=250 ms
	64 bytes from 192.168.200.254: icmp_seq=3 ttl=64 time=266 ms
	^C
	--- 192.168.200.254 ping statistics ---
	9 packets transmitted, 9 received, 0% packet loss, time 8010ms
	rtt min/avg/max/mdev = 241.165/261.181/274.139/10.852 ms
```

##●OCI-Cインスタンス設定

OCI-CインスタンスがVPaaSをGateway経由としてOCI側NWに接続するようroute追加

・設定前確認

```shell-session
[root@koba-inst02 ~]# netstat -nr
	Kernel IP routing table
	Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
	0.0.0.0         10.10.7.85     0.0.0.0         UG        0 0          0 eth1
	10.10.7.85     0.0.0.0         255.255.255.252 U         0 0          0 eth1
	192.168.200.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
```

・Route追加

```shell-session
[root@koba-inst02 ~]# route add -net 172.24.0.0 netmask 255.255.0.0 gw 192.168.200.254 eth0
```

・設定反映確認

```shell-session
[root@koba-inst02 ~]$ netstat -nr
	Kernel IP routing table
	Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
	0.0.0.0         10.10.7.85     0.0.0.0         UG        0 0          0 eth1
	10.10.7.85     0.0.0.0         255.255.255.252 U         0 0          0 eth1
	172.24.0.0      192.168.200.254 255.255.0.0     UG        0 0          0 eth0
	192.168.200.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
```

##●OCI-C と OCI Computeインスタンス間 疎通確認

・Libreswan インスタンスのfirewalld停止
Computeインスタンス間疎通動作確認のため、Libreswan インスタンス(libreswan-inst01)のファイアウォール停止します。

```shell-session
[root@libreswan-inst01 ~]# systemctl stop firewalld
```

・OCI-C -> OCI疎通確認
OCI-Cのインスタンス(OCI-C-inst01)に接続して、OCIのインスタンス(oci-inst01)に疎通できることを確認

```shell-session
[opc@OCI-C-inst01 ~]$ ping 172.24.2.7
	PING 192.168.100.3 (172.24.2.7) 56(84) bytes of data.
	64 bytes from 172.24.2.7: icmp_seq=1 ttl=63 time=171 ms
	64 bytes from 172.24.2.7: icmp_seq=2 ttl=63 time=170 ms
	64 bytes from 172.24.2.7: icmp_seq=3 ttl=63 time=172 ms
	^C
	--- 172.24.2.7 ping statistics ---
	10 packets transmitted, 10 received, 0% packet loss, time 9014ms
	rtt min/avg/max/mdev = 169.559/171.463/178.846/2.808 ms

[opc@OCI-C-inst01 ~]$ ssh -i ”ssh鍵”　opc@172.24.2.7 hostname
	oci-inst01
	==>OCIインスタンス名が出力されればOK
```


・OCI -> OCI-C疎通確認
OCIのインスタンス(oci-inst01)に接続して、OCI-Cのインスタンス(OCI-C-inst01)に疎通できることを確認

```shell-session
[opc@oci-inst01 ~]$ ping  192.168.100.3
	PING 192.168.100.3 (192.168.100.3) 56(84) bytes of data.
	64 bytes from 192.168.100.3: icmp_seq=1 ttl=62 time=2.82 ms
	64 bytes from 192.168.100.3: icmp_seq=2 ttl=62 time=1.54 ms
	64 bytes from 192.168.100.3: icmp_seq=3 ttl=62 time=1.75 ms
	^C
	--- 192.168.100.3 ping statistics ---
	3 packets transmitted, 3 received, 0% packet loss, time 2004ms
	rtt min/avg/max/mdev = 1.543/2.040/2.820/0.559 ms

[opc@oci-inst01 ~]$ ssh -i ”ssh鍵”　opc@192.168.100.3 hostname
	OCI-C-inst01
	==>OCI-Cインスタンス名が出力されればOK
```