OCIとAzureでVPN接続をしてみた
こんにちは。Oracle Cloud Infrastructure(OCI)特集 編集部です。
以前にOCIとAWSでのIPsec VPN接続を行っておりました。
OCIとAWSでVPN接続をしてみた
今回は OCIとMicrosoft 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 でした。
通信速度についてはもう少し調査して 次回掲載したいと思います。