ipsetで大量のBlock指定を行うブログipsetで大量のBlock指定を行うお客様が運用しているWebサーバー(国内向けECサイト)に海外からのアクセスが大量にあり高負荷になって困っているということで、フィルタリング設定のお手伝いをしました。Webサーバーならapacheやnginxでdeny設定をしてもいいのですが、今回はかなり多くのネットワークアドレスをブロック対象とする必要がありました。不要な通信はできるだけ手前で落とした方がいいので、Kernelのnetfilter(iptablesとかfirewalld)で落すようにしました。netfilterを使う場合、iptablesやfirewalldでブロック対象のエントリを個別に登録することもできますが、netfilterに大量のエントリ登録をすると再起動時にエントリの追加/削除に時間がかかったり、通信のフィルタリングのマッチングがリスト検索になるので通信性能が落ちてしまいます(図1の左側)。ipsetを使わなった場合と使った場合そこでこのような場合にはipsetを使います。ipsetでは、ipアドレスやネットワークアドレスをまとめてテーブルに登録しておき、netfilterのマッチングの条件として指定することができます。ipsetではエントリ数が多くてもエントリの追加、削除は高速に行われるのと、マッチングはハッシュ検索(typeによる)で行われるので、通信性能も劣化しません(図1の右側)。ipsetには操作用にipsetコマンドがありますが、ipsetはfirewalldに統合されておりfirewall-cmdから操作可能です。今回はお客様の環境に合わせてCentOS7のfirewalld環境でipsetを設定する例を示しますが、CentOS6のようなiptables環境でもipsetは使用できます。firewalld環境でipsetの設定をしていくそれでは、firewalld環境でipsetを設定していく例です。ipsetを最初に設定する時は大まかに以下のような手順になります。ipsetにブロック対象のアドレスを登録まずはブロック対象のアドレスを登録するipsetを作成します。ここではblocklistという名前で作成します。--permanentblocklist次にblocklistにマッチするアクセス元の通信をdropゾーンに割り当てます。これでblocklistにマッチするアクセス元からの通信をブロックする設定となりました。あとはblocklistにブロック対象のIPアドレスを登録していきます。--permanent10.0.0.0/24これまでの設定はpermanentに対するものなので、動作中の設定には反映されていません。firewalldをreloadして実際に設定を有効にします。これで、10.0.0.0/24からの通信を無視するようになります。10.0.0.0/24余談ですが、動作中のipsetの設定ならipsetコマンドでも確認できます。firewall-cmdより引数がシンプルなので、個人的にはこちらが好みです。1Members:10.0.0.0/24あとはブロック対象のアドレスをipsetに追加していけばいいだけなのですが、ひとつひとつ--add-entryするのは現実的ではないので、最後に設定ファイルから一括更新する手順を説明します。設定ファイルの場所を確認します。--permanent/etc/firewalld/ipsets/blocklist.xmlblocklist.xml設定ファイルの中身です。firewalld.serviceで反映させることができます。今回はブロックの設定でしたが、特定のIPリストからのみsshを許可するといったような使い方もできます。ipsetに適切な名前をつけておけば管理もしやすいので、複数のアドレスに対してREJECT,ACCEPT設定したいような場合は、対象アドレスが少ない場合でも最初からipsetで設定しておくと後々便利です。最後にnetfilterで個別にエントリ登録してフィルタリングした場合とipsetを使ってフィルタリングした場合に、実際にどの程度通信速度に影響がでるかを見てみます。ms自ホストにpingをしただけですが、フィルタリング設定がない初期状態では平均0.043msです。msこちらは、netfilterに2800エントリのフィルタリング設定を行った時(図1左側)の結果です。Echoの一往復で0.1ms程度遅くなっています。msipset内に2800エントリを登録してフィルタリング設定を行った時(図1右側)の結果です。平均0.047msで(1)とほぼ同じ時間です。(2)のように通信速度が劣化していないのがわかります。firewalld環境なら今回の例のようにipsetの設定も簡単にできるので、性能的にも保守性を考えても積極的に使っていくのがいいと思います。(1)技術的な情報は以下にもあります。