2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AzureとOCIをS2S VPNでつないでみた (libreswan)

Last updated at Posted at 2020-11-21

AzureとOCIを接続するために、Azureのサイト間(S2S) VPNと、OCI上に立てたOracle Linuxのlibreswanを使ってみました。

構成図

Diagram.png

パフォーマンス

[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をウイザードで作成します。
VCN1.PNG

Oracle Linux

Oracle Linuxで作成します。デフォルトのシェイプを選択します。
OCI-VM1.PNG
ネットワークはパブリックサブネットに接続します。

カーネルパラメータ設定

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でのパケット転送許可 (自分のものでないパケットも送受信可能にする)

OCI-VM2.PNG

ルート表

パブリックサブネット

OCI-Route1.PNG

プライベートサブネット

OCI-Route2.PNG

セキュリティリスト

パブリックサブネット

OCI-Ingress1.PNG

プライベートサブネット

OCI-Ingress2.PNG

Azure

接続の作成

Docsの手順に従ってローカルネットワークゲートウェイ、およびVPN接続を作成します。接続するIPアドレスにOCI側に立てたOracle LinuxのパブリックIPアドレス、アドレス空間にOCIのVCNのネットワークを指定します。
接続を作成する際、共有キーを指定して、IKEv2であることを確認して作成します。
Azure-Connect1.PNG

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

接続確認

ステータスのアップデートに少し時間がかかります。
Azure-Connect2.PNG

測定用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 ~]$
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?