日期:2014-05-16  浏览次数:20651 次

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