扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:51CTO.COM 2007年11月9日
关键字: Linux 防火墙 CheckPoint iptables ipchains
一条规则分为三部分:
struct ipt_entry file://主要用来匹配IP头
struct ip_match file://额外的匹配(tcp头,mac地址等)
struct ip_target file://除缺省的动作外(如ACCEPT,DROP),可以增加新的(如REJECT)。
man iptable:
>A firewall rule specifies criteria for a packet, and a
>target. If the packet does not match, the next rule in
>the chain is the examined; if it does match, then the next
>rule is specified by the value of the target, which can be
>the name of a user-defined chain, or one of the special
>values ACCEPT, DROP, QUEUE, or RETURN.
2.4内核中网络包与规则的实际匹配在ip_do_table中进行。这段代码的流程在
netfilter hacking howto 4.1.3描述的非常清楚。
简化代码如下:
/* Returns one of the generic firewall policies, like NF_ACCEPT. */
unsigned int
ipt_do_table(struct sk_buff **pskb,
unsigned int hook,
const struct net_device *in,
const struct net_device *out,
struct ipt_table *table,
void *userdata)
{
struct ipt_entry *e;
struct ipt_entry_target *t;
unsigned int verdict = NF_DROP;
table_base = (void *)table->private->entries
+ TABLE_OFFSET(table->private,
cpu_number_map(smp_processor_id()));
e = get_entry(table_base, table->private->hook_entry[hook]);
...
ip_packet_match(ip, indev, outdev, &e->ip, offset);
...
IPT_MATCH_ITERATE(e, do_match, *pskb, in, out, offset, protohdr, datalen, &hotdrop)
...
t = ipt_get_target(e);
...
verdict = t->u.kernel.target->target(pskb, hook, in, out, t->data, userdata);//非标准的target走这一步
...
return verdict;
}
流程:
--->NF_HOOK();(/include/linux/netfilter.h)
--->nf_hook_slow;(/net/core/netfilter.c)
--->nf_iterate();(/net/core/netfilter.c)
--->然后运行登记的函数;如果你希望有一套ipt_entry结构规则,并将它放到table里,你此时便可调用ipt_do_table来匹配。
在2.4内核中,规则本身也是可扩展的,体现可自己定义并添加新的ip_match和ip_target上。
4.2 FW1
未作分析。
五 与应用层的交互
5.0 综述
防火墙除了内核里的功能以外,还需要在应用层有相应的的配置工具,如添加修改规则等,这就涉及如何与内核通信的问题。
内核模块有三种办法与进程打交道:首先是系统调用,缺点是必须添加新的系统调用或修改原有的,造成对内核代码原有结构的变换;第二种办法是通过设备文件(/dev目录下的文件),不必修改编译原有的代码,但在使用之前要先用mknod命令产生一个这样的设备;第三个办法便是使用proc文件系统。
5.1 ipchains
由于ipchains是已经是内核的正式一部分,它采用了修改系统调用的办法来添加修改命令,采用的办法就是扩展setsockopt系统调用:
int setsockopt (int socket, IPPROTO_IP, int command, void *data, int length)
man ipfw可以获得这方面的细节。
ipchains应用程序首先要需要建立一个raw socket(libipfwc.c),然后在之上调用setsockopt。
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
调用顺序:
ipchains在应用层调用setsockopt,进入内核:
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。