netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制。iptables 则是一个命令行工具,用来配置 netfilter 防火墙。下图展示了一个带有防火墙的简单网络拓扑结构:

图中的 Linux 主机既充当了路由器的角色,同时又充当了防火墙的角色。本文我们将以该拓扑结构介绍 netfilter/iptables 防火墙中的基本概念和主要功能。
说明:本文的演示环境为 ubuntu 16.04。

netfilter 与 iptables 的关系

netfilter 指整个项目,其官网叫 netfilter.org。在这个项目里面,netfilter 特指内核中的 netfilter 框架,iptables 指运行在用户态的配置工具。

netfilter 在协议栈中添加了一些钩子,它允许内核模块通过这些钩子注册回调函数,这样经过钩子的所有数据包都会被注册在相应钩子上的函数所处理,包括修改数据包内容、给数据包打标记或者丢掉数据包等。netfilter 框架负责维护钩子上注册的处理函数或者模块,以及它们的优先级。netfilter 框架负责在需要的时候动态加载其它的内核模块,比如 ip_conntrack、nf_conntrack、NAT subsystem 等。

iptables 是运行在用户态的一个程序,通过 netlink 和内核的 netfilter 框架打交道,并负责往钩子上配置回调函数。

netfilter 防火墙原理

简单说 netfilter 机制就是对进出主机的数据包进行过滤。 我们可以通过 iptables 设置一些规则(rules)。所有进出主机的数据包都会按照一定的顺序匹配这些规则,如果匹配到某条规则,就执行这条规则对应的行为,比如抛弃该数据包或接受该数据包。下图展示了 netfilter 依据 iptables 规则对数据包过滤的大致过程:

对数据包进行过滤。检查通过则接受(ACCEPT)数据包进入主机获取资源,如果检查不通过,则予以丢弃(DROP)!如果所有的规则都没有匹配上,就通过默认的策略(Policy)决定数据包的去向。注意,上图中的规则是有顺序的!比如数据包与 rule1 指定的规则匹配,那么这个数据包就会执行 action1 指定的行为,而不会继续匹配后面的规则了。

下面我们看一个例子。假设我们的 Linux 主机提供了 web 服务,所以需要放行访问 80 端口的数据包。
但是你发现来自 13.76.1.65 的数据包总是恶意的尝试入侵我们的 web 服务器,所以需要丢弃来自 13.76.1.65 数据包。
我们的 web 服务器并不提供 web 服务之外的其它服务,所以直接丢弃所有的非 web 请求的数据包。
总结后就是我们需要下面三条规则:

  • rule1 丢弃来自 13.76.1.65 数据包
  • rule2 接受访问 web 服务的数据包
  • rule3 丢弃所有的数据包

如果我们不小心把上面的规则顺序写错了,比如写成了下面的样子:

  • rule1 接受访问 web 服务的数据包
  • rule2 丢弃来自 13.76.1.65 数据包
  • rule3 丢弃所有的数据包

这时来自 13.76.1.65 的数据包是可以访问 web 服务的,因为来自 13.76.1.65 的数据包是符合第一条规则的,所以会被接受,此时就不会再考虑第二条规则了。

iptables 中的 table 与 chain

iptables 用表(table)来分类管理它的规则(rule),这也是 iptables 名称的由来。根据 rule 的作用分成了好几个表,比如用来过滤数据包的 rule 就会放到 filter 表中,用于处理地址转换的 rule 就会放到 nat 表中,其中 rule 就是应用在 netfilter 钩子上的函数,用来修改数据包的内容或过滤数据包。下面我们简单的介绍下最常用的 filter 表和 nat 表。
filter
从名字就可以看出,filter 表里面的规则主要用来过滤数据,用来控制让哪些数据可以通过,哪些数据不能通过,它是最常用的表。
nat
里面的规则都是用来处理网络地址转换的,控制要不要进行地址转换,以及怎样修改源地址或目的地址,从而影响数据包的路由,达到连通的目的,这是路由器必备的功能。

下图展示了 iptables 中常用的 tables 及其 rule chains:

