日本国内からの接続に限定する場合のipset+iptablesとnftablesの性能比較

isdはじめに

ひとつ前の記事で、nftablesを使用してSSHを日本国内からの接続に限定する設定手順をまとめました。

このとき、
「nftablesのルールセットの行数が増えてしまい、パケットフィルタ―処理が遅くならないだろうか?」
という懸念事項がありました。

この記事では、簡単なベンチマークテストを実施し、パケットフィルタ―で「日本国内からの接続に限定する」設定を行ったときに、ipset + iptables と nftables で性能面で違いがないことを確認します。
ついでに、パケットフィルタ―を使わない場合との比較も行います。

isdテスト条件

「シンプルに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です。

isdテスト結果

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個)を登録しても、レスポンス性能が落ちることはない、といってよさそうです。

isdまとめ

パケットフィルタ―で「日本国内からの接続に限定する」設定を行ったサーバーに対して、Apache ab コマンドによる簡単なベンチマークテストを実施し、ipset + iptables と nftables で性能面でほとんど違いがないことを確認しました。
パケットフィルタ―を使わない場合との違いもほとんどありませんでした。

もともと、その実装方法から「iptables より性能がよい」と言われている nftables ですが、これで、安心して使用できます。
 

(関連記事)
・nftablesでSSHを日本国内からの接続に限定する (CentOS 8)
https://inaba-serverdesign.jp/blog/20191219/nftables-country-ipaddress-centos8.html
 

Follow me!