iptables 深入分析

Linux kernel version: 3.18.14    file:  net/ipv4/netfilter/iptables_filter.c

先贴出重要的全局变量struct xt_table  packet_filter:

#define FILTER_VALID_HOOKS ((1 << NF_INET_LOCAL_IN) |  (1 << NF_INET_FORWARD) | (1 << NF_INET_LOCAL_OUT))

static const struct xt_table packet_filter = {
    .name          = "filter",
    .valid_hooks    = FILTER_VALID_HOOKS,
    .me        = THIS_MODULE,
    .af        = NFPROTO_IPV4,
    .priority    = NF_IP_PRI_FILTER,
};

看代码:

1. 最开始的 module_init(iptables_filter_init)

2. iptables_filter_init  -->  register_pernet_subsys(&iptable_filter_net_ops)

             -->  xt_hook_link(&packet_filter, iptable_filter_hook)     /* iptable_filter_hook 也存在于当前这个文件iptables_filter.c 中  */

看看 iptable_filter_net_ops:

static struct pernet_operations iptable_filter_net_ops = {
    .init = iptable_filter_net_init,
    .exit = iptable_filter_net_exit,
};

3. 看看这个网络subsystem的初始化函数:iptable_filter_net_init

--> struct ipt_replace *repl = ipt_alloc_initial_table(&packet_filter)    /* 分配一个初始化的table  */

--> net->ipv4.ipvtable_filter = ipt_register_table(net, &packet_filter, repl)  /* 注册一个table, 并且把它挂在当前这个ipv4命名空间中(Control Groups相关的东东)*/

好! ipt_alloc_initial_table 后的相关存储结构如下图所示:

注意 柔性数组的使用,结构设计的巧妙之处!

a. 这个结构的分配时由xt_alloc_initial_table宏(net/netfilter/xt_repldata.h文件中)完成的

b. tbl->repl.size = nhooks * sizeof(struct ipt_standard) + sizeof(struct ipt_error)

故事发展到这里,内核已经初始化了一个initial table,接下来就把它register到当前的namespace

调用ipt_register_table(net, &packet_filter, repl)  /* 这个 repl就是指向了initial table  */

来看注册的table的存储结构

其中每个entries指向的内存空间是这样赋值的

memcpy(entry, repl->entries, repl->size)

就是把初始化的table的entries指向的内存空间内容copy过来(上一幅图虚线方框的部分)

table注册完后,初始化的initial table被kfree了

表注册好了,接下来执行的是最要的一步:往INET_PROTO的HOOK点上挂载钩子函数:

xt_hook_link(&packet_filter, iptable_filter_hook),xt_hook_link最后调用的就是nf_register_hooks

未完待续...

时间: 2024-11-06 07:17:25

iptables 深入分析的相关文章

25个iptables常用示例

25个iptables常用示例 本文将给出25个iptables常用规则示例,这些例子为您提供了些基本的模板,您可以根据特定需求对其进行修改调整以达到期望.  格式 iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数 -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT) -F 清空规则链 -L 查看规则链 -A 在规则链的末尾加入新规则 -I num 在规则链的头部加入新规则 -D num 删除某一条规则 -s 匹配来源地址IP/M

iptables详解和练习

防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP.数据进行检测. 目前市面上比较常见的有3.4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关. 对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测.但是对于七层的防火墙,不管你

iptables 命令记录

安装 原理 基本命令 实践 脚本 1.安装 以centos 7为例子安装 yum install -q -y iptables-services配置 iptables [-t table] command [match] [target]eg:iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -j ACCEPT保存 service iptables save 重启 systemctl

CentOS7安装iptables防火墙

CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables status #安装iptables yum install -y iptables #升级iptables yum update iptables #安装iptables-services yum install iptables-services 禁用/停止自带的firewalld服务 #停止fir

iptables端口转发

1. 确定forward开启 # cat /proc/sys/net/ipv4/ip_forward1 2. 转发进来的包 iptables -t nat -A PREROUTING -d 111.111.111.111 -p tcp -m tcp --dport 16922 -j DNAT --to-destination 192.168.0.169:22 这表示将目的地为111.111.111.111:16922的包发往 192.168.0.169:22 3. 设置回路 iptables -

Iptables防火墙(一)

一.Linux防火墙基础 Linux防火墙主要工作在网络层,属于典型的包过滤防火墙. netfilter和iptables都用来指Linux防火墙,主要区别是: netfilter:指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于"内核态"的防火墙功能体系. iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于"用户态"的防火墙管理体系. 1.iptables的表.链结构 Ipt

防火墙iptables

防火墙 主配置文件:vim /etc/sysconfig/iptables 想要自定义防火墙,需要把这里的规则清空并且权限设置成DROP 防火墙名字:netfilter,工具:iptables 防火墙有三个表filter,nat,mangle 每个表下面还有链: filter表主要用于过滤包,系统预设的表.内建三个链INPUT.OUTPUT.FORWARD,INPUT作用于进入本机的包,OUTPUT作用于本机送出的包,FORWARD作用于跟本机无关的包. nat表主要用处是网络地址转换,PRER

【整理笔记-防火墙】实现iptables防火墙搭建

搭建防火墙,配置防火墙. - - 系统centos7 . centos7自带firewalld,由于看firewalld命令行没有接触过,所以安装iptables防火墙. 1:禁用firewalld firewall-cmd --state 查看系统自带防火墙状态. 用systemctl stop firewalld.service   禁止立即生效, systemctl disable firewalld.service  永久关闭firewalld.执行完再看一下防火墙状态, 显示为not

iptables man中文手册

名称        iptables - IP包过滤器管理 总览        iptables -ADC  指定链的规则  [-A  添加 -D 删除 -C 修改]        iptables - RI        iptables -D chain rule num[选项]        iptables -LFZ 链名 [选项]        iptables -[NX] 指定链        iptables -P chain target[选项集]        iptables