ER-XのIPsecスループット

ER-XのIPsecのスループットを測定してみました。L2TP/IPsecでは揮わなかったER-Xですが、L2TPの処理を外すとどの程度スループットが出るのでしょうか。直結での計測なので実際の利用時のスピードを測るものではなく、ルーターの性能評価を行うものです。

計測環境

ER-XとDebian9をIPsecで接続し、それぞれにぶら下げたCentOS7 Aをiperf3クライアント、CentOS7 Bをiperf3サーバーとして、スループットの測定を行います。ER-Xのファームウェアはv1.10.9となります。

計測結果

トンネルのMTUを1438とし、CentOS Aでiperf3の実行した結果が以下となります。消費電力はTAP-TST10での目測値で無負荷時は2.6Wとなります。先ずはoffloadなしで行ってみます。

hwnat=disable
ipsec=disable
receiver sender
暗号化 Mbps CPU 消費電力 Mbps CPU 消費電力
AES128-SHA1 39.6 35% 3.2W 39.7 37% 3.2W
AES256-SHA1 35.2 34% 3.2W 37.2 34% 3.3W
AES128-SHA256 32.7 34% 3.2W 30.5 27% 3.2W
AES256-SHA256 30.0 33% 3.2W 31.6 33% 3.2W

まあハードウェア支援がなければこんなものでしょう。では本命のipsec=enableで再度計測します(hwnatも影響はあまりないと思いますがenableにしています)。

hwnat=enable
ipsec=enable
receiver sender
暗号化 Mbps CPU 消費電力 Mbps CPU 消費電力
AES128-SHA1 115 47% 3.4W 220 49% 3.7W
AES256-SHA1 122 36% 3.3W 185 63% 3.7W
AES128-SHA256 121 38% 3.3W 221 68% 3.7W
AES256-SHA256 122 39% 3.3W 185 64% 3.5W

ipsecのoffloadで結果はかなり改善しました。が、色々と不満が出る結果です。先ず上記計測は60秒間のiperf3の結果ですが、計測の度に結果が大きく変動してしまいます。例えば、AES128-SHA1のsenderの結果は、280Mbpsが出たり、160Mbpsしか出なかったりとかなり変動があり、複数回実行して変動があった場合には中央値を最終結果としています。

次に、receiver(CentOS7 B→CentOS7 A)のスループットがsenderよりも悪い点が違和感があります。receiveの通信ではipsecの暗号化は十分に性能に余裕のあるDebian9で、複合化はER-Xで行われますので、上記結果が意味するところは、ER-Xのipsecの暗号化のスピードは速いが、複合化は遅いということとなります。そんなことがあるんでしょうか?

何か設定や計測方法がおかしい可能性もあるので、本件は時間があるとき別途調査したいと思います。

まあ、色々と設定を見直す余地がひょっとしたらあるのかもしれませんが、安定性が改善したとしても、結果がIX2105に劣り、RTX810並みであるので、性能的な観点で言えばあえてER-XでIPsecをやる意味はあまりないかと思います。

ER-XのConfig

テストに使ったER-Xのconfigは以下の通りです。Basic Setup後に、ipsecの設定を追加した差分のみ記載しています。IKEはIKEv2の接続としており、ipsec絡みのfirewallやNATの設定は面倒なので

set vpn ipsec auto-firewall-nat-exclude enable

の自動設定にしちゃっています(EdgeRouterの便利な機能です)。erx.example.comはER-Xのeth0、debian.example.comはDebian9のeth0アドレスを検証環境のDNSに登録しています。

