外部記憶装置

脳みそ小さすぎるからメモしとく

R86S レビュー(pfSense 編 その3 IPSec VPN)

R86S レビューシリーズ

前回までのあらすじと今回の内容

前回、Firewall と NAT について速度計測を行った。 今回は、pfSense に付属している IPSec VPN サーバーを試してみる。

IPSec VPN

IPSec は、VPNに用いられるプロトコルであり、トンネリング及び認証・暗号化を提供するプロトコルである。

pfSense での設定

公式に Site-to-Site な IPSec VPN の設定手順が掲載されているため、これに従って設定する。

docs.netgate.com

想定するネットワーク

前回までのネットワークを利用する。192.168.14.128/25 を IPSec で接続するLANとし、 WAN 側のIPアドレスとして、R86S は 192.168.14.1/25、IPSec で接続する負荷生成マシンのWAN側を 192.168.14.2/25 とする。負荷生成マシンの LAN のアドレスは 192.168.15.1/24 とする。

下準備

前回、NATの設定をしていたが今回は利用しないため、設定を初期状態に戻しておく。

Phase 1 の設定

初期状態では何も設定されていないため、"Add P1" から設定を追加する。

Remote Gateway にトンネルの対向である負荷生成マシンのWAN側IPアドレス(192.168.14.2)を指定する。 AESについては、"256bits"を指定するようにマニュアルに記載されているため、その通りに指定する。Pre-Shared Key については "Generate new Pre-Shared Key" から自動で生成することが出来る。

Phase 2 の設定

Phase 2 の設定を行う。追加した Phase 1 の設定から、"Add P2" を選択する。

"Local Network" は IPSec で接続するローカル側のネットワークを指定する。 ここでは、OPT1 のサブネットを接続するため、"OPT1 subnet" を選択している。 "Remote Network" では、負荷生成マシン側のLANアドレス(192.168.15.0/24)を指定する。

"Encryption Algorithms" は、マニュアルの指示に従い、"AES256-GCM" を key length "128bits" のみ指定する。

設定内容を変更するために、"Apply Changes" を選択する。

Firewall の設定

IPSec 用の Firewall を設定しておく。ここでは、IPSec で接続するネットワークについて、双方向に通信を許可する設定をしている。

Ubuntu での IPSec 設定(strongswan)

strongswan を用いて IPSec 接続を行う。IPv4フォワーディングを許可する設定を行っておく。

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1 (コメントアウトを外す)
$ sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1

IPSec の接続情報を追加する。left が自身、right が接続先である。

$ sudo apt install strongswan
$ sudo vim /etc/ipsec.conf
conn pfsense-ipsec
        type=tunnel
        keyexchange=ikev2
        left=192.168.14.2
        leftsubnet=192.168.15.0/24
        leftid=192.168.14.2
        leftauth=psk
        right=192.168.14.1
        rightsubnet=192.168.14.128/25
        rightid=192.168.14.1
        rightauth=psk
        ike=aes256-sha256-modp2048
        esp=aes256gcm16-modp2048
        ikelifetime=31680s
        lifetime=31680s
        auto=start
$ sudo vim /etc/ipsec.secrets
192.168.14.2 192.168.14.1 : PSK "a3ee7ee313ef23bdb3bc4578ede0d618ea549626bab6109d48c72b54"
$ sudo ipsec restart
$ sudo ip a add 192.168.15.1/32 dev lo

接続の確認

設定が正常に反映されていれば、pfSense 側では以下のような表示になる。

Ubuntu 側でも以下のように接続が確立していることを確認できる。

$ sudo ipsec status
Security Associations (1 up, 0 connecting):
pfsense-ipsec[1]: ESTABLISHED 5 minutes ago, 192.168.14.2[192.168.14.2]...192.168.14.1[192.168.14.1]
pfsense-ipsec{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: ca1fb313_i c4bacbd3_o
pfsense-ipsec{1}:   192.168.15.0/24 === 192.168.14.128/25

XFRM に、対応するポリシが追加されていることも確認できる。

$ sudo ip xfrm policy
src 192.168.15.0/24 dst 192.168.14.128/25
        dir out priority 374911
        tmpl src 192.168.14.2 dst 192.168.14.1
                proto esp spi 0xc4bacbd3 reqid 1 mode tunnel
src 192.168.14.128/25 dst 192.168.15.0/24
        dir fwd priority 374911
        tmpl src 192.168.14.1 dst 192.168.14.2
                proto esp reqid 1 mode tunnel
src 192.168.14.128/25 dst 192.168.15.0/24
        dir in priority 374911
        tmpl src 192.168.14.1 dst 192.168.14.2
                proto esp reqid 1 mode tunnel
...

iperf3 での速度計測

iperf3 を用いて IPSec を通したマシン間の通信スループットを計測した。

負荷生成マシンへの経路の追加

負荷生成マシン(192.168.14.130/25)へ IPSec を通す経路を追加しておく。

$ sudo ip route add 192.168.15.0/24 via 192.168.14.129

IPSec で接続されたマシン(192.168.15.1)への疎通が取れることを確認する。

$ ping 192.168.15.1
PING 192.168.15.1 (192.168.15.1) 56(84) bytes of data.
64 bytes from 192.168.15.1: icmp_seq=1 ttl=63 time=0.822 ms
64 bytes from 192.168.15.1: icmp_seq=2 ttl=63 time=0.924 ms
64 bytes from 192.168.15.1: icmp_seq=3 ttl=63 time=0.765 ms

計測結果(AES-NI なし)

デフォルト設定では、Intel CPU の AES 演算支援機構である AES-NI が無効化されている。 まず、その状態で計測を行った。

双方向同時に計測し、最大で 170 Mbps 前後であった。 前回の NAT での計測に比べてかなり速度が低下していることが分かる。

CPU 使用率については、NAT時と同様に1コアを使い切っている。

計測結果(AES-NI あり)

"System" -> "Advanced" -> "Miscellaneous" -> "Cryptographic & Thermal Hardware" から AES-NI を有効化する。ここでは、 "AES-NI and BSD Crypto Device (aesni, cryptodev)" を選択した。

AES と SHA についてハードウェアアクセラレーションが有効になっていることが分かる。

計測した結果、双方向合計で最大 2.3 Gbps 程度は出ていることが分かる。 forward と reverse で偏りがあるが、個別に計測した場合はどちらも 2Gbps 程度は出ていたため、なにかしらの影響によりこのような結果となっていると考えられる。

CPU使用率は AES-NI が無効な場合と比べて若干減少し、内訳も割り込み("interrupt")が中心となった。

まとめ

pfSense の IPSec サーバー機能を試してみた。 性能計測の結果より、MTU1500 な環境ではスループットは1Gbpsにも届いていない。 そのため、10Gbps な環境におけるトンネリング用デバイスとして利用するには厳しいが、 一般家庭の10G回線用に利用する分には十分に思う。

参考文献