一. 什么是netfilter

netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack. A registered callback function is then called back for every packet that traverses the respective hook within the network stack.

iptables is a generic table structure for the definition of rulesets. Each rule within an IP table consists of a number of classifiers (iptables matches) and one connected action (iptables target).

netfilter, ip_tables, connection tracking (ip_conntrack, nf_conntrack) and the NAT subsystem together build the major parts of  the packet filtering framework. Software inside this framework enables packet filtering, network address [and port] translation (NA[P]T) and other packet mangling.

linux防火墙通常包含两部分,分别为iptables和netfilter。iptables是linux管理防火墙规则的命令行工具,处于用户空间。netfilter执行报文过滤,处于linux内核空间。有时也将iptables统称linux防火墙。

Netfilter提供了过滤网络数据报的底层机制。Netfilter提供了基于其上的一整套工具集合,即其各个子系统,包括:连接跟踪、NAT、xtables、iptables/iptables6、nftables、arptables。

在netfilter的官网www.netfilter.org上,可以看到netfilter的一个子项目patch-o-matic,其中收录了大量的各种定制kernel modules,这些modules给我们展示了很多使用例程。

netfilter的优势不仅包含防火墙的实现,还包括各种报文的处理工作(如报文的加密、统计等)。用户可以方便地利用netfilter提供的接口实现内核层的报文处理。

二. netfilter框架

netfilter在linux内核中的IPv4、IPv6和DECnet等网络协议栈中都有相应的实现。以常用的IPv4协议栈上netfilter的实现为例说明。

IPv4协议栈为了实现对netfilter架构的支持,在IP包的IPv4协议栈上的传递过程之中,选择了5个检查点。在这5个检查点上,各引入了一行对NF_HOOK()宏函数的一个相应的调用:

PREROUTING、LOCAL-IN、FORWARD、LOCAL-OUT和POSTROUTING。

利用netfilter中的5个参考点,查阅用户注册的回调函数,根据用户定义的回调函数来监视进出的网络数据包,是netfilter的基本实现框架。

netfilter核心代码位于linux/net/netfilter目录下。

1. 如何切入协议栈

在IPv4协议栈中,netfilter在IP数据包的路线上选取了5个挂节点(HOOK)。这5个点,在合适的位置对NF_HOOK()宏函数进行了调用。

static inline int
NF_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb,
struct net_device *in, struct net_device *out,
int (*okfn)(struct sk_buff *))
{
return NF_HOOK_THRESH(pf, hook, skb, in, out, okfn, INT_MIN);
}

pf:协议族,如PF_INET、PF_INET6、PF_DECnet等
hook:HOOK点,如:PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT、POST_ROUTING
skb:sk_buff
indev:数据包入站的设备(某些情况下为空值)
outdev:数据包出站的设备(某些情况下为空值)
okfn:  函数指针,指向协议栈下一步的处理函数,当Netfilter该HOOK点流程结束时调用该函数。

示例:

int ip_forward(struct sk_buff *skb)
{
    /* protocol stack processing */    return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev,
               rt->dst.dev, ip_forward_finish);
}

2. 回调函数

netfilter定义了一个全局变量来存储用户的回调函数:

struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS] __read_mostly;
EXPORT_SYMBOL(nf_hooks);

NFPROTO_NUMPROTO是协议类型,可以是TCP、UDP或IP协议。NF_MAX_HOOKS是挂接的钩子的最大数量。

用户可以挂接回调函数到netfilter架构上,函数为nf_register_hook()。

int nf_register_hook(struct nf_hook_ops *reg)
{
struct nf_hook_ops *elem;
int err; err = mutex_lock_interruptible(&nf_hook_mutex);
if (err < )
return err;
list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {
if (reg->priority < elem->priority)
break;
}
list_add_rcu(&reg->list, elem->list.prev);
mutex_unlock(&nf_hook_mutex);
#if defined(CONFIG_JUMP_LABEL)
static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
#endif
return ;
}
EXPORT_SYMBOL(nf_register_hook);

可以看出注册函数根据优先级,将用户的回调函数放到全局变量nf_hooks中。

回调函数用结构体struct nf_hook_ops存储:

struct nf_hook_ops;
typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *)); struct nf_hook_ops {
struct list_head list; /* User fills in from here down. */
nf_hookfn *hook;
struct module *owner;
void *priv;
u_int8_t pf;
unsigned int hooknum;
/* Hooks are ordered in ascending priority. */
int priority;
};

回调函数的返回值:

NF_ACCEPT 继续正常传输数据报
NF_DROP 丢弃该数据报,不再传输
NF_STOLEN 模块接管该数据报,告诉Netfilter“忘掉”该数据报
NF_QUEUE 对该数据报进行排队,等待用户空间的进程处理
NF_REPEAT 再次调用该回调函数
NF_STOP 终止Netfilter的后续处理,将数据报交还给协议栈

