netfilter/iptables 简介
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 简介的更多相关文章
- Netfilter/iptables防火墙
http://os.51cto.com/art/201107/273443.htm [51CTO独家特稿]Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免 ...
- (转)iptables简介
iptables简介 原文:https://www.cnblogs.com/metoy/p/4320813.html netfilter/iptables(简称为iptables)组成Linux平台下 ...
- netfilter/iptables全攻略
转:http://www.linuxso.com/linuxpeixun/10332.html 内容简介防火墙的概述iptables简介iptables基础iptables语法iptables实例案例 ...
- netfilter/iptables 防火墙
目录 文章目录 目录 iptables 与 netfilter 工作机制 规则(Rules) 链(chain) 表(tables) 网络数据包通过 iptables 的过程 总结链.表和规则的关系 i ...
- Linux中级之netfilter/iptables应用及补充
一.iptables介绍 Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常 ...
- Linux 防火墙:Netfilter iptables
一.Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制,而 iptables 只是操作 netfilter 的一个命令行工具(2 ...
- IPTABLES简介
iptables防火墙工作原理 简介:iptables防火墙工作在网络层,针对TCP/IP数据包实施过滤和限制,iptables防火墙基于内核编码实现,具有非常稳定的性能和高效率: iptables属 ...
- (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?
转自:http://blog.chinaunix.net/uid-23069658-id-3160506.html 本人研究linux的防火墙系统也有一段时间了,由于近来涉及到的工作比较纷杂,久而久之 ...
- Netfilter/iptables的匹配方式及处理方法
匹配方式: 匹配方式是netfilter筛选数据包的最基本单元. 内置的匹配方式: 1.接口的匹配方式: iptables -t filter -A FORWARD -i eth0 -o eth1 - ...
随机推荐
- tkinter中Radiobutton单选框控件(七)
Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...
- python中的一等对象--函数
一等对象 什么是一等对象: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 python中的字符串,列表什么的都是一等对象,但对如果之前只是使用c++.jav ...
- 【PAT】B1068 万绿丛中一点红(20 分)
一开始因为看见这题就头疼,可费了点时间. 要考虑所有元素,如果忽略外圈元素,最后一个样例过不去. 而且要求只出现一次的元素, 我没有使用map,因为当时还没学,用map储存元素会节约好多代码 #inc ...
- MySQL面试题之如何优化一条有问题的SQL语句?
如何优化一条有问题的sql语句? 针对sql语句的优化.我们可以从如下几个角度去分析 回归到表的设计层面,数据类型选择是否合理 大表碎片的整理是否完善 表的统计信息,是不是准确的 审查表的执行计划,判 ...
- Linux防火墙基础与编写防火墙规则
Iptables采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,raw表,mangle表,nat表,filter表,每个表容器内包括不同的规则链,根 ...
- asp.net core 中使用StyleCop.StyleCopAnalyzers
1.nuget中安装 StyleCop.Analyzers 当前版本1.1.0-beta004 2.在项目根目录新增 stylecop.json文件 { "settings": { ...
- mysql中case的一个例子
最近遇到一个问题: year amount num 1991 1 1.1 1991 2 1.2 1991 3 1.3 1992 1 2.1 1992 2 2.2 1992 3 3.3 把上面表格的数据 ...
- socket.io+angular.js+express.js做个聊天应用(三)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...
- 转载 Net多线程编程—System.Threading.Tasks.Parallel
.Net多线程编程—System.Threading.Tasks.Parallel System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Paral ...
- ARM汇编语言基础
ARM 与 Thumb 寄存器对应关系 PC寄存器: ARM状态为R15,Thumb状态为PC LR寄存器: ARM状态为R14,Thumb状态为LR SP寄存器: ARM状态为R13,Thumb状态 ...