日本国内からの接続に限定する場合のipset+iptablesとnftablesの性能比較
はじめに
ひとつ前の記事で、nftablesを使用してSSHを日本国内からの接続に限定する設定手順をまとめました。
このとき、
「nftablesのルールセットの行数が増えてしまい、パケットフィルタ―処理が遅くならないだろうか?」
という懸念事項がありました。
この記事では、簡単なベンチマークテストを実施し、パケットフィルタ―で「日本国内からの接続に限定する」設定を行ったときに、ipset + iptables と nftables で性能面で違いがないことを確認します。
ついでに、パケットフィルタ―を使わない場合との比較も行います。
テスト条件
「シンプルにWebレスポンスを確認」ということで、CentOS 8 上に Apache による Webサーバーを構築し、
- パケットフィルタ―なし
- ipset + iptables
- nftables
のそれぞれの場合に対して、Apache ab コマンドを使用して、ベンチマークテストを行いました。
サーバー構成
サーバーと、負荷をかけるクライアントは、AWS東京リージョンの同じサブネット内にEC2で構築しました。
このような構成にしたのは、サーバーに外部からアクセスしつつ、ネットワーク遅延の影響をできるだけ小さくするためです。
それぞれのスペックは次のとおりです。
- サーバー
- OS: CentOS 8 (Frontline提供のAMI)
- インスタンスタイプ: t2.micro (1CPU, 1GB)
- IPアドレス: 10.0.0.20
- 負荷をかけるクライアント
- OS: Amazon Linux 2
- インスタンスタイプ: t2.micro (1CPU, 1GB)
- IPアドレス: 10.0.0.15
ネットワーク構成のイメージは以下。
サーバーの ipset + iptables と nftables のルールは同等とします。
CentOS 8 ですので、どちらの場合も、パケットフィルタ―のバックエンドは nftables となります。
ipset + iptables の設定
以下の手順を参考に設定しました。
・ipsetとiptablesでSSHを日本国内からの接続に限定する (CentOS 7)
https://inaba-serverdesign.jp/blog/20150209/ipset_iptables_country_centos7.html
HTTP(TCP/80), HTTPS(TCP/443), SSH(TCP/22)は、ipset のセット WHITELIST で設定した日本国内のIPアドレスからの接続に限定しました。
また ipset のセット WHITELIST には、今回のクライアントからアクセスできるよう、10.0.0.0/24 を追加しました。
iptables のルールは次のとおり。
# cat /etc/sysconfig/iptables *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -m set --match-set WHITELIST src -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -m set --match-set WHITELIST src -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m set --match-set WHITELIST src -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT COMMIT
ipset のセット WHITELIST の内容は次のとおり。
登録したIPアドレス範囲は 2,860 です。
# ipset list WHITELIST | less Name: WHITELIST Type: hash:net Revision: 6 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 71416 References: 3 Number of entries: 2860 Members: 116.92.132.0/24 27.0.32.0/20 ...
nftables の設定
以下の手順を参考に設定しました。
・nftablesでSSHを日本国内からの接続に限定する (CentOS 8)
https://inaba-serverdesign.jp/blog/20191219/nftables-country-ipaddress-centos8.html
HTTP(TCP/80), HTTPS(TCP/443), SSH(TCP/22)は、名前付きセット country_accept を参照し、日本国内のIPアドレスからの接続に限定しました。
IPアドレスリストには、先ほどの ipset と同様に、今回のクライアントからアクセスできるよう、10.0.0.0/24 を追加しました。
nftables のルールセットは次のとおり。
# nft list ruleset table ip filter { set country_accept { type ipv4_addr flags interval elements = { 1.0.16.0/20, 1.0.64.0/18, 1.1.64.0/18, 1.5.0.0/16, ... 223.252.64.0/19, 223.252.112.0/20 } } chain INPUT { type filter hook input priority 0; policy drop; iifname "lo" counter packets 0 bytes 0 accept ct state established,related counter packets 39 bytes 2904 accept ct state new tcp dport http ip saddr @country_accept counter packets 0 bytes 0 accept ct state new tcp dport https ip saddr @country_accept counter packets 0 bytes 0 accept ct state new tcp dport ssh ip saddr @country_accept counter packets 0 bytes 0 accept icmp type echo-reply counter packets 0 bytes 0 accept icmp type destination-unreachable counter packets 0 bytes 0 accept icmp type time-exceeded counter packets 0 bytes 0 accept } chain FORWARD { type filter hook forward priority 0; policy drop; } chain OUTPUT { type filter hook output priority 0; policy accept; } }
ルールセットの行数は、1,456 です。
# nft list ruleset | wc -l 1456
Apache の設定
Apacheは、CentOS 8 リポジトリの Apache 2.4をインストールしました。
設定はほぼデフォルトで、event MPM を使用しましたが、event MPM のパラメータは以下のように明記しました。
<IfModule mpm_event_module> AsyncRequestWorkerFactor 2 StartServers 2 MinSpareThreads 512 MaxSpareThreads 512 ThreadLimit 256 ThreadsPerChild 256 MaxRequestWorkers 1024 MaxConnectionsPerChild 0 </IfModule>
Apache起動時のプロセス数は2、1プロセスでプロセスあたりのワーカースレッド数は最大256です。
テスト結果
Apache ab コマンドで、リクエスト総数10万、同時接続10, 100, 250の3パターンでテストしました。
ab コマンドは、同じ対象のテストを連続で実行しないよう、以下の順で3回ずつ実行しました。
パケットフィルタ―なし
→ ipset + iptables
→ nftables
→ パケットフィルタ―なし
→ ipset + iptables
→ nftables
→ パケットフィルタ―なし
→ ipset + iptables
→ nftables
また、Apache プロセスの状態に違いがないよう、それぞれの ab コマンド実行前に、Apache を再起動しました。
同時接続10
# ab -n 100000 -c 10 http://10.0.0.20/test.html
「Requests per second: ~ [#/sec] (mean)」の数値。
パケットフィルタ― | 1回目 | 2回目 | 3回目 |
なし | 3729.74 | 3216.70 | 3224.64 |
ipset + iptables | 3166.74 | 2974.25 | 2989.03 |
nftables | 3225.78 | 3285.43 | 3701.73 |
同時接続100
# ab -n 100000 -c 100 http://10.0.0.20/test.html
「Requests per second: ~ [#/sec] (mean)」の数値。
パケットフィルタ― | 1回目 | 2回目 | 3回目 |
なし | 3497.99 | 3621.77 | 3862.00 |
ipset + iptables | 3689.66 | 3925.37 | 3889.55 |
nftables | 3571.61 | 3795.59 | 3683.33 |
同時接続250
# ab -n 100000 -c 250 http://10.0.0.20/test.html
「Requests per second: ~ [#/sec] (mean)」の数値。
パケットフィルタ― | 1回目 | 2回目 | 3回目 |
なし | 3876.26 | 3559.65 | 3540.15 |
ipset + iptables | 3224.77 | 3373.77 | 3469.18 |
nftables | 3612.48 | 3692.96 | 3794.48 |
考察
平均秒間リクエスト数を表す「Requests per second:」の値では、パケットフィルタ―なし、ipset + iptables, nftables で大きな違いは見られませんでした。
しいていえば、ipset + iptables は、同時接続10と250のときに、他の2つより少し数値が落ちました。
それでも、同時接続100のときは同じぐらいの数値(というかむしろよい数値)となりました。
なんだかよくわかりませんが、同じパケットフィルタ―でも数値が増減しているので、誤差の範囲といってよさそうです。
パケットフィルタ―なしと比べても大きな差はないので、今回のように nftables で名前付きセットを使って多くのIPアドレス(2,860個)を登録しても、レスポンス性能が落ちることはない、といってよさそうです。
まとめ
パケットフィルタ―で「日本国内からの接続に限定する」設定を行ったサーバーに対して、Apache ab コマンドによる簡単なベンチマークテストを実施し、ipset + iptables と nftables で性能面でほとんど違いがないことを確認しました。
パケットフィルタ―を使わない場合との違いもほとんどありませんでした。
もともと、その実装方法から「iptables より性能がよい」と言われている nftables ですが、これで、安心して使用できます。
(関連記事)
・nftablesでSSHを日本国内からの接続に限定する (CentOS 8)
https://inaba-serverdesign.jp/blog/20191219/nftables-country-ipaddress-centos8.html