- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1143111006_刘家豪_lab13
四 川 大 学 计 算 机 学 院、软 件 学 院
实 验 报 告
006_ 姓名:_刘家豪__ 专业:__软件工程__ 班级:第 周
信息安全产品开发实践? 实验时间 2013.12.13 实验目的 1. 设置 iptables 过滤规则为:所有从本机发出的 icmp 包全部到自己编写的应用程序。
2. 编写应用程序,功能如下:
1. 允许从本机出发,目的地址为 win xp ip 的 icmp 包;
2. 丢弃其他任何 icmp 包;
3. 当出现错误时,做错误处理,能够清理占用资源,退出程序。 实验环境 Windows7×64 RHEL 6.0 Vmware9.0? 实验内容(算法、程序、步骤和方法) 由于有老师的demo程序的支持,所以这次实验基本上由我们自己写的部分不多,任务相对轻松。
编译环境的搭建这里就不多说了。
在编写代码之前,我们需要先设置过滤环境:
iptables -A OUTPUT -p icmp -j QUEUE
这条命令很容易理解:在OUTPUT链后面加上新的规则,规则为让icmp报文被排队转发到用户空间去。
当然,这里改的是filter表。 (接上)
实验内容(算法、程序、步骤和方法) 接下来就是代码的编写了。
我们先来了解一下demo程序的工作流程:
h = ipq_create_handle(0, PF_INET);
初始化建立句柄,使用协议为IPv4。
status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE);
IPQ 的拷贝模式为同时传递“报文的元数据”和报文本身。
status = ipq_read(h, buf, BUFSIZE, 0);
从queue中读取数据包(即在过滤规则中被转发到用户空间的数据包)到buf中。
switch (ipq_message_type(buf))
分析数据包的类型,然后根据类型分别处理。
case NLMSG_ERROR:
case IPQM_PACKET:
非错误数据包,继续。
6、ipq_packet_msg_t *m = ipq_get_packet(buf);
从缓冲中获取数据包。
7、test.c中:
status = ipq_set_verdict(h, m-packet_id,NF_ACCEPT, 0, NULL);
接收数据。
test1.c中:
status = ipq_set_verdict(h, m-packet_id,NF_DROP, 0, NULL);
丢弃数据。
简单点来说,Libipq的使用流程就是从用户空间中获取数据包,然后根据数据包的内容决定内核对这个数据包的处理。
现在再回到题目中,很明显,我们只需要demo程序中的第6步和第7步之间加入第6.5步用来对包进行判断,然后再根据判断第7步对包进行处理。
m=ipq_get_packet(buf);
我们先获得数据包。
ip=(struct iphdr*)m-payload;
得到有效载荷的地址——得到了ip地址的地址。 addr.s_addr=ip-daddr;
获得ip地址。
if (!strcmp(10.0.0.222,inet_ntoa(addr)))
如果ip地址为本虚拟机的宿主机(win xp)。
{
fprintf(stderr,allow %s outpout icmp packet\n,inet_ntoa(addr));
ipq_set_verdict(h,m-packet_id,NF_ACCEPT,0,NULL);
很好,接收数据。
}
else
{
fprintf(stderr,cannot allow %s output packet\n,inet_ntoa(addr)); ipq_set_verdict(h,m-packet_id,NF_DROP,0,NULL);
}
break;
下面是全部代码:
#include stdio.h
#include stdlib.h
#include netinet/ip.h
#include linux/netfilter.h
#include libipq.h
#include string.h
#define SIZE 2048
void die(struct ip_handle* h)
{
fprintf(stderr,program end abnormally\n);
ipq_destroy_handle(h);
}
int main()
{
struct ipq_handle* h;
char buf[SIZE]
文档评论(0)