set system offload hwnat enable
set system offload ipsec enable
set vpn ipsec auto-firewall-nat-exclude enable
set vpn ipsec esp-group FOO0 compression disable
set vpn ipsec esp-group FOO0 lifetime 3600
set vpn ipsec esp-group FOO0 mode tunnel
set vpn ipsec esp-group FOO0 pfs enable
set vpn ipsec esp-group FOO0 proposal 1 encryption aes128
set vpn ipsec esp-group FOO0 proposal 1 hash sha1
set vpn ipsec esp-group FOO0 proposal 2 encryption aes256
set vpn ipsec esp-group FOO0 proposal 2 hash sha1
set vpn ipsec esp-group FOO0 proposal 3 encryption aes128
set vpn ipsec esp-group FOO0 proposal 3 hash sha256
set vpn ipsec esp-group FOO0 proposal 4 encryption aes256
set vpn ipsec esp-group FOO0 proposal 4 hash sha256
set vpn ipsec ike-group FOO0 ikev2-reauth no
set vpn ipsec ike-group FOO0 key-exchange ikev2
set vpn ipsec ike-group FOO0 lifetime 28800
set vpn ipsec ike-group FOO0 proposal 1 dh-group 2
set vpn ipsec ike-group FOO0 proposal 1 encryption aes128
set vpn ipsec ike-group FOO0 proposal 1 hash sha1
set vpn ipsec site-to-site peer debian.example.com authentication id erx.example.com
set vpn ipsec site-to-site peer debian.example.com authentication mode pre-shared-secret
set vpn ipsec site-to-site peer debian.example.com authentication pre-shared-secret presharedkey
set vpn ipsec site-to-site peer debian.example.com authentication remote-id debian.example.com
set vpn ipsec site-to-site peer debian.example.com connection-type initiate
set vpn ipsec site-to-site peer debian.example.com ike-group FOO0
set vpn ipsec site-to-site peer debian.example.com ikev2-reauth inherit
set vpn ipsec site-to-site peer debian.example.com local-address any
set vpn ipsec site-to-site peer debian.example.com tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer debian.example.com tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer debian.example.com tunnel 1 esp-group FOO0
set vpn ipsec site-to-site peer debian.example.com tunnel 1 local prefix 192.168.100.0/24
set vpn ipsec site-to-site peer debian.example.com tunnel 1 remote prefix 192.168.200.0/24

なお、IPsecのトンネルのMTUは1438なので、MSS Clampingが必要となりますが、EdgeRouter側でトンネルに対してだけMSS Clampingを入れる方法がわからなかったので、EdgeRouterには入れていません。他人の設定等を見ると、eth1側にまるっと入れている例もありますが、個人的にはこれは好きじゃないです(IPsec通信以外のインターネット通信等もすべてMSS Clampingがかかってしまってスループットが悪化するので)。

VTIやGre over IPsecならばトンネルインタフェースに対してfirewall modifyでMSS Clampingが指定できるのですが、今回のテストの設定のようなpolicy based ipsec(インタフェースの作成をせず、policyにマッチしたパケットをipsecする)の場合には簡単に設定できる機能が見当たりませんでした。iptablesを直接操作すれば可能と思われますがちょっと面倒です。

代わりに、iperf3のスループット測定において

iperf3 -c 192.168.200.2 -M 1398

とMSSを1398に指定することでお茶を濁しています。

VTIの設定が出来ればこれが一番使い勝手がいいのですが、local-addressを固定IPで指定する必要があり利用に制約があります。Linuxならばスクリプト書いてlocal-addressに動的IPを割り当てVTIすることは簡単なんですけどね・・・。

Debian9の設定

IPsecにはstrongSwan 5.5.1を使いました。テストでは暗号化の方法を変えてテストしていますが、ER-X側のconfigは固定にし、strongSwan側のespの設定は以下の4パターンで変えながらテストを行っています。

  • esp=aes128-sha1!
  • esp=aes256-sha1!
  • esp=aes128-sha256!
  • esp=aes256-sha256!
IPsec関連(strongSwan)
# cat /etc/ipsec.conf

conn erx
        left=%defaultroute
        leftid=debian.example.com
        right=erx.example.com
        rightid=erx.example.com
        leftsubnet=192.168.200.0/24
        rightsubnet=192.168.100.0/24
        keyexchange=ike
        authby=secret
        type=tunnel
        ike=aes128-sha1-modp1024!
        esp=aes128-sha1!
        reauth=no
        auto=start
        keyingtries=%forever

# cat /etc/ipsec.secrets

: PSK "presharedkey"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です