• 検索結果がありません。

第 3 章 レイヤ 7 NIDS/NIPS のための TCP ストリーム再構成機構 22

3.4 実装

struct con_info *connect_info;

/* 次のパケットの予測値 */

struct expect_value s_exp_val;

struct expect_value c_exp_val;

/* パケットのコピー */

struct stored_data *s_data;

struct stored_data *c_data;

/* どちらから FIN パケットを受け取ったか */

int fin_state;

/* センサの状態 */

sensor_info_t *sensor_info;

};

コネクション管理情報の破棄は,サーバ・クライアント両方からFINパケット を受け取ったときに行うので,FINパケットを受け取ったということを記憶して おく必要がある.また,センサの状態をコネクションごとに保持しておく必要が ある場合,sensor infoに保持する.

コネクション識別情報connect infoは,どのコネクションかを識別できる情 報を持つ.具体的には,第3.3.4節で述べたように,サーバ・クライアント双方の IPアドレスとポート番号,およびプロトコル番号の5つである.con info構造 体は次のようになっている.

struct con_info { __u32 saddr;

__u32 daddr;

__u16 sport;

__u16 dport;

__u8 proto;

};

connection 構 造 体 の 要 素 の う ち ,パ ケット の 順 序 に 関 す る も の は expect value 構造体と stroed data 構造体である.これらの構造体の 定義は以下の通りである.

struct expect_value { __u32 seq_num;

__u16 id;

__u16 offset;

};

struct stored_data {

struct expect_value my_val;

struct expect_value next_val;

unsigned char *data;

struct stored_data *next;

};

expect value構造体は,シーケンス番号,識別子,フラグメント・オフセッ トの3つの要素からなる.s exp value,c exp valueには,それぞれサーバ,

クライアントからの次のパケットの予測値を保持する.この予測値どおりのパケッ トが到着したら,順番どおりのパケットが来たことを意味する.この場合,その パケットをセンサに渡して検査し,ACCEPTが返されたら次の予測値を第3.3.3節,

第3.3.5節で示した式を用いて求め,値を更新する.

stored data構造体は,順番どおりでないパケットをコピーして記憶してお くためのリスト構造である.サーバ,クライアントから来た順番通りでないパケッ トは,それぞれs dataとc dataを先頭とするリストに記憶しておく.

IPフラグメントの考慮

IPフラグメントを考慮したコネクション管理,パケットの順序管理についても 前節に類似した情報を保持する.IPレベルではコネクションという概念はないが,

ここでは便宜的にホストのペア毎にコネクション情報を作成し,IPフラグメント されたパケットの管理を行う.IPレベルでのコネクション管理のための構造体は,

以下の通りである.

struct ip_connection {

/* IPレベル コネクション識別情報 */

struct ip_con_info *connect_info;

/* 次のパケットの予測値 */

struct ip_expect_value s_exp_val;

struct ip_expect_value c_exp_val;

/* パケットのコピー */

struct stored_data *s_data;

struct stored_data *c_data;

};

struct ip_con_info { __u32 saddr;

__u32 daddr;

__u8 proto;

};

struct ip_expect_value { __u16 id;

__u16 offset;

};