
@Author: cjcj cj.yangjun@gmail.com <c-j.iteye.com>
程序demo:
毕业设计会放到 上,有兴趣一起完善的兄弟联系我哈!!
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):
发送数据包给外网。netfiltersaddr(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;
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)
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36628-1.html
实弹射击