Linux个人防火墙JAVA版实现(Netfilter+Netlink+Multi-Thre) in 2009
@Author: cjcj cj.yangjun@gmail.com <c-j.iteye.com>
程序demo:
毕业设计会放到 http://code.google.com上,有兴趣一起完善的兄弟联系我哈!!NAT实现进度:
5.13
潦草地完成NAT模块,暂时收工。
完成netlink的通讯,以及修改pool池数据结构的bug.完成状态存储,查询匹配功能。
5.7凌晨
完成内核态初步钩子函数。匹配ip,tcp,udp信息
内核的数据结构很讲究共性和特性。这个我还没感知到。
目前暂时完成用于存储的数据结构和固定大小队列,其实应该用hashtable的。结构体如下:
struct object_table
{
__be32 saddr;
__be32 daddr;
__be16 source;
__be16 dest;
int status;
//static int MAXNUM=0;
struct object_table *next;
struct object_table *prv;//为了便于从尾部查询
}
概念:
流程:
eth0(public ip 10.10.10.1):
DNAT(PRE_ROUTING):
接受外网的数据包。saddr(202.202.202.2) daddr(10.10.10.1) 需要查询匹配(ip+port),查询202.202.202.2+port。
匹配成功,则根据查询结果修改daddr为192.168.0.2+port(查询从尾部开始)
匹配不成功,则无须更改
或者丢弃。
接受内网的数据包。saddr(192.168.0.2) daddr(202.202.202.2)
SNAT(POST_ROUTING):
发送数据包给外网。saddr(192.168.0.2) daddr(202.202.202.2)需要存储状态,存储192.168.0.2+port,202.202.202.2+port,并修改saddr为10.10.10.1。(为了提高效率,不用查询后插入)
发送数据包给内网。saddr(202.202.202.2) daddr(192.168.0.2)
eth1(private ip 192.168.0.1):(所有的数据包都转发给eht0处理)
eth3(ip 192.168.0.2);
eth4(ip 202.202.202.2);
引用
1. 数据包进入Hook函数后,进行规则匹配;
2. 如果所有match都匹备,则进行SNAT模块的动作,即snat 的target模块;
3. 源地址转换的规则一般是…… -j SNAT –to X.X.X.X,SNAT用规则中预设的转换后地址X.X.X.X,修改连接跟踪表中的replay tuple;
4. 接着,修改数据包的来源的地址,将它替换成replay tuple中的相应地址,即规则中预设的地址,将其发送出去;
5. 对于回来的数据包,应该能在状态跟踪表中,查找与之对应的replay tuple,也就能顺藤摸瓜地找到原始的tuple中的信息,将应答包中的目的地址改回来,这样,整个数据传送就得以顺利转发了;
谢谢独孤九贱前辈的总结和对2.4的源码分析
引用
* NF_IP_PRE_ROUTING (0)
数据报在进入路由代码被处理之前,数据报在IP数据报接收函数ip_rcv()(位于net/ipv4/ip_input.c,Line379)的最后,也就是在传入的数据报被处理之前经过这个HOOK。在ip_rcv()中挂接这个HOOK之前,进行的是一些与类型、长度、版本有关的检查。
经过这个HOOK处理之后,数据报进入ip_rcv_finish()(位于 net/ipv4/ip_input.c,Line306)
在这个HOOK上主要是对数据报作报头检测处理,以捕获异常情况。
* NF_IP_LOCAL_IN (1)
目的地为本地主机的数据报在IP数据报本地投递函数ip_local_deliver()(位于net/ipv4/ip_input.c,Line290)的最后经过这个HOOK。
经过这个HOOK处理之后,数据报进入ip_local_deliver_finish()(位于 net/ipv4/ip_input.c,Line219)
这样,IPTables模块就可以利用这个HOOK对应的INPUT规则链表来对数据报进行规则匹配的筛选了。防火墙一般建立在这个HOOK上。
* NF_IP_FORWARD (2)
目的地非本地主机的数据报,包括被NAT修改过地址的数据报,都要在IP数据报转发函数ip_forward()(位于net/ipv4/ip_forward.c,Line73)的最后经过这个HOOK。
经过这个HOOK处理之后,数据报进入ip_forward_finish ()(位于net/ipv4/ip_forward.c,Line44)
另外,在net/ipv4/ipmr.c中的 ipmr_queue_xmit()函数(Line1119)最后也会经过这个HOOK。(ipmr为多播相关,估计是在需要通过路由转发多播数据时的处理)
&nbs