实现注册回调函数步骤:

1. 实现自己的HOOK函数;
2. 初始化一个struct nf_hook_ops的对象;
3.调用nf_register_hook注册HOOK函数,注销时调用nf_unregister_hook;也可以调用nf_register_hooks和nf_unregister_hooks一次注册注销多个HOOK函数;

三. iptables

Iptables是基于netfilter实现的有状态防火墙,Iptables包括用户层工具和内核中的HOOK函数集合。Iptables rule的要素:
Chain:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,对应Netfilter的五个HOOK点
Tables:filter,nat,mangle,raw, security
Match:各种匹配条件,包括标准匹配和扩展匹配
Target:匹配后的目标Action,一条rule可以有多个match,但只能有一个target

防火墙的作用就在于对经过的报文匹配“规则”(match),然后执行对应的“动作”(target)。

参考:

1. http://www.netfilter.org/

2. linux网络编程 宋敬彬

3.  iptables用法

netfiler/iptables的更多相关文章

  1. lamp安装手稿

    1.最重要的东西如何查看帮助 --help 文件夹简易意义:管理类文件夹/boot 启动文件/bin 常用命令/sbin 系统管理员的管理程序/var 存放常修改文件/etc 系统管理用到配置文件/d ...

  2. Linux iptables:规则原理和基础

    什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...

  3. Linux下针对路由功能配置iptables的方法详解

    作为公司上网的路由器需要实现的功能有nat地址转换.dhcp.dns缓存.流量控制.应用程序控制,nat地址转换通过iptables可以直 接实现,dhcp服务需要安装dhcpd,dns缓存功能需要使 ...

  4. iptables (一) 主机防火墙和网络防火墙

    Firewall : 防火墙,隔离工具:工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检测规则作匹配,对于能够被规则所匹配到的报文做出相应处理的组件:有主机防火墙和网络防火墙 Ip ...

  5. iptables

    一.在服务器上打开 22.80.9011端口: iptables -A INPUT -p tcp --dport 9011 -j ACCEPT iptables -A OUTPUT -p tcp -- ...

  6. 浅谈iptables 入站 出站以及NAT实例

    --------------本文是自己工作上的笔记总结,适合的可以直接拿去用,不适合的,适当修改即可!--------------- iptbales默认ACCEPT策略,也称通策略,这种情况下可以做 ...

  7. Failed to stop iptables.service: Unit iptables.service not loaded.

    redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...

  8. CentOS7安装iptables防火墙

    CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...

  9. linux iptables常用命令之配置生产环境iptables及优化

    在了解iptables的详细原理之前,我们先来看下如何使用iptables,以终为始,有可能会让你对iptables了解更深 所以接下来我们以配置一个生产环境下的iptables为例来讲讲它的常用命令 ...

随机推荐

  1. linux下修改文件权限

    加入-R 参数,就可以将读写权限传递给子文件夹例如chmod -R 777 /home/mypackage那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777777是读.写.执行权 ...

  2. 动态计算UITableViewCell高度详解

    本文将介绍四种情况下UITableViewCell的计算方式,分别是: Auto Layout with UILabel in UITableViewCell Auto Layout with UIT ...

  3. 10个常见的Android 新手误区

    在过去十年的移动开发平台中,作为资深的移动开发人员,我们认为Android平台是一个新手最广为人知的平台.它不仅是一个廉价的工具,而且有着良好的开发社区,以及从所周知的编程语言(Java),使得开发A ...

  4. 如何实现IOS_SearchBar搜索栏及关键字高亮

    搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: // ...

  5. surging+CentOS7+docker+rancher2.0 菜鸟部署运行笔记

    https://blog.csdn.net/q5934/article/details/82661250 目录 准备工作 开始干活 1.从github 获取surging源码 2.发布Surging. ...

  6. pythonl练习笔记——PythonNet 套接字socket

    1 套接字socket 1.1 套接字概述 套接字,一种网络通讯工具:用于进行网络间的通信,是一种特殊文件类型, 套接字,是一个通信链的句柄,用于描述IP地址和端口,实现向网络发出请求或应答网络请求. ...

  7. Linux内核同步 - Per-CPU变量

    一.源由:为何引入Per-CPU变量? 1.lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt&g ...

  8. Python 字典 values() 方法

    描述 Python 字典 values() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有值. 语法 values() 方法语法: D.values() 参数 无 ...

  9. Python len() 方法

    描述 Python len() 方法返回对象(字符串.列表.元组.字典等)长度或项目个数. 语法 len() 方法语法: len(obj) 参数 obj -- 对象(字符串.列表.元组.字典等). 返 ...

  10. /usr/local/ssl/lib/libssl.a: error adding symbols: Bad value

    一.背景 编译第三方库A的时候提示依赖openssl库. 二.编译openssl库 去官网下载最新版本的openssl-1.0.2l.tar.gztar -zxvf openssl-1.0.2l.ta ...