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 - ...
随机推荐
- java 基础one ---运算符and流程控制
首先java这个了解下java的基础 首先java文件都是以.java结尾的 然后 他所有的内容都是有一个入口的就是放在了public static void main(String [] args ...
- 实验吧web解题记录
自以为sql注入掌握的还是比较系统的,然而,做了这些题之后才发现,大千世界无奇不有,真是各种猥琐的思路...还是要多学习学习姿势跟上节奏 登录一下好吗?? http://ctf5.shiyanbar. ...
- Hbase-2.0.0_04_Hbase原理
参考博客:Hadoop HBase概念学习系列 参考博客:Hadoop HBase概念学习系列之HBase里的Zookeeper(二十一) 参考博客:Hadoop HBase概念学习系列之HBase里 ...
- Hive-1.2.1_01_安装部署
前言:该文章是基于 Hadoop2.7.6_01_部署 进行的. 1. Hive基本概念 1.1. 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库 ...
- 阿里八八β阶段Scrum(2/5)
今日进度 黄梅玲:尝试修复日程界面的不可点击问题 李嘉群:修改数据库,增加写入识别功能临时文本存入的项 张岳:信息抽取算法的编写 叶文滔:尝试侧边栏的信息调用,但因为侧边栏不是单独的活动,调用碰到了困 ...
- Nginx服务器的图片防盗链
全站的防盗链方法 在/usr/local/webserver/nginx/conf//vhost/xxxx.conf文件要添加防盗链的server段里添加下面的代码: location ~ .*\.( ...
- 【Ansible 文档】【译文】Playbooks 变量
Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...
- jQuery-iframe加载完成后触发的事件监听
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 最近遇到一个问题,要写一个后台管理系统的layout,里面content是一个ifra ...
- SQL数据库中日期时间类型,按日期group by 实现
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code cast(starttime as date): 时间转日期类型 实例SQL: SELECT ...
- 【转】.htaccess详解及.htaccess参数说明
.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...