AzureとOCIを接続するために、Azureのサイト間(S2S) VPNと、OCI上に立てたOracle Linuxのlibreswanを使ってみました。
構成図
パフォーマンス
[azureuser@azure-linux ~]$ ping -c 12 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=63 time=10.4 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=63 time=9.89 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=63 time=10.6 ms
64 bytes from 10.0.1.2: icmp_seq=4 ttl=63 time=9.96 ms
64 bytes from 10.0.1.2: icmp_seq=5 ttl=63 time=10.6 ms
64 bytes from 10.0.1.2: icmp_seq=6 ttl=63 time=10.7 ms
64 bytes from 10.0.1.2: icmp_seq=7 ttl=63 time=10.3 ms
64 bytes from 10.0.1.2: icmp_seq=8 ttl=63 time=10.5 ms
64 bytes from 10.0.1.2: icmp_seq=9 ttl=63 time=9.97 ms
64 bytes from 10.0.1.2: icmp_seq=10 ttl=63 time=10.4 ms
64 bytes from 10.0.1.2: icmp_seq=11 ttl=63 time=10.2 ms
64 bytes from 10.0.1.2: icmp_seq=12 ttl=63 time=10.2 ms
--- 10.0.1.2 ping statistics ---
12 packets transmitted, 12 received, 0% packet loss, time 11016ms
rtt min/avg/max/mdev = 9.898/10.338/10.703/0.307 ms
[azureuser@azure-linux ~]$
- 1本計測
[azureuser@azure-linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[ 4] local 192.168.0.4 port 52902 connected to 10.0.1.2 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 82.9 MBytes 695 Mbits/sec 35 1.84 MBytes
[ 4] 1.00-2.00 sec 43.8 MBytes 367 Mbits/sec 705 504 KBytes
[ 4] 2.00-3.00 sec 47.5 MBytes 398 Mbits/sec 0 564 KBytes
[ 4] 3.00-4.00 sec 51.2 MBytes 430 Mbits/sec 0 625 KBytes
[ 4] 4.00-5.00 sec 58.8 MBytes 493 Mbits/sec 0 688 KBytes
[ 4] 5.00-6.00 sec 62.5 MBytes 524 Mbits/sec 0 748 KBytes
[ 4] 6.00-7.00 sec 67.5 MBytes 566 Mbits/sec 0 811 KBytes
[ 4] 7.00-8.00 sec 56.2 MBytes 472 Mbits/sec 102 643 KBytes
[ 4] 8.00-9.00 sec 58.8 MBytes 493 Mbits/sec 99 495 KBytes
[ 4] 9.00-10.00 sec 43.8 MBytes 367 Mbits/sec 0 553 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 573 MBytes 481 Mbits/sec 941 sender
[ 4] 0.00-10.00 sec 571 MBytes 479 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux ~]$
- 2本同時計測
[azureuser@azure-linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[ 4] local 192.168.0.4 port 52570 connected to 10.0.1.2 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 69.8 MBytes 586 Mbits/sec 1833 479 KBytes
[ 4] 1.00-2.00 sec 32.5 MBytes 273 Mbits/sec 36 391 KBytes
[ 4] 2.00-3.00 sec 36.2 MBytes 304 Mbits/sec 0 452 KBytes
[ 4] 3.00-4.00 sec 33.8 MBytes 283 Mbits/sec 88 366 KBytes
[ 4] 4.00-5.00 sec 35.0 MBytes 294 Mbits/sec 0 423 KBytes
[ 4] 5.00-6.00 sec 37.5 MBytes 315 Mbits/sec 42 342 KBytes
[ 4] 6.00-7.00 sec 33.8 MBytes 283 Mbits/sec 0 401 KBytes
[ 4] 7.00-8.00 sec 32.5 MBytes 273 Mbits/sec 70 329 KBytes
[ 4] 8.00-9.00 sec 32.5 MBytes 273 Mbits/sec 0 392 KBytes
[ 4] 9.00-10.00 sec 38.8 MBytes 325 Mbits/sec 0 455 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 382 MBytes 321 Mbits/sec 2069 sender
[ 4] 0.00-10.00 sec 380 MBytes 319 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux ~]$
[azureuser@azure-linux2 ~]$ iperf3 -c 10.0.1.3
Connecting to host 10.0.1.3, port 5201
[ 4] local 192.168.0.5 port 39852 connected to 10.0.1.3 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 22.8 MBytes 192 Mbits/sec 695 185 KBytes
[ 4] 1.00-2.00 sec 18.5 MBytes 155 Mbits/sec 0 245 KBytes
[ 4] 2.00-3.00 sec 23.8 MBytes 199 Mbits/sec 0 305 KBytes
[ 4] 3.00-4.00 sec 21.6 MBytes 182 Mbits/sec 18 271 KBytes
[ 4] 4.00-5.00 sec 21.0 MBytes 176 Mbits/sec 1 243 KBytes
[ 4] 5.00-6.00 sec 18.6 MBytes 156 Mbits/sec 1 227 KBytes
[ 4] 6.00-7.00 sec 23.0 MBytes 193 Mbits/sec 0 288 KBytes
[ 4] 7.00-8.00 sec 16.8 MBytes 141 Mbits/sec 3 136 KBytes
[ 4] 8.00-9.00 sec 15.3 MBytes 128 Mbits/sec 1 140 KBytes
[ 4] 9.00-10.00 sec 14.5 MBytes 121 Mbits/sec 0 199 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 196 MBytes 164 Mbits/sec 719 sender
[ 4] 0.00-10.00 sec 194 MBytes 163 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux2 ~]$
計測は、2020年11月21日(土) 午後のものです。
セットアップ
Azure
Azure S2S VPN Gateway
Docsの手順に従ってAzure側をセットアップします。
VPN GatewayのSKUで帯域幅が決まるので、今回は1.25 GbpsのGeneration2 VpnGw2を選択しましたが、上のパフォーマンスを見るとVpnGw1でもよいかもしれません。
ローカルネットワークゲートウェイの作成はOCIのパートを作成してから行います。
OCI
VCN
今回は簡単に、インターネット接続性を持つVCNをウイザードで作成します。
Oracle Linux
Oracle Linuxで作成します。デフォルトのシェイプを選択します。
ネットワークはパブリックサブネットに接続します。
カーネルパラメータ設定
sudo vi /etc/sysctl.conf
下記を追加
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.ens3.send_redirects = 0
net.ipv4.conf.ens3.accept_redirects = 0
net.ipv4.conf.ens3.rp_filter = 0
適用
sudo sysctl -p
ファイアウォール
これを設定することで、libreswanが動いているOracle Linux外にもパケットを転送できるようになります。
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
libreswan
インストール
sudo yum -y install libreswan
設定
sudo vi /etc/ipsec.d/azure-ipsec.conf
Azure側のVPN Gatewayがアクティブ/スタンバイで、1本のトンネルを作成する場合
参考: 公式設定例
conn conn2AzureRouteBasedGW
authby=secret
auto=start
dpdaction=restart
dpddelay=30
dpdtimeout=120
forceencaps=yes # not a must
ike=aes256-sha1;modp1024
ikelifetime=10800s
ikev2=yes
keyingtries=3
left=%defaultroute
leftid=168.138.47.228 # OCI側のパブリックIP
leftsubnets=10.0.0.0/16 # OCIのVCN
pfs=yes
phase2alg=aes128-sha1
right=40.74.76.220 # Azure VPN GatewayのパブリックIP
rightid=40.74.76.220 # Azure VPN GatewayのパブリックIP
rightsubnets=192.168.0.0/16 # AzureのVNet
salifetime=3600s
type=tunnel
共有キー(PSK)
sudo vi /etc/ipsec.d/azure-ipsec.secrets
168.138.47.228 40.74.76.220 : PSK "共有キー"
サービスの起動&設定
sudo systemctl restart ipsec
sudo systemctl enable ipsec
ルーティング設定
仮想NICでのパケット転送許可 (自分のものでないパケットも送受信可能にする)
ルート表
パブリックサブネット
プライベートサブネット
セキュリティリスト
パブリックサブネット
プライベートサブネット
Azure
接続の作成
Docsの手順に従ってローカルネットワークゲートウェイ、およびVPN接続を作成します。接続するIPアドレスにOCI側に立てたOracle LinuxのパブリックIPアドレス、アドレス空間にOCIのVCNのネットワークを指定します。
接続を作成する際、共有キーを指定して、IKEv2であることを確認して作成します。
OCI
Oracle Linux
再起動
sudo shutdown -r now
libreswan
接続確認
sudo systemctl status ipsec
sudo ipsec status | grep established
このように出ればつながっています。
[opc@oci-libreswan ~]$ sudo ipsec status | grep established
000 #19: "conn2AzureRouteBasedGW/1x1":4500 STATE_PARENT_I3 (PARENT SA established); EVENT_SA_REPLACE in 9549s; newest ISAKMP; idle; import:admin initiate
000 #20: "conn2AzureRouteBasedGW/1x1":4500 STATE_V2_IPSEC_I (IPsec SA established); EVENT_SA_REPLACE in 2614s; newest IPSEC; eroute owner; isakmp#19; idle; import:admin initiate
[opc@oci-libreswan ~]$
Azure
接続確認
測定用VM
Azure、OCIそれぞれにOracle LinuxのVMを立てて、こちらの手順で計測環境をセットアップします。
考察
パフォーマンス
Windows Server RRASの場合と比べると、より高速になりました。
冗長構成
Azure VPN Gatewayをアクティブ/アクティブで構成して、libreswanから2本のトンネルを張ることができます。
/etc/ipsec.d/azure-ipsec.conf
conn conn2AzureRouteBasedGW
authby=secret
auto=start
dpdaction=restart
dpddelay=30
dpdtimeout=120
forceencaps=yes # not a must
ike=aes256-sha1;modp1024
ikelifetime=10800s
ikev2=yes
keyingtries=3
left=%defaultroute
leftid=168.138.47.228
leftsubnets=10.0.0.0/16
pfs=yes
phase2alg=aes128-sha1
right=40.74.76.220
rightid=40.74.76.220
rightsubnets=192.168.0.0/16
salifetime=3600s
type=tunnel
mark=10/0xffffffff # マルチコネクションの場合はこの設定が必要
vti-interface=vti01 # マルチコネクションの場合はこの設定が必要
vti-routing=yes # rightsubnetsへのルーティングをここで指示
conn conn2AzureRouteBasedGW2
authby=secret
auto=start
dpdaction=restart
dpddelay=30
dpdtimeout=120
forceencaps=yes # not a must
ike=aes256-sha1;modp1024
ikelifetime=10800s
ikev2=yes
keyingtries=3
left=%defaultroute
leftid=168.138.47.228
leftsubnets=10.0.0.0/16
pfs=yes
phase2alg=aes128-sha1
right=40.74.75.131 # Azure VPN Gatewayの2番目のパブリックIP
rightid=40.74.75.131 # Azure VPN Gatewayの2番目のパブリックIP
rightsubnets=192.168.0.0/16
salifetime=3600s
type=tunnel
mark=mark=15/0xffffffff # マルチコネクションの場合はこの設定が必要
vti-interface=vti02 # マルチコネクションの場合はこの設定が必要
vti-routing=yes # rightsubnetsへのルーティングをここで指示
アクティブ/アクティブでのパフォーマンス
- 1本計測
[azureuser@azure-linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[ 4] local 192.168.0.4 port 59450 connected to 10.0.1.2 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 81.8 MBytes 686 Mbits/sec 4 4.59 MBytes
[ 4] 1.00-2.00 sec 50.0 MBytes 419 Mbits/sec 2041 595 KBytes
[ 4] 2.00-3.00 sec 50.0 MBytes 419 Mbits/sec 0 650 KBytes
[ 4] 3.00-4.00 sec 57.5 MBytes 482 Mbits/sec 0 708 KBytes
[ 4] 4.00-5.00 sec 61.2 MBytes 514 Mbits/sec 0 769 KBytes
[ 4] 5.00-6.00 sec 57.5 MBytes 482 Mbits/sec 114 598 KBytes
[ 4] 6.00-7.00 sec 53.8 MBytes 451 Mbits/sec 0 670 KBytes
[ 4] 7.00-8.00 sec 56.2 MBytes 472 Mbits/sec 0 722 KBytes
[ 4] 8.00-9.00 sec 56.2 MBytes 472 Mbits/sec 104 538 KBytes
[ 4] 9.00-10.00 sec 48.8 MBytes 409 Mbits/sec 0 598 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 573 MBytes 481 Mbits/sec 2263 sender
[ 4] 0.00-10.00 sec 570 MBytes 478 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux ~]$
- 2本同時計測
[azureuser@azure-linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[ 4] local 192.168.0.4 port 59510 connected to 10.0.1.2 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 69.8 MBytes 585 Mbits/sec 2519 218 KBytes
[ 4] 1.00-2.00 sec 22.5 MBytes 189 Mbits/sec 43 240 KBytes
[ 4] 2.00-3.00 sec 23.8 MBytes 199 Mbits/sec 0 301 KBytes
[ 4] 3.00-4.00 sec 27.5 MBytes 231 Mbits/sec 0 360 KBytes
[ 4] 4.00-5.00 sec 28.8 MBytes 241 Mbits/sec 62 301 KBytes
[ 4] 5.00-6.00 sec 25.0 MBytes 210 Mbits/sec 81 253 KBytes
[ 4] 6.00-7.00 sec 23.8 MBytes 199 Mbits/sec 0 312 KBytes
[ 4] 7.00-8.00 sec 30.0 MBytes 252 Mbits/sec 0 373 KBytes
[ 4] 8.00-9.00 sec 26.2 MBytes 220 Mbits/sec 3 316 KBytes
[ 4] 9.00-10.00 sec 22.5 MBytes 189 Mbits/sec 54 194 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 300 MBytes 251 Mbits/sec 2762 sender
[ 4] 0.00-10.00 sec 297 MBytes 249 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux ~]$
[azureuser@azure-linux2 ~]$ iperf3 -c 10.0.1.3
Connecting to host 10.0.1.3, port 5201
[ 4] local 192.168.0.5 port 46782 connected to 10.0.1.3 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 32.6 MBytes 274 Mbits/sec 1813 356 KBytes
[ 4] 1.00-2.00 sec 25.0 MBytes 210 Mbits/sec 32 306 KBytes
[ 4] 2.00-3.00 sec 30.0 MBytes 252 Mbits/sec 0 368 KBytes
[ 4] 3.00-4.00 sec 35.0 MBytes 294 Mbits/sec 72 299 KBytes
[ 4] 4.00-5.00 sec 28.8 MBytes 241 Mbits/sec 0 360 KBytes
[ 4] 5.00-6.00 sec 26.2 MBytes 220 Mbits/sec 25 306 KBytes
[ 4] 6.00-7.00 sec 30.0 MBytes 252 Mbits/sec 0 368 KBytes
[ 4] 7.00-8.00 sec 31.2 MBytes 262 Mbits/sec 115 303 KBytes
[ 4] 8.00-9.00 sec 30.0 MBytes 252 Mbits/sec 0 365 KBytes
[ 4] 9.00-10.00 sec 25.0 MBytes 210 Mbits/sec 30 311 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 294 MBytes 247 Mbits/sec 2087 sender
[ 4] 0.00-10.00 sec 291 MBytes 244 Mbits/sec receiver
iperf Done.
[azureuser@azure-linux2 ~]$
アクティブ/アクティブでのバランシング
2本のリンクがUPしていますのでどのように使われるのか見てみました。
[opc@oci-libreswan ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 02:00:17:00:57:0f brd ff:ff:ff:ff:ff:ff
3: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: vti01@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8980 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 10.0.0.2 peer 40.74.91.220
5: vti02@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 8980 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ipip 10.0.0.2 peer 40.74.92.71
[opc@oci-libreswan ~]$
Azure VPN Gatewayからの送信については、何らかのアルゴリズムによりバランシングされるようです。
2本同時のiperf3
の計測において、libreswanの2つのインタフェースでtcpdump
を取り、特徴的な動きのパターンを掲載します。
- vti01
03:06:07.254269 IP 192.168.0.4.58832 > oci-linux1.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1: Flags [.], seq 37:7933, ack 1, win 229, options [nop,nop,TS val 2659158955 ecr 2681618163], length 7896
03:06:07.254275 IP 192.168.0.5.46970 > oci-linux2.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1: Flags [.], seq 44145257:44161049, ack 1, win 229, options [nop,nop,TS val 454877280 ecr 1412403442], length 15792
03:06:07.254276 IP 192.168.0.4.58832 > oci-linux1.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1: Flags [.], seq 7933:13197, ack 1, win 229, options [nop,nop,TS val 2659158956 ecr 2681618163], length 5264
03:06:07.255538 IP 192.168.0.5.46970 > oci-linux2.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1: Flags [.], seq 44161049:44192633, ack 1, win 229, options [nop,nop,TS val 454877280 ecr 1412403442], length 31584
- vti02
03:06:07.162764 IP 192.168.0.4.58830 > oci-linux1.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1: Flags [S], seq 1549509396, win 29200, options [mss 1360,sackOK,TS val 2659158864 ecr 0,nop,wscale 7], length 0
03:06:07.163126 IP oci-linux1.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1 > 192.168.0.4.58830: Flags [S.], seq 1293505894, ack 1549509397, win 62636, options [mss 8960,sackOK,TS val 2681618109 ecr 2659158864,nop,wscale 7], length 0
03:06:07.163362 IP oci-linux2.sub11220056511.vcnosaka.oraclevcn.com.targus-getdata1 > 192.168.0.5.46970: Flags [.], ack 36401914, win 24568, options [nop,nop,TS val 1412403362 ecr 454877185], length 0
- Azure VNet (192.168.0.0/16)からの送信
192.168.0.4
からのパケットがバランシングされています。ポート番号が違うことに注意です。
192.168.0.5
からのものはvti01のみに寄っていてvti02では見られません。
このように、同じホストでもセッションごとに都度振り分けられるようで、分散されることもあれば、同じ回線になることもありました。これはホストに依らないようです。
- OCI VCN (10.0.0.0/16)からの送信
Azure VNetへのパケットはルーティングテーブルで定義されているため、片寄せされます。ネットワークの情報は、/etc/ipsec.d/azure-ipsec.conf
で指定されたサブネットが反映されています。
[opc@oci-libreswan ~]$ ip route show
default via 10.0.0.1 dev ens3
10.0.0.0/24 dev ens3 proto kernel scope link src 10.0.0.2
10.0.0.1 dev ens3 scope link
169.254.0.0/16 dev ens3 proto static scope link
169.254.0.0/16 dev ens3 scope link metric 1002
192.168.0.0/16 dev vti02 scope link
[opc@oci-libreswan ~]$