OCIとAzureでVPN接続をしてみた

こんにちは。Oracle Cloud Infrastructure(OCI)特集 編集部です。

以前にOCIとAWSでのIPsec VPN接続を行っておりました。
OCIとAWSでVPN接続をしてみた

今回は OCIMicrosoft Azure(以下、Azure)で IPSec VPN接続を検証してみたいと思います。

OCI、AzureのどちらもVPN接続用のサービスが提供されていますが、
Azure側ではそのサービスを利用せずに仮想サーバ上のソフトウェアVPN(Libreswan)でVPN接続を行ってみます。

作業概要

今回のOCIとAzureのVPN接続では、
・OCIのDRG(Dynamic Routing Gateway)
・Azure内に構築したサーバ上のLibreswan
との間で IPSec VPN接続を確立します。

<構成図>

Azure上のLibreswanサーバ情報
・OS:CentOS 7.7
・Libreswan:Linux Libreswan U3.25/K(no kernel code presently loaded) on 3.10.0-1062.9.1.el7.x86_64

OCIとAzureのIPSecVPN接続設定

作業の流れは下記の通りです。
OCI, Azureのどちらも基本的な仮想ネットワークとサブネットの構築は完了しているものとします。

1. Azure側
 1.1 Libreswanサーバを構築し、パブリックIPを確認

2. OCI側
 2.1 DRG、CPE、IPsec作成とルートテーブル設定、セキュリティリスト設定

3. Azure側
 3.1 Libreswanサーバの受信ポート規則の設定
 3.2 Libreswanサーバのソース/宛先チエックの無効化設定
 3.3 Libreswanインストール
 3.4 OS設定
 3.5 Libreswan設定
 3.6 ルートテーブルの設定

 

1. Azure側

1.1 Libreswanサーバを構築し、パブリックIPを確認

Azure上でLibreswanサーバを構築するにあたり、下記のようにしています。
サーバ名:libreswanTest
イメージ:CentOS-based 7.7
構成図のように LibreswanサーバのIPは
 プライベートIP:192.168.10.4
 パブリックIP:aaa.aaa.aaa.aaa
となっています。

2. OCI側

2.1 DRG、CPE、IPsec作成とルートテーブル設定、セキュリティリスト設定

DRG、CPE、IPsecの作成手順は以前のブログ
OCIとAWSでVPN接続をしてみた
⇒OCI側の設定
 9.DRGの作成 ~ 13.セキュリティリストの設定
を参照ください。
※現在は画面が少し変わっていますが ご了承ください…。

3. Azure側

3.1 Libreswanサーバの受信ポート規則の設定

AzureのWebコンソール画面より設定を行います。
サーバのネットワーク設定にて下記のように OCI IPsecアドレスの
・xxx.xxx.xxx.xxx
・yyy.yyy.yyy.yyy
からの通信を許可するように設定します。

3.2 Libreswanサーバのソース/宛先チエックの無効化設定

サーバのネットワークインターフェースの設定にて
IP転送を「有効」にします。

3.3 Libreswanインストール

LibreswanサーバにsshでログインしてLibreswanをインストールします。
# yum -y install libreswan

緑文字は画面に出力された文字です。

Installed:
libreswan.x86_64 0:3.25-8.1.el7_7

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

Complete!

バージョンを確認してみます。

# ipsec --version

Linux Libreswan U3.25/K(no kernel code presently loaded) on 3.10.0-1062.9.1.el7.x86_64


3.4 OS設定

Libreswanを利用するうえで必要となるOSパラメータの修正を行います。
vi にて “/etc/sysctl.conf” ファイルの末尾に追記を行います。

# vi /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.all.rp_filter = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0

下記コマンドを実行してパラメータを有効化します。

# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0

3.5 Libreswan設定

IPSecのコンフィグファイルを下記の通り作成します。

vi /etc/ipsec.d/ipsec.conf

conn oracle-tunnel-1
     left=192.168.10.4
     leftid=aaa.aaa.aaa.aaa
     right=xxx.xxx.xxx.xxx
     authby=secret
     leftsubnet=0.0.0.0/0
     rightsubnet=0.0.0.0/0
     auto=start
     mark=5/0xffffffff # Needs to be unique across all tunnels
     vti-interface=vti1
     vti-routing=no
     ikev2=no
     ike=aes_cbc256-sha2_384;modp1536
     phase2alg=aes_cbc256-sha1;modp1536
     encapsulation=yes
     ikelifetime=28800s
     salifetime=3600s
