1 / 26
文档名称:

iptables源码分析.doc

格式:doc   大小:86KB   页数:26页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

iptables源码分析.doc

上传人:xzh051230 2018/12/2 文件大小:86 KB

下载得到文件列表

iptables源码分析.doc

文档介绍

文档介绍:这里只是一个笔记,我会将进一步修改、整理,补充后的版本发在我的个人主页上:
/?tid=208&pid=262&page=1#pid262
应用软件源码分析发在这里不知道是否合适:D
最近看了一下iptables的实现,现在想陆续把看的心得贴出来,和大家讨论一下,共同学****br/>一、规则的显示
选择先来说明规则的显示,因为他涉及到的东东简单,而且又全面,了解了规则的显示,对于其它操作的了解就显得容易了。
iptables version
iptables有两条线:ipv4 和ipv6,这里只分析v4的,因为v6偶暂时还用不着,没有去看。

主函数:
int main(int argc, char *argv[])
{
int ret;
char *table = "filter"; /*默认的表是filter*/
iptc_handle_t handle = NULL;
program_name = "iptables";
program_version = IPTABLES_VERSION;
#ifdef NO_SHARED_LIBS
init_extensions();
#endif
/*进入命令行处理函数*/
ret = mand(argc, argv, &table, &handle);
if (ret)
ret = mit(&handle);
if (!ret)
fprintf(stderr, "iptables: %s\n",
iptc_strerror(errno));
exit(!ret);
}
table表示表的名称,就是iptables -t 后面跟的那个,默认是"filter"
iptc_handle_t handle = NULL; 这个东东很重要,现在初始化NULL,后面他被用来存储一个表的所有规则的快照。
program_name = "iptables";
program_version = IPTABLES_VERSION;
设置名称和版本。
#ifdef NO_SHARED_LIBS
init_extensions();
#endif
iptables很多东东,是用共享库*.so的形式(我们安装会,可以在诸如/lib/iptables下边看到),如果不采用共享库,则进行一个初始化操作。我们假设是采用共享库的,忽略它。
然后就进入核心处理模块:
mand(argc, argv, &table, &handle);
mand 函数是整个系统的核心,负责处理整个用户的输入命令。函数首先对一些结构、变量进行初始化,初始化完毕后,进入while循环,分析用户输入的命令,设置相关的标志变量,然后根据相应标志,调用对应的处理函数。
struct ipt_entry fw, *e = NULL;
int invert = 0;
unsigned int nsaddrs = 0, ndaddrs = 0;
struct in_addr *saddrs = NULL, *daddrs = NULL;
int c, verbose = 0;
const char *chain = NULL;
const char *workmask = NULL, *workmask = NULL;
const char *policy = NULL, *newname = NULL;
unsigned int rulenum = 0, options = 0, command = 0;
const char *pcnt = NULL, *bcnt = NULL;
int ret = 1;
struct iptables_match *m;
struct iptables_target *target = NULL;
struct iptables_target *t;
const char *jumpto = "";
char *protocol = NULL;
const char *modprobe = NULL;
/*初始化变量*/
memset(&fw, 0, sizeof(fw));
opts = original_opts;
global_option_offset = 0;
/* re-set optind to 0 in case mand gets called
* a second time */
optind = 0;
/*初始化两个全局变量*/
/* clear mflags in case m