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"