如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
iptables源码分析iptables源码分析这里只是一个笔记,我会将进一步修改、整理,补充后的版本发在我的个人主页上:http://www.skynet.org.cn/viewthread.php?tid=208&pid=262&page=1#pid262应用软件源码分析发在这里不知道是否合适:D最近看了一下iptables的实现,现在想陆续把看的心得贴出来,和大家讨论一下,共同学习……一、规则的显示选择先来说明规则的显示,因为他涉及到的东东简单,而且又全面,了解了规则的显示,对于其它操作的了解就显得容易了。iptablesversion1.2.7iptables有两条线:ipv4和ipv6,这里只分析v4的,因为v6偶暂时还用不着,没有去看。iptables_standardone.c主函数:intmain(intargc,char*argv[]){intret;char*table="filter";/*默认的表是filter*/iptc_handle_thandle=NULL;program_name="iptables";program_version=IPTABLES_VERSION;#ifdefNO_SHARED_LIBSinit_extensions();#endif/*进入命令行处理函数*/ret=do_command(argc,argv,&table,&handle);if(ret)ret=iptc_commit(&handle);if(!ret)fprintf(stderr,"iptables:%s\n",iptc_strerror(errno));exit(!ret);}table表示表的名称,就是iptables-t后面跟的那个,默认是"filter"iptc_handle_thandle=NULL;这个东东很重要,现在初始化NULL,后面他被用来存储一个表的所有规则的快照。program_name="iptables";program_version=IPTABLES_VERSION;设置名称和版本。#ifdefNO_SHARED_LIBSinit_extensions();#endifiptables很多东东,是用共享库*.so的形式(我们安装会,可以在诸如/lib/iptables下边看到),如果不采用共享库,则进行一个初始化操作。我们假设是采用共享库的,忽略它。然后就进入核心处理模块:do_command(argc,argv,&table,&handle);do_command函数是整个系统的核心,负责处理整个用户的输入命令。函数首先对一些结构、变量进行初始化,初始化完毕后,进入while循环,分析用户输入的命令,设置相关的标志变量,然后根据相应标志,调用对应的处理函数。structipt_entryfw,*e=NULL;intinvert=0;unsignedintnsaddrs=0,ndaddrs=0;structin_addr*saddrs=NULL,*daddrs=NULL;intc,verbose=0;constchar*chain=NULL;constchar*shostnetworkmask=NULL,*dhostnetworkmask=NULL;constchar*policy=NULL,*newname=NULL;unsignedintrulenum=0,options=0,command=0;constchar*pcnt=NULL,*bcnt=NULL;intret=1;structiptables_match*m;structiptables_target*target=NULL;structiptables_target*t;constchar*jumpto="";char*protocol=NULL;constchar*modprobe=NULL;/*初始化变量*/memset(&fw,0,sizeof(fw));opts=original_opts;global_option_offset=0;/*re-setoptindto0incasedo_commandgetscalled*asecondtime*/optind=0;/*初始化两个全局变量*//*clearmflagsincasedo_commandgetscalledasecondtime*(weclearthegloballistofallmatchesforsecurity)*/for(m=iptables_matches;m