从上图可以看出,filter 和 nat 表中默认都存在着数条 rule chain。也就是说表中的规则(rule)又被编入了不同的链(chain),由 chain 来决定什么时候触发 chain 上的这些规则。
iptables 里面有 5 个内置的 chain:

  • PREROUTING:接收的数据包刚进来,还没有经过路由选择,即还不知道数据包是要发给本机还是其它机器。这时会触发该 chain 上的规则。
  • INPUT:已经经过路由选择,并且该数据包的目的 IP 是本机,进入本地数据包处理流程。此时会触发该 chain 上的规则。
  • FORWARD:已经经过路由选择,但该数据包的目的 IP 不是本机,而是其它机器,进入 forward 流程。此时会触发该 chain 上的规则。
  • OUTPUT:本地程序要发出去的数据包刚到 IP 层,还没进行路由选择。此时会触发该 chain 上的规则。
  • POSTROUTING:本地程序发出去的数据包,或者转发(forward)的数据包已经经过了路由选择,即将交由下层发送出去。此时会触发该 chain 上的规则。

我们可以通过下图来理解这五条默认的规则链:

从上图可知,不考虑特殊情况的话,一个数据包只会经过下面三个路径中的一个:
A,主机收到目的 IP 是本机的数据包
B,主机收到目的 IP 不是本机的数据包
C,本机发出去的数据包

  • 路径 A,数据包进入 Linux 主机访问其资源,在路由判断后确定是向 Linux 主机请求数据的数据包,此时主要是通过 filter 表的 INPUT 链来进行控制。
  • 路径 B,数据包经由 Linux 主机转发,没有使用主机资源,而是流向后端主机。在路由判断之前对数据包进行表头的修改后,发现数据包需要透过防火墙去后端,此时的数据包就会通过路径B。也就是说,该封包的目标并非我们的 Linux 主机。该场景下数据包主要经过的链是 filter 表的 FORWARD 以及 nat 表的 POSTROUTING 和 PREROUTING。
  • 路径 C,数据包由 Linux 主机向外发送。比如响应客户端的请求要求,或者是 Linux 主机主动发送出去的数据包,都会通过路径 C。它会先进行路由判断,在确定了输出的路径后,再通过 filter 表的 OUTPUT 链来传送。当然,最终还是会经过 nat 表的 POSTROUTING 链。

由此我们可以总结出下面的规律。
filter 表主要跟进入 Linux 主机的数据包有关,其 chains 如下:

  • INPUT:主要与想要进入 Linux 主机的数据包有关
  • OUTPUT:主要与 Linux 主机所要发送出去的数据包有关
  • FORWARD:与 Linux 主机没有关系,它可以对数据包进行转发

nat(地址转换) 表主要在进行来源与目的之 IP 或 port 的转换,其 chains 如下:

  • PREROUTING:在进行路由判断之前所要执行的规则(DNAT)
  • POSTROUTING:在进行路由判断之后所要执行的规则(SNAT)
  • OUTPUT:与发送出去的数据包有关

iptables 中的规则(rules)

规则(rules)存放在特定表的特定 chain 上,每条 rule 包含下面两部分信息:

Matching
Matching 就是如何匹配一个数据包,匹配条件很多,比如协议类型、源/目的IP、源/目的端口、in/out接口、包头里面的数据以及连接状态等,这些条件可以任意组合从而实现复杂情况下的匹配。

Targets
Targets 就是找到匹配的数据包之后怎么办,常见的有下面几种:

  • DROP:直接将数据包丢弃,不再进行后续的处理
  • RETURN: 跳出当前 chain,该 chain 里后续的 rule 不再执行
  • QUEUE: 将数据包放入用户空间的队列,供用户空间的程序处理
  • ACCEPT: 同意数据包通过,继续执行后续的 rule
  • 跳转到其它用户自定义的 chain 继续执行

比如下面的规则,只要是来自内网的(192.168.1.0/24)数据包都被接受:

$ sudo iptables -A INPUT -i eth0 -s 192.168.1.0/ -j ACCEPT

用户自定义 chains

除了 iptables 预定义的 5 个 chain 之外,用户还可以在表中定义自己的 chain,用户自定义的 chain 中的规则和预定义 chain 里的规则没有区别,不过由于自定义的 chain 没有和 netfilter 里面的钩子进行绑定,所以它不会自动触发,只能从其它 chain 的规则中跳转过来。比如 docker 就创建了一些自定义的 chain:

总结

