在洗浴前台经理岗位职责的前台电脑上想多加一位搓澡技师怎么加

博客访问: 25521
博文数量: 10
博客积分: 310
博客等级: 一等列兵
技术积分: 80
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 系统运维
[root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn
172 ESTABLISHED
59 CONNECTED
589 SYN_RECV
SYN居然这么高,继续追查是那些ip发出的SYN:
[root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
570 x.x.x.x&&&
(ip就不写出了,是山东枣庄联通的一个ip),只是这一个ip就发出了这么多的syn请求连接,本来我们web服务器的并发数不是很高,这样一来正常的用户请求得不到相应,页面无法打开。因为硬件防火墙归集团IT部管理,我没有权限,所以只能在本地服务器上做些措施对SYN攻击进行部分减缓。
首先说一下SYN的攻击原理:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
如果用户与服务器发起连接请求只进行到第二次握手而不再响应服务器,服务器就会不停地等待用户的确认,如果过多这样的连接就会把服务器端的连接队列占满就会导致正常的用户无法建立连接。所以我们直接从SYN的连接上进行如下改动:
查看默认的syn配置:
[root@web ~]# sysctl -a | grep _syn
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
tcp_max_syn_backlog是SYN队列的长度,加大SYN队列长度可以容纳更多等待连接的网络连接数。tcp_syncookies是一个开关,是否打开SYN
Cookie 功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN
的重试连接次数,将默认的参数减小来控制SYN连接次数的尽量少。
以下是我修改后的参数,可以根据自己服务器的实际情况进行修改:
[root@web ~]# more /etc/rc.d/rc.local
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
ulimit -HSn 65535
/usr/local/apache2/bin/apachectl start
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
为了不重启服务器而使配置立即生效,可以执行
#sysctl -w net.ipv4.tcp_max_syn_backlog=2048
#sysctl -w net.ipv4.tcp_syncookies=1
#sysctl -w net.ipv4.tcp_synack_retries=3
#sysctl -w net.ipv4.tcp_syn_retries=3
也有的人喜欢用访问控制列表来防止SYN的攻击,在一定程度上减缓了syn的攻击:
Syn 洪水攻击
#iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
--limit 1/s 限制syn并发数每秒1次
防端口扫描
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
死亡之ping
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#>iptables-save >/etc/sysconfig/iptables
进行查看,#iptables -L
ACCEPT&&&& tcp& --& anywhere&&&&&&&&&&&& anywhere&&&&&&&&&&& tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5
ACCEPT&&&& tcp& --& anywhere&&&&&&&&&&&& anywhere&&&&&&&&&&& tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5
ACCEPT&&&& icmp --& anywhere&&&&&&&&&&&& anywhere&&&&&&&&&&& icmp echo-request limit: avg 1/sec burst 5
再次进行查看syn连接:
[root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
20 10.92.10.220
1 125.43.36.199
明显SYN连接数已经下来了。
阅读(195) | 评论(0) | 转发(0) |
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。[精华] 【iptables交流贴】iptables执行的流程分析 - ChinaUnix.net
[精华] 【iptables交流贴】iptables执行的流程分析
http://www.chinaunix.net 作者:&&发表于: 13:24:13
[size=3][color=Blue]最近在看iptables的源码,得益于九贱兄的《iptables源码分析》和几位朋友的指点,终于完成了iptables代码的了解。不过,我分析代码的方式,主要是从一条命令的执行上来分析整个iptables的执行流程。感觉这样分析起来更加有条理,容易把握住iptables的整个代码。
我是边分析边总结,所以代码分析完了,总结也就写完了。不过,我这里并不注重对具体代码的分析,而是注重代码的指令流程以及结果。希望可以对准备学习iptables的朋友有所帮助。
分析的版本是1.2.9。整个总结从2楼开始。
分析难免有错误和不妥的地方,欢迎指正,多多交流,共同进步。
欢迎自由转载,但请保持该文的完整性,并注明出处。
Author:Godbach
E-mail:[email][/email]
-------------------------------------------
[size=4][color=Red]希望此贴也可以成为学习iptables的交流贴,有什么问题可以在这里提出来,一起讨论。[/color][/size]
[/color][/size][&本帖最后由&Godbach&于&&15:03&编辑&]
& 回复于: 14:51:51
这里以一条iptabls的命令来分析Iptables的代码,该条规则尽量设计比较多的iptables的命令行参数。
假设要下的规则为:
[color=Blue]iptabls&–A&INPUT&–i&eth0&–p&tcp&--syn&–s&10.0.0.0/8&–d&10.1.28.184&–j&ACCEPT[/color]
该规则是将源地址段在10.0.0.0/8范围之内的主机发送的SYN包,接受的网口为eth0,且目的地址为10.1.28.184的,执行ACCEPT
以下是执行该条命令时,iptables的流程分析。这里比较不注重分析代码,而注重执行的流程及结果。
[size=5]一、命令行的入口[/size]
int&main(int&argc,&char&*argv[])&&(iptables-standalone.c)
整个iptables命令行的入口。该函数设置了默认的table=”filter”,即当命令行中没有-t选项是,就使用默认的filter表。同时还初始化了该应用程序的名字,版本号等。
[color=Blue]#ifdef&NO_SHARED_LIBS
&&&&&&&&init_extensions();
#endif[/color]
以上代码为没有定义共享库的话,要执行init_extensions()。这里我们假设不使用共享库,所以调用该函数。该函数实在执行make的时候extensions/自动生成的initext.c中的函数。在该函数里调用了所有扩展模块的init函数。
注册所有的match,以及标准和扩展的target。
所有的match和target都加入到iptables.c中对应的全局链表之中。以后find_match和find_target是就是搜索的这两个链表。
[color=Blue]/*&Keeping&track&of&external&matches&and&targets:&linked&lists.&&*/
struct&iptables_match&*iptables_matches&=&NULL;
struct&iptables_target&*iptables_targets&=&NULL;[/color]
这样在不使用共享库的情况下,每次下命令之前都要初始化一下全局的链表,当然已经存在的话,就不会再次register的。[&本帖最后由&Godbach&于&&15:03&编辑&]
& 回复于: 14:52:43
[size=5]二、命令行的核心处理[/size]
do_command()是处理Iptables命令的核心部分。
[color=Blue]int&do_command(int&argc,&char&*argv[],&char&**table,&iptc_handle_t&*handle)[/color]
(iptables.c)
[size=3]1.&函数首先对一些结构、变量进行初始化。基本上涵盖了一条规则可能出现的大部分基本参数。[/size]其中,重要的结构体有struct&ipt_entry&fw,&*e,这两个应该是存储一条防火墙规则的;struct&iptables_match&*m,struct&iptables_target&*target,*t;&
分别用于存储match和target.
&&&&&&&&并将全局的match和target链表的对应flags和used为初始化为0.
[size=3]2.&命令行解析。[/size]初始化完毕后,进入while循环,分析用户输入的命令,设置相关的标志变量,然后根据相应标志,调用对应的处理函数。这里是我们要进行详细分析的地方。
我们要分析的命令为:
[color=Blue]iptabls&–A&INPUT&–i&eth0&–p&tcp&--syn&–s&10.0.0.0/8&–d&10.1.28.184&–j&ACCEPT[/color]
以下开始命令行解析:
(1)&处理&–A&选项
&&&&&&&&调用add_command函数,主要是对command变量进行逻辑处理。该函数的输入参数
&&&&&&&[color=Blue]&newcmd&=&CMD_APPEND=0x0010,othercmds=&CMD_NONE=0x0000,invert&=&0;[/color]
&&&&&&&&输出参数command(初始值为0),
&&&&&&&&执行完该函数之后,
[color=Blue]&&&&&&&&command&=&CMD_APPEND=0x0010,
&&&&&&&&chain&=&“INPUT”[/color]
&&&&&&&&然后程序break跳出switch语句,并将invert&=&FALSE,进行while的下一个循环,及处理下一个选项。
(2)&处理&–i&选项
&&&&&&&&调用check_inverse函数。该函数主要是检查-i对应的参数中是否使用了取反标志”!”,因此这里我们使用的是”eth0”,因此该函数直接返回FALSE。invert=0。
&&&&&&&&调用set_option函数是指对应的选项。该函数的输入参数option=&OPT_VIANAMEOUT(0x0080),&invert=0,输出参数options(初始化为0),fw.ip.invflags(初始化为0)。
经过该函数处理之后,
[color=Blue]options&=&OPT_VIANAMEIN=0x0080;
fw.ip.invflags=0.[/color]
&&&&&&&&调用parse_interface函数进行网络接口的解析。该函数的参数输入参数[color=Blue]argv[optind-1]=”eth0”,&输出参数fw.ip.iniface[IFNAMSIZ]={“”},&&&&&&&&fw.ip.iniface_mask[IFNAMSIZ]={“”},&其中IFNAMSIZ=15。[/color]
处理之后,
[color=Blue]fw.ip.iniface[IFNAMSIZ]={“eth0”};&
fw.ip.iniface_mask[IFNAMSIZ]={0xFF,&0xFF,&0xFF,&0xFF,&0xFF};
fw.nfcache&=&NFC_IP_IF_IN&=&0x0004;[/color]
(3)&处理&–p&选项
调用check_inverse函数,检查这里设置的协议参数是否使用了取反标志”!”。我们这里使用的是tcp,因此该函数直接返回FALSE。invert仍旧为0。
调用set_option函数是指对应的选项。可以参照(2)中该函数的处理方法。options&的初始值为0x0080,最终处理完毕之后
[color=Blue]&options&|=&OPT_PROTOCOL(0x0008)&=&0x0088;
&fw.ip.invflags=0[/color]
然后协议字串tcp全部转化为小写,protocol&=&“tcp”。调用parse_protocol函数将该协议字符串转换为TCP对应的协议号6,
[color=Blue]fw.ip.proto&=&6;
fw.nfcache&|=&NFC_IP_PROTO&=&0x0004&|&0x0020&=&0x0024;[/color]
(4)&处理&--syn选项
&&&&&&&&由于该选项并不在全局变量opts里面,所以程序会进入switch语句的default分支执行。
&&&&&&&&进行该分支处理时一些变量的初始值:
target==NULL,&m==NULL,
全局链表iptables_matches的used选项都为0
[color=Blue]protocol&=&“tcp”&,options&=&0x0088,&proto_used&=&0[/color]
根据以上参数的值,这里要执行的动作为加载该协议(m-&init(),&即libipt_tcp.c中init()),并且将协议的一些选项扩展到全局变量opts里面。具体代码执行是进入该分支的if(m==NULL&&…)里面,具体执行的结果如下:
m指向全局match链表中tcp的match。(libipt_tcp.c)
[color=Blue]proto_used&=&1;
size&=&IPT_ALIGN(sizeof(struct&ipt_entry_match))&+&m-&
m-&m&=&fw_calloc(1,&size);&(m-&m为内核总的match部分)
m-&m-&u.match_size&=&
m-&m-&u.user.name&=&“tcp”;
m-&used&=&1;[/color]
调用m-&init(m-&m,&&fw.nfcache),执行init()(libipt_tcp.c)。仅是将match中的tcp的sport和dport的最大值置为0xFFFF.&struct&ipt_entry_match&中的data主要用于表示真正数据部分的开始,是通过fw_calloc为整个结构体以及data申请的内存,以后对数据的操作都可以通过data来索引。
[color=Blue]init(struct&ipt_entry_match&*m,&unsigned&int&*nfcache)
{
&&&&&&&&struct&ipt_tcp&*tcpinfo&=&(struct&ipt_tcp&*)m-&
&&&&&&&&tcpinfo-&spts[1]&=&tcpinfo-&dpts[1]&=&0xFFFF;
}&[/color]
merge_options将tcp的一些选项扩展到全局变量opts里面。这样就可以解析&--syn选项了。opts包含了tcp协议的选项参数。
并且全局变量global_option_offset&+=&OPTION_OFFSET&=&256;
&&&&&&&&&&&&&&&&m-&option_offset=&global_option_offset&=256;
这里有点需要注意,就是新加到opts全局结构体中的部分,即tcp对应的option结构中所有的val成员都被赋值为:
merge[num_old&+&i].val&+=&*option_&(见merge_options函数)
这里主要是为了区别和原先已有option中的val成员。而且在以后添加更多match模块的时候,都要做这样的动作。因此在命令行解析的时候,通过getopt_long得到的这些match中的命令行参数值的时候,需要先减去对应的m-&option_offset,然后才能正确的parse.
然后两行代码:&&&&&&&&[color=Blue]optind--;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[/color]
是让程序进入下一个while循环,并再次处理--syn参数。因为以上的处理只是将tcp协议的match进行了初始化工作,并没有处理该参数。
因此,程序再次进入switch的default分支,不过这次是在if(!target&&…),由于对应tcp的match结构体的used被置1,即m-&used&=1;&因此程序要进行m-&parse进行libipt_tcp中的parse()函数对命令行参数进行处理。该函数的第一个参数的使用方法上面已经解释过了。以下就是parse()函数对--syn的处理结果:
[color=Blue]((struct&ipt_tcp&*)m-&data)-&flg_mask&=&0x16(SYN,ACK,RST);
((struct&ipt_tcp&*)m-&data)-&flg_cmp&=&0x02(SYN)
m-&flags&|=&TCP_FLAGS&=&0x04;
fw.nfcache&|=&NF_IP_TCP_FLAGS(0x0100)&=&0x0024&|&0x4[/color]
至此,iptables对—syn选项的解析已经完成。
(5)&处理-s选项
同样还是check_inverse,set_option的处理,只有options变量改变;
[color=Blue]options&|=&OPT_SOURCE(0x0002)&=&0x0088&|&0x0002&=&0x008a;
shostnetworkmask=&“10.0.0.0/24”;
fw.nfcache&|=&NFC_IP_SRC(0x0001)=&0x0124&|&0x0001&=&0x0125;[/color]
(6)&处理-d选项
同样还是check_inverse,set_option的处理,只有options变量改变;
[color=Blue]options&|=&OPT_DESTINATION&(0x0004)&=&0x008a&|&0x0004&=&0x008e;
dhostnetworkmask=&“10.1.28.184”;
fw.nfcache&|=&NFC_IP_DST&(0x0002)=&0x0125&|&0x0002&=&0x0127;[/color]
(7)&处理-j选项
&&&&&&&&首先还是set_option函数的处理:
&&&&&&&&[color=Blue]options&|=&OPT_JUMP(0x0010)&&&&&&&&=&0x008e&|&0x0010&=&0x009e;[/color]
&&&&&&&&然后jumpto&=parse_target(“ACCEPT”),主要是检查一下该字符串是否合法;
接着target&=find_target(jumpto,&TRY_LOAD);该函数返回target为”standard”(包含了ACCEPT,&DROP,&QUEUE,RETURN等目标)的结构体指针。
&&&&&&&&并且:&&&&&&&&[color=Blue]target-&loaded&=&1;&target-&used&=&1
&&&&&&&&jumpto&=&“ACCEPT”
&&&&&&&&size&=&IPT_ALIGN(sizeof(struct&ipt_entry_target))+&target-&
&&&&&&&&target-&t&=&fw_calloc(1,&size);&//分配内存给struct&ipt_entry_target
&&&&&&&&target-&t-&u.target_size&=&
target-&t-&u.user.name&=&“ACCEPT”[/color]
这里的target-&init指向了libipt_standard.c中的init(),该函数并未执行任何动作。
merge_options又是将该libipt_standard.c的&opts加入到全局的opts中。由于ACCEPT目标是标准的,这里实际上并未往全局的opts中添加任何内容。
仅修改了如下变量
&&&&&&&&&&&&&&&&[color=Blue]global_option_offset&+=&OPTION_OFFSET&=&256+256=512;
&&&&&&&&&&&&target-&option_offset=&global_option_offset&=512;[/color]
至此,命令行已经解析完毕,下面要接着对解析出来的各个参数进行进一步处理。[&本帖最后由&Godbach&于&&15:04&编辑&]
& 回复于: 14:53:17
[size=4]3.&相关参数的检查[/size]
&&&&&&&&/*执行libipt_tcp.c中的final_check*/
&&&&&&&&[color=Blue]m-&final_check(m-&mflags);[/color]
/*执行libipt_standard.c中的final_check*/
[color=Blue]target-&final_check(target-&tflags);[/color]
随后是对optind,invert,command的检查,接着的if&(command&&…)对我们的参数没有产生任何影响。
分别对shostnetworkmask,dhostnetworkmask调用parse_hostnetworkmask函数,执行的结果如下:
[color=Blue]saddrs[0]-&s_addr&=&0x0a.0.0.0);[/color]
[color=Blue]fw.ip.smsk.s_addr&=&0xff5.0.0.0);[/color]
[color=Blue]nsaddrs&=&1;[/color]
[color=Blue]daddrs[/color][color=Blue][0][/color][color=Blue]-&s_addr&=&0x0a011cb8&(10.1.28.184);[/color]
[color=Blue]fw.ip.dmsk.s_addr&=&0xffffffff&(255.255.255.255);[/color]
[color=Blue]ndaddrs&=&1;[/color]
最后调用generic_opt_check(command,&options)对command和options进行检查。主要是检查iptables中的command和options是否搭配。所有的搭配情况保存在全局的数组
static&char&commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT].
&&&&&&&&下面则要从内核表里取出对应表的全部信息。
[size=4]4.&取出内核中相应表的全部信息[/size]
&&&&&&&&因为在main函数中iptc_handle_t&handle&=&NULL;&所以这里要执行的代码为:
[color=Blue]*handle&=&iptc_init(*table)[/color]
这里返回一个iptc_handle_t&*handle的结构体指针,该指针指向从内核中去中的”filter”(默认)表对应的所有信息。&先取出info结构,获取表的一些大概信息,然后再获取整个表的规则。
随后的两个if&(!*handle)都是判断*handle是否为NULL,如果是的话则说明有错误,获取不到对应表的相关信息。我们这里应该指向了获取的”filter”的信息的指针。因此这两个if判断都为FALSE。
[size=4]5.&检查chain与相关options的搭配,target的合法等问题[/size]
&&&&&&&&整个检查都在[color=Blue]if&(command&==&CMD_APPEND…){…}[/color]里面进行。
&&&&&&&&首先检查chain和options的匹配情况,这里chain=”INPUT”,对于本例中设置的规则,应该都没有问题。
&&&&&&&&然后是[color=Blue]if&(target&&&&iptc_is_chain(jumpto,&*handle))[/color]。其中target为”standard”(包含了ACCEPT,&DROP,&QUEUE,RETURN等目标)的结构体指针。
(libiptc.c)。由于我们这里的jumpto为目标ACCEPT,而并非chain,所以该if为FALSE.
&&&&&&&&因此,程序真正执行的部分是
[color=Blue]e&=&generate_entry(&fw,&iptables_matches,&target-&t);[/color]
用来生成一个struct&ipt_entry&e。e中包括了struct&ipt_entry,并利用最后一个元素unsigned&char&elems[0]申请了一块内存,该内存里首先是若干个match的结构体,然后是一个target结构体,因此该块内存的大小为n*match&+&target.
[size=4]6.&具体命令的执行[/size]
&&&&&&&&这部分也是do_command函数的最后。用一个swicth(command)来判断具体执行什么动作。我们这里command=CMD_APPEND,因此调用append_entry函数来将该条iptables规则加入进去。大致介绍一下append_entry函数的功能:
&&&&&&&&源码中具体对应的函数名为[color=Blue]TC_APPEND_ENTRY()[/color]。该函数首先调用find_label找到整个规则中指定chain的struct&chain_cache结构,然后做一下target的映射,我们这里是标准的target。真正执行添加规则的是insert_rules函数。该函数找到插入规则的entry点,并将该规则插入。
调整后的所有的规则都保存在结构体指针handle之中。[&本帖最后由&Godbach&于&&10:06&编辑&]
& 回复于: 14:53:49
[size=5]三、iptables规则的提交[/size]
do_command函数执行完毕,接着调用iptc_commit(&handle)将filter调整后的所有规则提交给内核。
这里只分析了ipt_init(),append_entry和iptc_commit的功能,没有具体分析其源代码。因为这三个函数的源代码都比较复杂。这里作为Iptables的流程分析,不具体讨论。
整个iptables的工作流程解析完毕。这样,对iptables的整个命令行的核心代码从已经有了相当的掌握。[&本帖最后由&Godbach&于&&15:07&编辑&]
& 回复于: 15:04:23
学习了,分析得很详细!lz很强啊!
& 回复于: 15:06:57
引用:原帖由&dreamice&于&&15:04&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689264&ptid=1022438]
学习了,分析得很详细!lz很强啊!&
多谢。完整的看一个代码,从多个方面都有收获。偶喜欢看代码的时候,编写边整理,这样容易让思路清晰。
可能有些地方分析的不妥,有些地方分析的不够详细。
大家对哪一块感兴趣的话,咱们可以拿着代码在具体分析啊。
& 回复于: 15:13:01
好贴,谢谢LZ:em09:
& 回复于: 15:14:28
在分析源码的时候,偶常常感慨C可以这样灵活的使用,太牛叉了。
& 回复于: 15:19:56
这里的分析重在流程,因此很多细节都忽略了,而且可能会有些小的纰漏。
& 回复于: 15:51:49
引用:原帖由&Godbach&于&&15:19&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689333&ptid=1022438]
这里的分析重在流程,因此很多细节都忽略了,而且可能会有些小的纰漏。&
不一定要全面,先理清一条线很重要,看得出来LZ的思路很清晰,多向你学习,呵呵。
& 回复于: 15:55:38
引用:原帖由&dreamice&于&&15:51&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689397&ptid=1022438]
不一定要全面,先理清一条线很重要,看得出来LZ的思路很清晰,多向你学习,呵呵。&
客气。不过你说得很对,理清一条线。我觉得这种方式对我看代码很有帮助,也很有效。在分析链接跟踪的内核源码时,我也是采用的这种方法,感觉这样理解代码有条理多了。
LS的是不是也在做网络这方面的?
& 回复于: 16:03:26
引用:原帖由&Godbach&于&&15:55&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689408&ptid=1022438]
客气。不过你说得很对,理清一条线。我觉得这种方式对我看代码很有帮助,也很有效。在分析链接跟踪的内核源码时,我也是采用的这种方法,感觉这样理解代码有条理多了。
LS的是不是也在做网络这方面的?&
嗯,不过比起LZ来,我差得多了,呵呵。我对ip&conntrack和netfilter看得多一些,多iptables没有仔细分析过,看了你这篇,对我很有指导:lol:
& 回复于: 16:05:25
引用:原帖由&dreamice&于&&16:03&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689432&ptid=1022438]
嗯,不过比起LZ来,我差得多了,呵呵。我对ip&conntrack和netfilter看得多一些,多iptables没有仔细分析过,看了你这篇,对我很有指导:lol:&
你把ip_conntrack和netfilter都搞清楚了,应用层面的iptables不是小菜了。呵呵,我这一段也在搞netfilter,看来可以和兄弟多多交流了。
不知道netfilter你是怎么入手的,是直接看一个表的呢,还是从nefilter的初始化入手?
& 回复于: 16:18:57
也没有搞得很清楚,呵呵,那我们可以互相交流学习了:)
我做的时候主要是明确几个hook点,理清每一条链,特别注意conntrack的状态转换以及连接的建立,子连接及expect连接需要搞明白,最好结合实践。当然,netfilter的初始化,肯定要弄清楚,不然怎么知道运行起来哪些东西干了些什么呢?
呵呵,个人愚见,本版很多netfilter高手及精品文章,小弟一直拜读中。
& 回复于: 16:24:30
引用:原帖由&dreamice&于&&16:18&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6689499&ptid=1022438]
也没有搞得很清楚,呵呵,那我们可以互相交流学习了:)
我做的时候主要是明确几个hook点,理清每一条链,特别注意conntrack的状态转换以及连接的建立,子连接及expect连接需要搞明白,最好结合实践。当然,ne&...&
呵呵,偶也一直在看。现在已经把conntrack的基本流程搞清楚了,只是没有太注重子连接和expect。
多多交流。[&本帖最后由&Godbach&于&&16:27&编辑&]
& 回复于: 16:31:57
感觉可以分析一下,一条iptables规则下载到内核中,内核要做的相应工作。
另外,一个连接过来之后,内核中的该规则是如何对该数据包进行验证和处理的。
& 回复于: 18:09:51
建议打算看Netfilter源码的,先了解一下iptables的源码,分析一下里面若干的结构体,对理解Netfilter很有帮助。
& 回复于: 10:16:18
Netfilter的代码看起来确实比较复杂,要下一番苦功夫啊
& 回复于: 13:26:08
写的不错,受教了。:em02:
& 回复于: 14:29:02
不错不错,我也刚看完九贱的iptables源码,理解不透彻,正好可以好好学习一下嘿嘿。
& 回复于: 14:44:03
引用:原帖由&jaycu&于&&14:29&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6691191&ptid=1022438]
不错不错,我也刚看完九贱的iptables源码,理解不透彻,正好可以好好学习一下嘿嘿。&
呵呵,我也是看的时候总觉得有点模糊。最后就干脆从执行一条命令来分析iptables的整个代码。有什么问题,咱们可以一起交流。
& 回复于: 20:12:52
备注一下
以后好找
& 回复于: 10:09:27
好文,顶,MARK:wink:&:wink:&:wink:
& 回复于: 13:22:06
谢谢楼主,受益匪浅呀
& 回复于: 16:12:18
写的很好啊,我是新手,虽然很多地方没看懂,还是觉得对我以后的学习很有帮助。
& 回复于: 16:24:36
Godbach&兄,我有个关于netfilter的问题想请教你。就是netfilter中的规则ipt_entry和ipt_entry_match是如何联系在一起的?
&&&&&&首先在ipt_do_table函数中对sk_buff依照规则ipt_entry进行匹配match,然后调用其target函数。其中宏[color=Red]IPT_MATCH_ITERATE(e,&do_match,*pskb,&in,&out,&offset,&&hotdrop)[/color]是用来根据ipt_entry来遍历其ipt_entry_match的,遍历的同时调用do_match函数进行实际的match。
&&&&&&&后来我看了[color=Red]ipt_register_match(ipt_match&XXX)[/color]函数,这个函数完成对match的注册,但是它的注册实际上是把这个ipt_match添加到一个[color=Red]struct&xt_af&{
&&&&&&&&struct&mutex&
&&&&&&&&struct&list_head&
&&&&&&&&struct&list_head&
&&&&&&&&struct&list_head&
&&&&&&&&struct&mutex&compat_
};[/color]
的&match&中,跟规则ipt_entry无关啊。。。。
&&&&&&&&ipt_entry遍历ipt_entry_match是依靠其内部的target_offset等偏移量来实现的,可是偏移量是在哪里设置好的?我没找到相关的函数。。。
&&&&&&&&上面有可能讲得不对,望同志们看看哪里我理解错了。我其实就是想知道新建一个规则ipt_entry时,它的ipt_entry_match是如何设置的,是怎么跟target_offset这些偏移量对应的。。。
& 回复于: 17:08:02
引用:原帖由&jaycu&于&&16:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693400&ptid=1022438]
Godbach&兄,我有个关于netfilter的问题想请教你。就是netfilter中的规则ipt_entry和ipt_entry_match是如何联系在一起的?
&&&&&&首先在ipt_do_table函数中对sk_buff依照规则ipt_entry进行匹配match,然后调用&...&
这个地方我也正在看。我觉得应该是在设置规则的时候,iptables会根据你的match来设置target_offset的。具体内核的代码,我也得在找一下。具体原理应该是这样。
兄弟可以参考一下iptable_filter.c中
static&struct
{
struct&ipt_replace&
struct&ipt_standard&entries[3];
struct&ipt_error&
}&initial_table&__initdata&
这个地方是初始化一张表,即filter表。那这里已经设置的target_offset,&next_offset。
默认的是没有match,&一个target。这个地方会不会对你的理解有所帮助。[&本帖最后由&Godbach&于&&17:09&编辑&]
& 回复于: 17:36:09
引用:原帖由&Godbach&于&&17:08&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693539&ptid=1022438]
这个地方我也正在看。我觉得应该是在设置规则的时候,iptables会根据你的match来设置target_offset的。具体内核的代码,我也得在找一下。具体原理应该是这样。
兄弟可以参考一下iptable_filter.c中
s&...&
好的,谢谢,我再好好看看&:)
& 回复于: 17:40:43
学习了!!貌似看的不是很明白!!看来要多看几遍啊!
& 回复于: 17:43:21
引用:原帖由&songpure520&于&&17:40&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693665&ptid=1022438]
学习了!!貌似看的不是很明白!!看来要多看几遍啊!&
惭愧,可能很多地方写的不是很清楚。
& 回复于: 17:45:25
引用:原帖由&jaycu&于&&17:36&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693647&ptid=1022438]
好的,谢谢,我再好好看看&:)&
你可以看一看iptables应用代码中添加一条规则时,有多个match的话,程序是如何处理的
& 回复于: 17:50:18
引用:原帖由&jaycu&于&&17:36&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693647&ptid=1022438]
好的,谢谢,我再好好看看&:)&
看一下iptables的应用程序,iptables.c中generate_entry函数,应该可以解答你的问题:
static&struct&ipt_entry&*
generate_entry(const&struct&ipt_entry&*fw,
&&&&&&&struct&iptables_match&*matches,
&&&&&&&struct&ipt_entry_target&*target)
{
unsigned&int&
struct&iptables_match&*m;
struct&ipt_entry&*e;
size&=&sizeof(struct&ipt_entry);
for&(m&=&&m;&m&=&m-&next)&{
if&(!m-&used)
size&+=&m-&m-&u.match_
e&=&fw_malloc(size&+&target-&u.target_size);
e-&target_offset&=&
e-&next_offset&=&size&+&target-&u.target_
for&(m&=&&m;&m&=&m-&next)&{
if&(!m-&used)
memcpy(e-&elems&+&size,&m-&m,&m-&m-&u.match_size);
size&+=&m-&m-&u.match_
memcpy(e-&elems&+&size,&target,&target-&u.target_size);
return&e;
}
& 回复于: 17:54:26
当你添加一条规则是,解析完命令行,以及相关的检测,就会通过该函数生成一个规则项,那么该函数会根据规则中的相应信息,设置规则的target_offset,&next_offset等。
最后该规则经过处理后,通过setsockopt下载到内核中。
& 回复于: 17:56:56
引用:原帖由&jaycu&于&&16:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693400&ptid=1022438]
Godbach&兄,我有个关于netfilter的问题想请教你。就是netfilter中的规则ipt_entry和ipt_entry_match是如何联系在一起的?
&&&&&&首先在ipt_do_table函数中对sk_buff依照规则ipt_entry进行匹配match,然后调用&...&
entry,match和target是filter表最难理解的几个地方。首先,需要理解的是,一个entry对应一个match,一个match对应一个或者多个target。match是通过访问entry的偏移地址来访问的,target紧接在match后面。我现在手上没有代码,不能结合代码来阐述这个问题。但这条线必须要认识清楚。
& 回复于: 18:00:35
引用:原帖由&dreamice&于&&17:56&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693722&ptid=1022438]
entry,match和target是filter表最难理解的几个地方。首先,需要理解的是,一个entry对应一个match,一个match对应一个或者多个target。match是通过访问entry的偏移地址来访问的,target紧接在match后面。我&...&
一个entry也可以一个标准match,然后还可能有多个扩展match。
所以一条规则的大小一般是sizeof(ipt_entry)+n&*&match&+&target[&本帖最后由&Godbach&于&&18:03&编辑&]
& 回复于: 18:03:38
标准match即struct&ipt_entry结构中的struct&ipt_ip结构体
& 回复于: 21:41:27
好东西,顶上去.有机会好好看看了
& 回复于: 22:59:30
不好意思,刚好说反了,多个match和一个target。
& 回复于: 23:41:44
好贴,谢谢LZ
& 回复于: 11:32:15
引用:原帖由&Godbach&于&&17:50&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6693706&ptid=1022438]
看一下iptables的应用程序,iptables.c中generate_entry函数,应该可以解答你的问题:
static&struct&ipt_entry&*
generate_entry(const&struct&ipt_entry&*fw,
&&&&&&&struct&iptables_match&*match&...&
Perfect,收到,受益匪浅啊真是
& 回复于: 11:33:14
真牛X,看源代码是需要勇气的
& 回复于: 11:48:02
引用:原帖由&knight_123&于&&11:33&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695223&ptid=1022438]
真牛X,看源代码是需要勇气的&
呵呵。可能起初需要看代码是工作的需要,但是在看代码的过程中一点一点程序的设计方法的时候,就会感悟设计的灵巧,而不觉得看代码是一项没有情趣的事情了。
& 回复于: 11:48:51
引用:原帖由&jaycu&于&&11:32&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695222&ptid=1022438]
Perfect,收到,受益匪浅啊真是&
有帮助就好。如果有什么iptables的问题,可以继续在此贴交流。正好一起学习,共同进步。:em02:
& 回复于: 12:02:50
好贴,留个脚印&:mrgreen:
& 回复于: 15:46:19
研究一下,在iptables中使用-m&state扩展的使用,下载的该条规则会默认的加到该CHAIN规则的开始,这样就可以不用匹配后面的规则,也就是所谓了绕过防火墙了。
但这个功能的代码在哪里实现的,也就是当有-m&state的时候,就会把这条规则自动的加到CHAIN的开始吗,iptables的代码没找到在哪里。
哪位指点一下。
& 回复于: 16:11:46
也就是说带-m&state的规则在存到某个表里的时候,是不是存到表的最前面了。如果是,代码哪里实现的?
个人觉得这个应该是在iptables里实现的,因为每下一条规则,都相当于把某个表取出来,更新之后,又重新下到内核的,所以应该是在应用层调整好的。但是找了一通,没找到相应的代码。
是不是根本上的理解有问题?
& 回复于: 16:43:18
我想问一下,iptable的工作原理,是不是就是说,先创建一些规则在用户空间,然后,讲这些规则通过netlink与内核的netfilter通信。然后让netfilter匹配这些规则。
理解不对的话,能捎带的讲一下吗?:lol:
& 回复于: 16:46:18
引用:原帖由&sunorr&于&&16:43&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695883&ptid=1022438]
我想问一下,iptable的工作原理,是不是就是说,先创建一些规则在用户空间,然后,讲这些规则通过netlink与内核的netfilter通信。然后让netfilter匹配这些规则。
理解不对的话,能捎带的讲一下吗?:lol:&
没有用netlink,而是同getsockopt和setsockopt来实现获取规则和下载规则的。
& 回复于: 16:46:59
看一下偶47楼中间的那部分解释。。。。
& 回复于: 16:58:23
引用:原帖由&Godbach&于&&16:46&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695889&ptid=1022438]
没有用netlink,而是同getsockopt和setsockopt来实现获取规则和下载规则的。&
netlink不就是采用的setsockopt的一种用户、内核空间的通讯方式么?
& 回复于: 16:58:58
引用:原帖由&Godbach&于&&16:46&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695889&ptid=1022438]
没有用netlink,而是同getsockopt和setsockopt来实现获取规则和下载规则的。&
在libiptc中有实现,呵呵。
我前半部分理解的对吗?
& 回复于: 16:59:33
引用:原帖由&jaycu&于&&16:58&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695915&ptid=1022438]
netlink不就是采用的setsockopt的一种用户、内核空间的通讯方式么?&
呵呵,我不熟悉netlink。只是从代码上看到就是直接setsockopt之类的。有时间了解一下netlink机制。
& 回复于: 17:00:37
和内核通信一共有多少种方式啊?貌似接口很多?
& 回复于: 17:01:48
引用:原帖由&sunorr&于&&16:58&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695918&ptid=1022438]
在libiptc中有实现,呵呵。
我前半部分理解的对吗?&
这样解释吧。iptables命令行执行的时候,每下载一条规则,程序都会现将对应的表比如filter表从内核中取出来。记住,是一整张表。
然后把你的规则插入到这张表的合适的位置。然后再把这张调整后的表通过setsockopt下载到内核中。
& 回复于: 17:03:07
引用:原帖由&jaycu&于&&16:58&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695915&ptid=1022438]
netlink不就是采用的setsockopt的一种用户、内核空间的通讯方式么?&
能帮忙解释一下偶在46,47楼的问题吗,谢谢。
& 回复于: 17:03:28
引用:原帖由&Godbach&于&&17:01&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695926&ptid=1022438]
这样解释吧。iptables命令行执行的时候,每下载一条规则,程序都会现将对应的表比如filter表从内核中取出来。记住,是一整张表。
然后把你的规则插入到这张表的合适的位置。然后再把这张调整后的表通过set&...&
整张表给了内核以后,内核就对应着表开始过滤或捕获数据包。然后,就没有用户空间什么事了吧?
& 回复于: 17:05:17
引用:原帖由&sunorr&于&&17:03&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695932&ptid=1022438]
整张表给了内核以后,内核就对应着表开始过滤或捕获数据包。然后,就没有用户空间什么事了吧?&
给了内核之后,内核接受到这张新的表,就把内核中原先的表替换掉了。再来新的数据包,就按照新表中的规则进行匹配了。
iptables命令行主要负责下载规则,其余的就是内核的工作了。当然还有显示规则什么的,是命令行的工作。
& 回复于: 17:08:26
但是,我又有疑问了,那为什么说iptables不能做为企业级别的防火墙呢?&netfilter按照规则匹配后,效率是最高的了,但是企业级的防火墙还怎么优化啊?
& 回复于: 17:10:06
引用:原帖由&sunorr&于&&17:08&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695948&ptid=1022438]
但是,我又有疑问了,那为什么说iptables不能做为企业级别的防火墙呢?&netfilter按照规则匹配后,效率是最高的了,但是企业级的防火墙还怎么优化啊?&
至于netfilter的效率问题,LZ可以参看端木大侠的文章:
http://blog.chinaunix.net/u/12313/showart_164454.html
& 回复于: 17:12:04
:shock:&如果表是空的,数据包就不经过netfilter吗?不是这样吧?
& 回复于: 17:14:20
引用:综合种种,难怪内核加了netfilter后性能被砍一半。
他确定?!&实验过?我感觉不应该是这样吧?:shock:&
& 回复于: 17:14:22
引用:原帖由&sunorr&于&&17:12&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695958&ptid=1022438]
:shock:&如果表是空的,数据包就不经过netfilter吗?不是这样吧?&
netfilter里面不止一张表的,有nat的,mangle。而且想filter是默认有初始化的。如果不想让数据包经过netfilter。配置内核的时候,直接不编译netfilter就可以了。
& 回复于: 17:15:24
引用:原帖由&sunorr&于&&17:14&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695963&ptid=1022438]
他确定?!&实验过?我感觉不应该是这样吧?:shock:&
对于效率方面,我也不是很了解。但是netfilter的使用对内核是有不小的影响。至少LZ可以从一个方面了解一下NF的效率问题,呵呵
& 回复于: 17:17:43
引用:原帖由&Godbach&于&&17:14&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695964&ptid=1022438]
netfilter里面不止一张表的,有nat的,mangle。而且想filter是默认有初始化的。如果不想让数据包经过netfilter。配置内核的时候,直接不编译netfilter就可以了。&
果然有这个选项。但是,我想知道,企业级的防火墙,用的还是NETFILTER吗?还是改进了的netfilter?还是自己又重新实现了一套相关功能?
& 回复于: 17:19:16
引用:原帖由&Godbach&于&&17:03&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695929&ptid=1022438]
能帮忙解释一下偶在46,47楼的问题吗,谢谢。&
恩,正在死瞅iptables源码,嘿嘿
& 回复于: 17:19:57
引用:原帖由&Godbach&于&&17:15&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695969&ptid=1022438]
对于效率方面,我也不是很了解。但是netfilter的使用对内核是有不小的影响。至少LZ可以从一个方面了解一下NF的效率问题,呵呵&
是对网络上效率的影响吧?可是我是感觉不到
还有表搞错了,你是lz,嘿嘿~,我是慕名来问问题嗒:mrgreen:
& 回复于: 17:20:31
引用:原帖由&sunorr&于&&17:17&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695977&ptid=1022438]
果然有这个选项。但是,我想知道,企业级的防火墙,用的还是NETFILTER吗?还是改进了的netfilter?还是自己又重新实现了一套相关功能?&
企业级的基本上会选择使用硬件防火墙。应该会使用netfilter框架,根据应用的需求,会修改部分代码的。
当然,有的也会根据需求,自己去实现相应的功能,而不是用NF的。
这都是有可能的。
& 回复于: 17:21:53
引用:原帖由&Godbach&于&&17:15&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695969&ptid=1022438]
对于效率方面,我也不是很了解。但是netfilter的使用对内核是有不小的影响。至少LZ可以从一个方面了解一下NF的效率问题,呵呵&
以前实验室的师兄用nf做过一个系统,那个连接追踪巨占资源。。。
& 回复于: 17:24:19
那NF在内核中是在TCP/IP协议栈之前呢?还是之后呢?
& 回复于: 17:24:46
引用:原帖由&sunorr&于&&17:00&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695922&ptid=1022438]
和内核通信一共有多少种方式啊?貌似接口很多?&
内核和用户空间的通信方式大概有八九种吧
& 回复于: 17:24:58
引用:原帖由&jaycu&于&&17:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695996&ptid=1022438]
以前实验室的师兄用nf做过一个系统,那个连接追踪巨占资源。。。&
具体讲讲哈~
& 回复于: 17:25:42
引用:原帖由&dreamice&于&&17:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696008&ptid=1022438]
内核和用户空间的通信方式大概有八九种吧&
哇哦,这么多啊~能帮列出来吗?
& 回复于: 17:25:53
引用:原帖由&jaycu&于&&17:19&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695983&ptid=1022438]
恩,正在死瞅iptables源码,嘿嘿&
呵呵恶,多谢,我臭了半天不知道在哪里。
感觉到就是在append_entry里面,它应该去判断一下是否使用的state扩展。如果这里没有的话,难道是内核在做这样的工作。
要么就是根本上理解错误了。
& 回复于: 17:26:43
引用:原帖由&jaycu&于&&17:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695996&ptid=1022438]
以前实验室的师兄用nf做过一个系统,那个连接追踪巨占资源。。。&
是啊,连接跟踪记录多的时候可以上百万条。很占资源的。
& 回复于: 17:28:09
引用:原帖由&sunorr&于&&17:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696009&ptid=1022438]
具体讲讲哈~&
NF是贯穿整个TCP/IP协议栈的。推荐你看看九贱大师的《netfilter源码分析》。
至于资源占用,反正是加上nf的连接追踪,加上l7的正则匹配,性能损失50%~60%!!!
& 回复于: 17:28:26
引用:原帖由&Godbach&于&&17:26&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696021&ptid=1022438]
是啊,连接跟踪记录多的时候可以上百万条。很占资源的。&
我新手,具体讲讲,怎么连接追踪啊?
& 回复于: 17:30:24
引用:原帖由&sunorr&于&&17:28&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696032&ptid=1022438]
我新手,具体讲讲,怎么连接追踪啊?&
下周把我总结的连接跟踪建立的流程发出来,大家一起交流一下。
同样,九贱大侠的精华贴&netfilter中也将了连接跟踪,可以看一下:
http://linux.chinaunix.net/bbs/thread--1.html
& 回复于: 17:31:44
引用:原帖由&Godbach&于&&17:25&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696015&ptid=1022438]
呵呵恶,多谢,我臭了半天不知道在哪里。
感觉到就是在append_entry里面,它应该去判断一下是否使用的state扩展。如果这里没有的话,难道是内核在做这样的工作。
要么就是根本上理解错误了。&
恩。我其实也是刚开始看iptables源码,我当初是没iptables源码时就开始看九贱大师的iptables源码了,所以很多没搞清楚。刚下了源码,正好结合你的第一楼的帖子,好好瞅瞅。对state选项还真是了解的太少,好好学习一下。
现在去鸟巢瞅瞅让不让远观,哎,没票就只有远观的份儿了。。。
& 回复于: 17:33:42
引用:原帖由&Godbach&于&&17:30&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696041&ptid=1022438]
下周把我总结的连接跟踪建立的流程发出来,大家一起交流一下。
同样,九贱大侠的精华贴&netfilter中也将了连接跟踪,可以看一下:
http://linux.chinaunix.net/bbs/thread--1.html&
LZ真是好人啊哈哈。的确,九贱的《iptables源码分析》、《netfilter源码分析》,我还找到了一份《conntrack源码分析》(忘记是不是他的了,这一串,最近似乎不见九贱说话了。。。那些帖子都是05,06年的了。。。)
& 回复于: 17:34:05
引用:原帖由&jaycu&于&&17:31&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696047&ptid=1022438]
恩。我其实也是刚开始看iptables源码,我当初是没iptables源码时就开始看九贱大师的iptables源码了,所以很多没搞清楚。刚下了源码,正好结合你的第一楼的帖子,好好瞅瞅。对state选项还真是了解的太少,&...&
哈哈,奥运结束了再去看吧。
我这里面没有对-m&state选项分析。但是你可以看一下对-p&tcp分析的时候,他的实现方式是和-m&state类似的。
因为TCP,UDP,&ICMP是三个标注你的扩展匹配,&state的匹配是用单独模块实现的。
& 回复于: 17:36:31
引用:原帖由&jaycu&于&&17:33&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696056&ptid=1022438]
LZ真是好人啊哈哈。的确,九贱的《iptables源码分析》、《netfilter源码分析》,我还找到了一份《conntrack源码分析》(忘记是不是他的了,这一串,最近似乎不见九贱说话了。。。那些帖子都是05,06年的了&...&
05年的高手们,现在肯定都很忙了。其实还有端木隐大侠的文章也写得很好。我基本上是参考了他们的东东。
只不过是按照执行流程的方式总结了一下,感觉我更适合这样的理解方式。如果一分析源码就说init,register的话,反而把握不好这个功能在内核的使用。
不过我的分析都是2.4.22内核的。内核版本比较老啊
& 回复于: 17:41:11
我太佩服你们了,尤其是九贱,他怎么懂得那么多,那么精~佩服,佩服~
& 回复于: 17:42:20
再问个小白问题,iptables&中,哪行代码是把表提交给内核了?
& 回复于: 17:43:07
引用:原帖由&sunorr&于&&17:41&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696080&ptid=1022438]
我太佩服你们了,尤其是九贱,他怎么懂得那么多,那么精~佩服,佩服~&
呵呵,我们都是从哪里学习的。九贱确实比较牛,他说自己当时就是用Source&Insight一句一句跟的代码,可能其他的参考资料都不多。
可是偶呢,也是来回的看了好几遍,有请教了周围的不少人。才算搞懂了一点点啊。
& 回复于: 17:44:11
引用:原帖由&sunorr&于&&17:42&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696085&ptid=1022438]
再问个小白问题,iptables&中,哪行代码是把表提交给内核了?&
看一下Libiptc.c中TC_COMMIT这个函数。
& 回复于: 17:44:19
引用:原帖由&sunorr&于&&17:25&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696013&ptid=1022438]
哇哦,这么多啊~能帮列出来吗?&
1、内核启动参数;
2、模块参数;
3、sysfs;
4、sysctl;
5、系统调用;
6、netlink;
7、procfs;
8、seq_file;
9、debugfs
10、relayfs
& 回复于: 17:45:28
引用:原帖由&dreamice&于&&17:44&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696094&ptid=1022438]
1、内核启动参数;
2、模块参数;
3、sysfs;
4、sysctl;
5、系统调用;
6、netlink;
7、procfs;
8、seq_file;
9、debugfs
10、relayfs&
喔,确实不少啊。呵呵,procfs也是一种不错的方式,很多时候都会用到的。
& 回复于: 17:47:01
引用:原帖由&Godbach&于&&17:43&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696088&ptid=1022438]
呵呵,我们都是从哪里学习的。九贱确实比较牛,他说自己当时就是用Source&Insight一句一句跟的代码,可能其他的参考资料都不多。
可是偶呢,也是来回的看了好几遍,有请教了周围的不少人。才算搞懂了一点&...&
塑料袋也很牛的,不过,貌似他不常来……=。=
& 回复于: 17:47:47
引用:原帖由&dreamice&于&&17:44&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696094&ptid=1022438]
1、内核启动参数;
2、模块参数;
3、sysfs;
4、sysctl;
5、系统调用;
6、netlink;
7、procfs;
8、seq_file;
9、debugfs
10、relayfs&
谢谢哈,的确比较多哈~哪种比较简单易学呢?
& 回复于: 17:48:09
呵呵,高手可能都忙于开发自己的东西了。不像咱们这些初学者,还需要了解很多初级的问题,不在论坛上问,还去哪里呢。:lol:
& 回复于: 17:56:50
引用:原帖由&sunorr&于&&17:47&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696104&ptid=1022438]
谢谢哈,的确比较多哈~哪种比较简单易学呢?&
系统调用最省事了吧,呵呵。
proc也不错。具体的dreamice给咱们讲讲啊。
& 回复于: 18:07:39
引用:原帖由&Godbach&于&&17:44&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696093&ptid=1022438]
看一下Libiptc.c中TC_COMMIT这个函数。&
还是不太明白啊,在终端中执行“iptables&。。。。”&然后规则就生效了,但是,并没有执行iptables-restore呀,而iptc_commit这个函数是出现在iptables-restore.c文件中的啊
晕,具体讲下……:oops:
& 回复于: 18:14:21
[size=3][size=4][color=Blue]又看了一遍九贱兄的netfilter分析。搞清楚了一个问题,mark一下。
问题就是内核中一条规则中所有match是如何匹配的问题。因为iptables传过来的结构体中,并没有包match的处理函数。这里在check_match(iptables.c)中实现了查找全局的链表ipt_match,如果找到该match的话,则将链表中该match对应的匹配函数赋给规则中该match结构的成员:
m-&u.kernel.match&=&
这样在对数据包进行匹配的时候,就可以直接调用具体模块的match函数进行处理了。
------Bingo:em02:[/color][/size][/size][&本帖最后由&Godbach&于&&18:15&编辑&]
& 回复于: 18:17:03
引用:原帖由&sunorr&于&&18:07&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696122&ptid=1022438]
还是不太明白啊,在终端中执行“iptables&。。。。”&然后规则就生效了,但是,并没有执行iptables-restore呀,而iptc_commit这个函数是出现在iptables-restore.c文件中的啊
晕,具体讲下……:oops:&
iptables-restore的具体功能我们有研究。
iptc_commit这个函数还出现在了iptables_standalone.c,这个文件才是整个iptables命令行的入口,有main函数。
& 回复于: 18:17:39
引用:原帖由&sunorr&于&&17:12&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695958&ptid=1022438]
:shock:&如果表是空的,数据包就不经过netfilter吗?不是这样吧?&
netfilter最下面是一堆hook,如果没有规则,那么这些hook就是不干什么了
& 回复于: 18:20:18
引用:原帖由&flw2&于&&18:17&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696134&ptid=1022438]
netfilter最下面是一堆hook,如果没有规则,那么这些hook就是不干什么了&
是的,list_empty为空啊,NF_HOOK就直接执行最后一个参数指定的函数了。
& 回复于: 18:21:28
引用:原帖由&sunorr&于&&17:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696006&ptid=1022438]
那NF在内核中是在TCP/IP协议栈之前呢?还是之后呢?&
net/core/dev.c
int&netif_receive_skb(struct&sk_buff&*skb)
{
&&&&&&&&struct&packet_type&*ptype,&*pt_
&&&&&&&&struct&net_device&*orig_
&&&&&&&&int&ret&=&NET_RX_DROP;
&&&&&&&&unsigned&short&
&&&&&&&&...
&&&&&&&&...
&&&&&&&&/*&类似于tcpdump这样的程序(或者其它使用libpcap的程序)
&&&&&&&&就在这个地方抓到这个包&*/
&&&&&&&&list_for_each_entry_rcu(ptype,&&ptype_all,&list)&{
&&&&&&&&&&&&&&&&if&(!ptype-&dev&||&ptype-&dev&==&skb-&dev)&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(pt_prev)&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ret&=&deliver_skb(skb,&pt_prev,&orig_dev);
&&&&&&&&&&&&&&&&&&&&&&&&pt_prev&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&}
&&&&&&&&...
&&&&&&&&/*&根据是否是桥上的接口,包可能会通过这里到达桥处理包的代码&*/
&&&&&&&&if&(handle_bridge(&skb,&&pt_prev,&&ret,&orig_dev))
&&&&&&&&&&&&&&&&goto&
&&&&&&&&/*&如过桥(2层)不处理该包,那么该包就要走向3层也就是tcp/ip协议栈的网络层了
&&&&&&&&根据是IP协议还是arp协议等,最后把包传递给相应的函数,该函数由协议初始化的时候注册的
&&&&&&&&比如ip_rcv,&ipv6_rcv,&arp_rcv等&*/
&&&&&&&&type&=&skb-&
&&&&&&&&list_for_each_entry_rcu(ptype,&&ptype_base[ntohs(type)&15],&list)&{
&&&&&&&&&&&&&&&&if&(ptype-&type&==&type&&&
&&&&&&&&&&&&&&&&&&&&(!ptype-&dev&||&ptype-&dev&==&skb-&dev))&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(pt_prev)&)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ret&=&deliver_skb(skb,&pt_prev,&orig_dev);
&&&&&&&&&&&&&&&&&&&&&&&&pt_prev&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&}
&&&&&&&&if&(pt_prev)&{)
&&&&&&&&&&&&&&&&ret&=&pt_prev-&func(skb,&skb-&dev,&pt_prev,&orig_dev);//ip_rcv~~~~~~~
&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&/*&没有函数处理这种协议,比如自定义的非arp/ip&的协议&*/
&&&&&&&&&&&&&&&&kfree_skb(skb);
&&&&&&&&&&&&&&&&/*&Jamal,&now&you&will&not&able&to&escape&explaining
&&&&&&&&&&&&&&&&&*&me&how&you&were&going&to&use&this.&:-)
&&&&&&&&&&&&&&&&&*/
&&&&&&&&&&&&&&&&ret&=&NET_RX_DROP;
&&&&&&&&}
out:
&&&&&&&&rcu_read_unlock();
&&&&&&&&return&
}
net/ipv4/ip_input.c
/*
&*&&&&&&Main&IP&Receive&routine.
&*/&
int&ip_rcv(struct&sk_buff&*skb,&struct&net_device&*dev,&struct&packet_type&*pt,&struct&net_device&*orig_dev)
{
&&&&&&&&struct&iphdr&*
&&&&&&&&u32&
&&&&&&&&...
&&&&&&&&...
&&&&&&&&/*&通向netfilter之路&*/}}}
&&&&&&&&return&NF_HOOK(PF_INET,&NF_IP_PRE_ROUTING,&skb,&dev,&NULL,
&&&&&&&&&&&&&&&&&&&&&&&ip_rcv_finish);
inhdr_error:
&&&&&&&&IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
drop:
&&&&&&&&kfree_skb(skb);
out:
&&&&&&&&return&NET_RX_DROP;
}
在netfilter处理之后再往4层走,发包也是类似的
& 回复于: 18:25:47
引用:原帖由&flw2&于&&18:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696136&ptid=1022438]
net/core/dev.c
int&netif_receive_skb(struct&sk_buff&*skb)
{
&&&&&&&&struct&packet_type&*ptype,&*pt_
&&&&&&&&struct&net_device&*orig_
&&&&&&&&int&ret&=&NET_RX_DROP;
&&&&&&&&unsi&...&
版主能否帮忙解释一下偶在46.47楼的问题。也就是带有-m&state的规则,是否被调整到对应CHAIN的规则的开始处?
& 回复于: 18:28:27
引用:原帖由&flw2&于&&18:17&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696134&ptid=1022438]
netfilter最下面是一堆hook,如果没有规则,那么这些hook就是不干什么了&
那怎么还拿nf的效率说事?:em11:
& 回复于: 18:29:31
引用:原帖由&flw2&于&&18:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696136&ptid=1022438]
net/core/dev.c
int&netif_receive_skb(struct&sk_buff&*skb)
{
&&&&&&&&struct&packet_type&*ptype,&*pt_
&&&&&&&&struct&net_device&*orig_
&&&&&&&&int&ret&=&NET_RX_DROP;
&&&&&&&&unsi&...&
受教,等火候到了,也去里面看看去~:em09:
& 回复于: 18:30:21
引用:原帖由&Godbach&于&&18:17&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696132&ptid=1022438]
iptables-restore的具体功能我们有研究。
iptc_commit这个函数还出现在了iptables_standalone.c,这个文件才是整个iptables命令行的入口,有main函数。&
恩,恩,明白啦~回家咯,跟大家求教太开心了~
& 回复于: 18:31:03
引用:原帖由&sunorr&于&&18:30&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696141&ptid=1022438]
恩,恩,明白啦~回家咯,跟大家求教太开心了~&
呵呵,有时间多上来一起交流啊。
偶也回去了,有什么问题晚上再上来研究。
& 回复于: 20:38:08
引用:原帖由&Godbach&于&&18:25&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696137&ptid=1022438]
版主能否帮忙解释一下偶在46.47楼的问题。也就是带有-m&state的规则,是否被调整到对应CHAIN的规则的开始处?&
我还没你熟悉
是自己选择插在CHAIN的头部的
&&&&&&&iptables&[-t&table]&-I&chain&[rulenum]&rule-specification&[options]
& 回复于: 23:09:25
引用:原帖由&flw2&于&&20:38&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696205&ptid=1022438]
我还没你熟悉
是自己选择插在CHAIN的头部的
&&&&&&&iptables&[-t&table]&-I&chain&[rulenum]&rule-specification&[options]&
哦,原来是这样啊。也就是如果使用规则的时候,iptables&—A的话,就会自动加载后面了。所谓的先检查状态,必须是添加规则的时候加到前面的,不是被程序自动调整到前面的啊。
& 回复于: 23:15:15
-m&state对内核来说一点特殊的地方都没有
& 回复于: 23:19:04
引用:原帖由&flw2&于&&23:15&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696409&ptid=1022438]
-m&state对内核来说一点特殊的地方都没有&
应该有个地方有用吧。应该告诉系统如果连接跟踪模块没有加载的话,得先加载这个模块吧。其他的好像确实和别的都一样,没什么特殊的
& 回复于: 00:13:42
谢谢lz,等明天有时间要好好研究研究.我们公司就是研究防火墙的,对于我对防火墙的深入了解肯定帮助不小!
& 回复于: 00:30:09
引用:原帖由&chenyq83&于&&00:13&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696436&ptid=1022438]
谢谢lz,等明天有时间要好好研究研究.我们公司就是研究防火墙的,对于我对防火墙的深入了解肯定帮助不小!&
:em17:&能透漏下你们防火墙细节不?:mrgreen:
& 回复于: 01:37:12
:mrgreen:&:mrgreen:&,又是一大热帖啊。
& 回复于: 07:29:55
引用:原帖由&chenyq83&于&&00:13&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696436&ptid=1022438]
谢谢lz,等明天有时间要好好研究研究.我们公司就是研究防火墙的,对于我对防火墙的深入了解肯定帮助不小!&
好啊,看来做防火墙的公司也很多啊。有问题就上来大家一起讨论啊。
下周再开个Netfilter源码的交流贴,这样应用程序到内核代码都有的交流。
& 回复于: 14:13:06
又是一个大牛人物出现了
& 回复于: 15:41:14
引用:原帖由&wiliiwin&于&&14:13&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6696951&ptid=1022438]
又是一个大牛人物出现了&
呵呵,仔细看一些帖子的内容,你就可以找出真正的大牛了。:lol:
& 回复于: 17:19:21
很好,正准备了解iptable。:lol:
& 回复于: 18:25:19
引用:原帖由&jerrymy&于&&17:19&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6697194&ptid=1022438]
很好,正准备了解iptable。:lol:&
好啊,多上来交流,一起研究iptables。
& 回复于: 11:27:36
强悍的LZ:em10:
& 回复于: 12:06:14
引用:原帖由&Godbach&于&&16:11&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6695807&ptid=1022438]
也就是说带-m&state的规则在存到某个表里的时候,是不是存到表的最前面了。如果是,代码哪里实现的?
个人觉得这个应该是在iptables里实现的,因为每下一条规则,都相当于把某个表取出来,更新之后,又重新下&...&
不好意思,这两天看奥运了,回复的慢了:)
我看了一些东西,先写出来,不过还没有把所有的搞清楚,先写出来一起看看。
Iptables源码中有一个Libxt_state.c,它的第一行写的是:
/*&Shared&library&add-on&to&iptables&to&add&state&tracking&support.&*/&(支持状态追踪的共享库)
它的_init函数是在注册一个state_match结构:
void&_init(void)
{
xtables_register_match(&state_match);
xtables_register_match(&state_match6);
}
这个注册动作是将state_match注册到一个全局的xtables_matches中。具体是调find_match看看是不是有旧的相同名字的match,如果有的话就删了,然后替换掉。
void&xtables_register_match(struct&xtables_match&*me)
{
struct&xtables_match&**i,&*
if&(strcmp(me-&version,&program_version)&!=&0)&{
fprintf(stderr,&"%s:&match&`%s'&v%s&(I'm&v%s).\n",
program_name,&me-&name,&me-&version,&program_version);
/*&Revision&field&stole&a&char&from&name.&*/
if&(strlen(me-&name)&&=&XT_FUNCTION_MAXNAMELEN-1)&{
fprintf(stderr,&"%s:&target&`%s'&has&invalid&name\n",
program_name,&me-&name);
if&(me-&family&&=&NPROTO)&{
fprintf(stderr,
"%s:&BUG:&match&%s&has&invalid&protocol&family\n",
program_name,&me-&name);
/*&ignore&not&interested&match&*/
if&(me-&family&!=&afinfo.family&&&&me-&family&!=&AF_UNSPEC)
old&=&find_match(me-&name,&DURING_LOAD,&NULL);
if&(old)&{
if&(old-&revision&==&me-&revision&&&
&&&&old-&family&==&me-&family)&{
fprintf(stderr,
"%s:&match&`%s'&already&registered.\n",
program_name,&me-&name);
/*&Now&we&have&two&(or&more)&options,&check&compatibility.&*/
if&(compatible_match_revision(old-&name,&old-&revision)
&&&&&&&old-&revision&&&me-&revision)
/*&See&if&new&match&can&be&used.&*/
if&(!compatible_match_revision(me-&name,&me-&revision))
/*&Prefer&!AF_UNSPEC&over&AF_UNSPEC&for&same&revision.&*/
if&(old-&revision&==&me-&revision&&&&me-&family&==&AF_UNSPEC)
/*&Delete&old&one.&*/
for&(i&=&&xtables_&*i!=&i&=&&(*i)-&next);
*i&=&old-&
if&(me-&size&!=&XT_ALIGN(me-&size))&{
fprintf(stderr,&"%s:&match&`%s'&has&invalid&size&%u.\n",
program_name,&me-&name,&(unsigned&int)me-&size);
/*&Append&to&list.&*/
for&(i&=&&xtables_&*i;&i&=&&(*i)-&next);
me-&next&=&NULL;
me-&m&=&NULL;
me-&mflags&=&0;
}
其中&state_match是一个xtables_match结构体,具体如下里面的.parse注册一个state_parse函数指针,
static&struct&xtables_match&state_match&=&{&
=&AF_INET,
=&"state",
.version =&XTABLES_VERSION,
=&XT_ALIGN(sizeof(struct&xt_state_info)),
.userspacesize =&XT_ALIGN(sizeof(struct&xt_state_info)),
=&state_help,
=&state_parse,
.final_check =&state_final_check,
=&state_print,
=&state_save,
.extra_opts =&state_opts,
};
而parse_state函数就是来根据判断state字符串来设置相应位的:
static&int
parse_state(const&char&*state,&size_t&len,&struct&xt_conntrack_info&*sinfo)
{
if&(strncasecmp(state,&"INVALID",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_INVALID;
else&if&(strncasecmp(state,&"NEW",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_BIT(IP_CT_NEW);
else&if&(strncasecmp(state,&"ESTABLISHED",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_BIT(IP_CT_ESTABLISHED);
else&if&(strncasecmp(state,&"RELATED",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_BIT(IP_CT_RELATED);
else&if&(strncasecmp(state,&"UNTRACKED",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_UNTRACKED;
else&if&(strncasecmp(state,&"SNAT",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_SNAT;
else&if&(strncasecmp(state,&"DNAT",&len)&==&0)
sinfo-&statemask&|=&XT_CONNTRACK_STATE_DNAT;
return&1;
}
以上操作即实现了在添加这个共享库的时候全局的xtables_matches中已经有了可以实现解析state的match了。
现在重新回到那个do_command函数中,在解析到&-m&选项的时候,调用:
case&'m':&{
if&(invert)
exit_error(PARAMETER_PROBLEM,
&&&"unexpected&!&flag&before&--match");
m&=&find_match(optarg,&LOAD_MUST_SUCCEED,&&matches);
size&=&IPT_ALIGN(sizeof(struct&ipt_entry_match))
m-&m&=&fw_calloc(1,&size);
m-&m-&u.match_size&=&
strcpy(m-&m-&u.user.name,&m-&name);
set_revision(m-&m-&u.user.name,&m-&revision);
if&(m-&init&!=&NULL)
m-&init(m-&m);
if&(m&!=&m-&next)&{
/*&Merge&options&for&non-cloned&matches&*/
opts&=&merge_options(opts,
&&&&&m-&extra_opts,
&&&&&&m-&option_offset);
if&(opts&==&NULL)
exit_error(OTHER_PROBLEM,
&&&"can't&alloc&memory!");
}
它调用find_match函数根据optarg找相应名字的match(但是我的souceinsight始终找不到这个optarg在哪儿,到底是什么---郁闷!)
[color=Red]###################中间我也不知道怎么回事。。。####################这个{case&"m"}函数段中的那个变量m(xtables_match类型的),一直没找到它是后来是用来干嘛的。。。。同志们也看看吧。[/color]
然后是do_command函数后面调用,e&=&generate_entry(&fw,&matches,&target-&t);
然后就是append_entry往内核里添加了。。。
综上所述,实际上我只找到了parse&state的函数,没找到它到底是加在一个chain的头部还是尾部了。。。。。我觉得就是由match的parse函数去设置要添加的entry追踪状态位。
还有就是,我有个想法,其实Iptables里的match,就是那个全局变量xtables_matches,跟netfilter里match根本不是一回事。前者是实现了对命令行解析的match,后者是对数据包的match。
我看了这些,还会继续看下去,如果哪里错了还望大家及时纠正:)[&本帖最后由&jaycu&于&&12:08&编辑&]
& 回复于: 21:42:20
引用:原帖由&jaycu&于&&12:06&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6698694&ptid=1022438]
不好意思,这两天看奥运了,回复的慢了:)
我看了一些东西,先写出来,不过还没有把所有的搞清楚,先写出来一起看看。
Iptables源码中有一个Libxt_state.c,它的第一行写的是:
/*&Shared&librar&...&
LS的看的细啊。偶感觉到把握住核心的流程,就是do_command(),完成之后就是iptc_commit()。
这个里面并没看出对state的特殊处理。
后来flw版主提示了一下,说其实还是在于添加规则时使用iptables&-A&还是iptables&-I,&使用后者就默认的插到某个链的开头了。所以,如果想让状态监测起作用,就得用iptables&-I添加状态相关的规则。
& 回复于: 09:21:37
引用:它调用find_match函数根据optarg找相应名字的match(但是我的souceinsight始终找不到这个optarg在哪儿,到底是什么---郁闷!)
解析命令行参数用的吧。
man&3&getopt[&本帖最后由&sunorr&于&&09:29&编辑&]
& 回复于: 09:24:11
find_match中的那个iptables_matches,是哪给附上的?
& 回复于: 09:46:56
引用:原帖由&sunorr&于&&09:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6699698&ptid=1022438]
解析命令行参数用的吧。
man&3&getopt&
是的,如果命令是&iptables&-A&INPUT,
optarg指的就是&-A&对应的参数INPUT
& 回复于: 09:48:13
引用:原帖由&sunorr&于&&09:24&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6699702&ptid=1022438]
find_match中的那个iptables_matches,是哪给附上的?&
match列表是在iptables命令执行的是会进行初始化的,所有match模块都会执行init动作,并register该match模块
& 回复于: 15:07:46
引用:原帖由&sunorr&于&&09:21&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6699698&ptid=1022438]
解析命令行参数用的吧。
man&3&getopt&
o&.原来如此。。。C功底太差了。。。
& 回复于: 15:10:31
引用:原帖由&Godbach&于&&21:42&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6699321&ptid=1022438]
LS的看的细啊。偶感觉到把握住核心的流程,就是do_command(),完成之后就是iptc_commit()。
这个里面并没看出对state的特殊处理。
后来flw版主提示了一下,说其实还是在于添加规则时使用iptables&-A&还是&...&
收到!!多谢:)
& 回复于: 15:12:22
引用:原帖由&jaycu&于&&15:10&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6700115&ptid=1022438]
收到!!多谢:)&
今天测试了一下,确实如此,如果你想状态监测优先于规则的话,就要保证状态监测的在规则前面。
& 回复于: 15:59:23
引用:原帖由&jaycu&于&&15:07&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6700110&ptid=1022438]
o&.原来如此。。。C功底太差了。。。&
偶也是通过分析iptables命令行代码,熟悉了getopt_long的使用方式啊。
不过很多网络设备好像不用这种命令行解析的方法。
不知道兄弟在命令行下配置过Router,
好像直接使用的下面的这种方式:
interface&add/set/del&ip&等等。
这样解析起来就比较容易。
& 回复于: 21:03:58
我有个iptables的问题,请教一下
关于fail2ban里面的iptables防范DDOS失败问题请教
http://bbs.chinaunix.net/thread--1.html
我认为这个问题还是在我的原帖回复比较好,便于其他遇到类似问题的朋友查找。
& 回复于: 09:16:13
引用:原帖由&arbor&于&&21:03&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6702230&ptid=1022438]
我有个iptables的问题,请教一下
关于fail2ban里面的iptables防范DDOS失败问题请教
http://bbs.chinaunix.net/thread--1.html
我认为这个问题还是在我的原帖回复比较好,便于其他遇到类似问题&...&
已经回复了。。
& 回复于: 13:29:58
在使用iptables比较容易出错的情况是:
比如:
iptables&-A&INPUT&--dport&21&-j&ACCPET
一定要记住-p对应的有三种默认扩展,TCP,UDP,ICMP,而这三个的扩展参数是不一样的。所以在使用的时候,如果使用的是扩展匹配的参数,一定要包含-p&proto,即:
iptables&-A&INPUT&-p&tcp&--dport&21&-j&ACCPET
偶的同事出现过这样的问题,127楼出现的问题也是这样的。
& 回复于: 17:18:28
iptables似乎没有提供提供对规则进行冲突检测的功能,-A把一条规则加入某个表某个链的最后,-I把一条规则加入某个表某个链的最开始,即使两条规则是矛盾的防火墙也不会有任何提示,是不是这样?
& 回复于: 17:38:12
iptables是顺序匹配的,如果匹配到第一条规则,那就执行对应的target,可能就不会往下匹配其他规则了
& 回复于: 08:04:06
& 回复于: 13:13:22
很不错的分析,要知道一个功能的原理就要从源码下手,没有其他捷径
& 回复于: 13:24:13
引用:原帖由&bekars&于&&13:13&发表&[url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6946313&ptid=1022438]
很不错的分析,要知道一个功能的原理就要从源码下手,没有其他捷径&
恩。这是比较有效的方法,不过前提也得是你了解具体的使用方法。
原文链接:
转载请注明作者名及原文出处}

我要回帖

更多关于 电脑加一个硬盘 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信