[ファームウェアリリース] SEIL/X,B1 ver.4.70 & SEIL/x86 ver.3.30

SEILの新ファームウェア SEIL/X,B1 Ver4.70, SEIL/x86 Ver3.30 をリリースしました。今回は、機能改善の一つであるIPパケットフィルタの処理の効率化について、改善内容と効果について紹介します。

記事一覧

リリースの詳細はリリースノートをご覧ください。

これまでのIPパケットフィルタの評価方法による問題

一般的に、IPパケットフィルタの評価(パケットとフィルタルールのマッチング)は、ルール数に応じて処理時間が増加するという構造になりがちです。これは、例えば100のフィルタルールが設定されていると、1つのパケットを受信した際に最悪100回ルールとの比較が必要になる可能性があることによります。

この方法で全てのパケットをルール比較していると大変効率が悪いため、SEILはステート機能及びキャッシュ機能によって効率化を図っています。

ステート機能は、一度パスとして評価されたパケットの、インタフェース、送信先、プロトコル等をステートとして記憶し、次回到達したパケットがステートに一致する場合には、フィルタルールと比較することなくパスするという機能です。これにより、同一の対向機器・サービス間の通信は高速に処理できます。

キャッシュ機能は、ステートとは別に、インタフェース、送信先、送信元、プロトコル、ポート番号等をキーとして、パス/ブロックの結果を一時的に保持(キャッシュ)します。パケットを受信すると、保持しているキャッシュと一致する場合にはこの時点でパスまたはブロックします。ブロック時もキャッシュを保持することで、パス時の結果のみ保持するステート機能に比べてDDoS攻撃のような通信に対してもパフォーマンスに影響を与えず機能します。

しかし、非常に多くのIPアドレスやポート番号を送信元や送信先とする通信をIPパケットフィルタで制御する場合、ステートやキャッシュに一致しないケースが多くなり、フィルタルールとの比較が発生し効率が低下します。

新しいIPパケットフィルタの評価方法

根本的な高速化を行うためには、ステートやキャッシュに一致しない場合の、フィルタルールとのマッチングそのものを高速化する必要があります。

今回の高速化では、フィルタルールのリストを次のような方法で分割し、パケットと比較すべきフィルタルールを減らす最適化を行いました。

  1. プロトコルやアドレス、ポートの値について、ある条件値を決める
  2. 各フィルタルールを、その条件値に一致する可能性の有無で2つのグループに振り分ける。その際、どちらとも判別できないルールは両方のグループに振り分ける
  3. 振り分けたグループについて、更に 1)~2) を繰り返す
  4. グループあたりのフィルタルール数がある程度まで減ったら振り分け完了

このような処理を追加し、マッチする可能性があるフィルタルールのグループとだけ比較することで、ロスが最低限に抑えられます。

実際の転送性能に与える影響

今回の最適化が実際の転送性能に与える影響について、測定器を用いて確認しました。送信元IPアドレスを変更することで、IPパケットフィルタを通過するパケットのClient 数が増えた状況を疑似的に再現しています。

Client 数が少ない間は、変更前後で転送性能の差はありません。Client 数が増えキャッシュやステートに一致しないケースが増えると、変更前(最適化前)はフィルタルールとのマッチングによるロスの影響が大きくなりますが、変更後(最適化後)は転送性能への影響がほとんど見られません。