netfilter/iptables 是当前 Linux 系统的主要防火墙机制,学习并掌握它可以为我们使用 Linux 系统打下坚实的基础。本文只是介绍了 netfilter/iptables 的概念和原理,在接下来的文章中,笔者将详细地介绍 iptables 命令的用法以及典型用例的设置方法。

参考:
netfilter/iptables简介
Iptables Tutorial
A Deep Dive into Iptables and Netfilter Architecture
《鸟哥的私房菜》

netfilter/iptables 简介的更多相关文章

  1. Netfilter/iptables防火墙

    http://os.51cto.com/art/201107/273443.htm [51CTO独家特稿]Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免 ...

  2. (转)iptables简介

    iptables简介 原文:https://www.cnblogs.com/metoy/p/4320813.html netfilter/iptables(简称为iptables)组成Linux平台下 ...

  3. netfilter/iptables全攻略

    转:http://www.linuxso.com/linuxpeixun/10332.html 内容简介防火墙的概述iptables简介iptables基础iptables语法iptables实例案例 ...

  4. netfilter/iptables 防火墙

    目录 文章目录 目录 iptables 与 netfilter 工作机制 规则(Rules) 链(chain) 表(tables) 网络数据包通过 iptables 的过程 总结链.表和规则的关系 i ...

  5. Linux中级之netfilter/iptables应用及补充

    一.iptables介绍 Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常 ...

  6. Linux 防火墙:Netfilter iptables

    一.Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制,而 iptables 只是操作 netfilter 的一个命令行工具(2 ...

  7. IPTABLES简介

    iptables防火墙工作原理 简介:iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防火墙基于内核编码实现,具有非常稳定的性能和高效率: iptables属 ...

  8. (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?

    转自:http://blog.chinaunix.net/uid-23069658-id-3160506.html 本人研究linux的防火墙系统也有一段时间了,由于近来涉及到的工作比较纷杂,久而久之 ...

  9. Netfilter/iptables的匹配方式及处理方法

    匹配方式: 匹配方式是netfilter筛选数据包的最基本单元. 内置的匹配方式: 1.接口的匹配方式: iptables -t filter -A FORWARD -i eth0 -o eth1 - ...

随机推荐

  1. [20171227]表的FULL_HASH_VALUE值的计算.txt

    [20171227]表的FULL_HASH_VALUE值的计算.txt --//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE ...

  2. 洗礼灵魂,修炼python(45)--巩固篇—【转载】类的__now__和__init__

    学到这里了,相信你应该对__init__非常熟悉了,就是构造器呗,当类被实例化时初始化的作用 但__init__其实不是实例化一个类的时候第一个自动调用的方法.当实例化一个类时,最先被调用的方法 其实 ...

  3. C#微信公众号开发——获取access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒(两个小时),微信获取access_token接 ...

  4. oracle中给某个用户某张表的权限设置

    今天碰到需要给数据库上某一个用户,开通其中2张表的查询权限,方法如下: grant select on bas_checkcycle to jdc;这个是整个语句. 语句分析: grant selec ...

  5. 免费ARP

    1. 免费ARP基本概念 免费ARP,也叫Gratutious ARP.无故ARP.这种ARP不同于一般的ARP请求,它的Sender IP和Target IP字段是相同的,相当于是请求自己的IP地址 ...

  6. Python scikit-learn (metrics): difference between r2_score and explained_variance_score?

    I noticed that that 'r2_score' and 'explained_variance_score' are both build-in sklearn.metrics meth ...

  7. MATLAB数值积分法

    MATLAB数值积分法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 许多工程技术和数学研究中要用到定积分,如果无法直接算不出精确值(如含 ...

  8. MATLAB线性方程组的迭代求解法

    MATLAB线性方程组的迭代求解法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 1. 借助矩阵按模最大特征值,判断解方程组的Jacobi ...

  9. Python3编写网络爬虫07-基本解析库pyquery的使用

    三.pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 安装: pip install pyquery 验证: im ...

  10. Linux下编辑、编译、调试命令总结——gcc和gdb描述

    GCC gcc是linux系统集成的编译器.在linux环境下编辑程序,首先需要克服的便是没有集成开发环境的一键式操作所带来的麻烦.这其中涉及命令行操作.编译选项的设定.文件依赖关系的书写(makef ...