1143111006_刘家豪_lab13.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档