第 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;
};