conn oracle-tunnel-2
     left=192.168.10.4
     leftid=aaa.aaa.aaa.aaa
     right=yyy.yyy.yyy.yyy
     authby=secret
     leftsubnet=0.0.0.0/0
     rightsubnet=0.0.0.0/0
     auto=start
     mark=6/0xffffffff # Needs to be unique across all tunnels
     vti-interface=vti2
     vti-routing=no
     ikev2=no
     ike=aes_cbc256-sha2_384;modp1536
     phase2alg=aes_cbc256-sha1;modp1536
     encapsulation=yes
     ikelifetime=28800s
     salifetime=3600s

上記の設定ですが、
 既知の問題
 https://docs.oracle.com/cd/E97706_01/Content/knownissues.htm
 ⇒「RESOLVED : VPN接続 : リージョンNAT-Tの可用性とLibreswanの問題」
に記載されている通り、
「encapsulation」の値を「no」から「yes」に変更することでうまく通信ができました。
この設定を行わない場合、Libreswan側で受信した際に下記のエラーが出力され、通信ができませんでした。

Jan 10 20:41:01 libreswanTest pluto[2994]: packet from yyy.yyy.yyy.yyy:4500: exchange type of ISAKMP Message has an unknown value: 84 (0x54)
Jan 10 20:41:01 libreswanTest pluto[2994]: packet from yyy.yyy.yyy.yyy:4500: Received packet with mangled IKE header – dropped
Jan 10 20:41:02 libreswanTest pluto[2994]: packet from yyy.yyy.yyy.yyy:4500: exchange type of ISAKMP Message has an unknown value: 241 (0xf1)
Jan 10 20:41:02 libreswanTest pluto[2994]: packet from yyy.yyy.yyy.yyy:4500: Received packet with mangled IKE header – dropped


IPSec接続時の鍵情報を設定します。

vi /etc/ipsec.d/oci.secrets

aaa.aaa.aaa.aaa xxx.xxx.xxx.xxx : PSK "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
aaa.aaa.aaa.aaa yyy.yyy.yyy.yyy : PSK "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

設定が完了したらipsecサービスの起動を行います。

# systemctl start ipsec

tunnelがestablishになっていることを確認します。

# ipsec status | grep establish

確認コマンドの結果がすべてOKになることを確認します。

# ipsec verify
Verifying installed system and configuration files

Version check and ipsec on-path [OK]
Libreswan 3.25 (netkey) on 3.10.0-1062.9.1.el7.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]

OCIへ通信する際にはIPSec設定時に作成したインタフェースをゲートウェイとする必要があるのでその設定を行います。

# ip route add 10.0.0.0/16 nexthop dev vti1 nexthop dev vti2

ルーティングが正しく設定されていることを確認します。

# ip route show
default via 192.168.10.1 dev eth0 proto dhcp metric 100
10.0.0.0/16
nexthop dev vti1 weight 1
nexthop dev vti2 weight 1
168.63.129.16 via 192.168.10.1 dev eth0 proto dhcp metric 100
169.254.169.254 via 192.168.10.1 dev eth0 proto dhcp metric 100
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.4 metric 100

3.6 ルートテーブルの設定

AzureのWebコンソール画面よりルートテーブルを下記のように設定しておきます。

疎通確認

別途 構築したサーバからpingで疎通確認を行っています。

[azureuser@cvmli77n2 ~]$ ping -c 4 10.0.10.11
PING 10.0.10.11 (10.0.10.11) 56(84) bytes of data.
64 bytes from 10.0.10.11: icmp_seq=1 ttl=62 time=11.7 ms
64 bytes from 10.0.10.11: icmp_seq=2 ttl=62 time=11.1 ms
64 bytes from 10.0.10.11: icmp_seq=3 ttl=62 time=11.1 ms
64 bytes from 10.0.10.11: icmp_seq=4 ttl=62 time=11.6 ms

— 10.0.10.11 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 11.110/11.419/11.785/0.304 ms
[azureuser@cvmli77n2 ~]$

ping通信が成功しました!

scpでの通信も行ってみたところ、通信速度は約20MB/s でした。
通信速度についてはもう少し調査して 次回掲載したいと思います。