- 论坛徽章:
- 0
|
我现在要在freebsd下写一个类似ipfw的项目,要实现对TCP连接的状态跟踪,同时对包过滤规则要实现高速的匹配,可是我在freebsd自身的ipfw.c 代码却感觉他写的很乱 (我可能没有看明白),不明白他究竟是怎么实现的,高手能不能指点我一下,iptable下对TCP定义了四种连接状态,我定义了七种,不知道是否合理,大伙儿可不可以帮我分析一下:
主要设计如下几种规则:
[add | delete] rule [allow | deny] [ip | tcp | udp | icmp] from [src IP] to [dst IP]
发起连接端的TCP状态流程可以如下来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
接收端的TCP状态流程可以如下表示:
CLOSED->LISTEN->SYN&ACK->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
TCP连接有着更为细节的东西,在我的TCP状态跟踪模块中不考虑同时打开,同时关闭的状态变化。在努力考虑后,我定义了如下几种状态跟踪:
#define TCP_ESTABLISHED 1
#define TCP_SYS_SENT 2
#define TCP_SYS_RECV 3
#define TCP_FIN_WAIT 4
#define TCP_LAST_ACK 5
#define TCP_CLOSE 6
#define TCP_CLOSE_WAIT 7
可以这样来说明:
发起TCP连接端 mytcp_State TCP接收端
-------------------> SYN
TCP_SYN_SENT
SYN,ACK <-----------------
TCP_SYN_RECV
------------------->ACK
TCP_ESTABLISHED
--------------------->发送 发送 <-----------------
TCP_ESTABLISHED
…..
--------------------->FIN
TCP_FIN_WAIT
ACK <------------------
TCP_CLOSE_WAIT
FIN <-------------------
TCP_LAST_ACK
--------------------->ACK
TCP_CLOSE
TCP包允许转发的规则是:
1. TCP_SYN_SENT 不转发 发起端的 非 SYN 包
2. TCP_SYN_RECV 不转发 接收端的 任何包 (发起端没有做出应答)
3. TCP_ESTABLISHED 可以互相转发 非FIN, RST, SYN包
4. TCP_FIN_WAIT和TCP_CLOSE_WAIT 不转发 发送 FIN 标志端的包
5. 不转发SYN, FIN 同时都有的包 |
|