iptables快速上手
2021-05-25
关键字:iptables入门、Linux防火墙入门、基础知识
1、什么是iptables?
iptables 顾名思义就是一张记载IP信息的表格。从名称描述上来看就能知道它与网络通信有关。
事实上,iptables是一个运行在Linux平台的用户层的防火墙工具。
何谓用户层呢?
Linux将系统分为两个层次:
1、内核层;
2、用户层;
内核层一般指Linux系统程序及驱动程序,大多数人都接触不到。而用户层则是给普通人用来跑应用程序的环境。
何谓防火墙呢?
计算机领域的防火墙是一个类比的说法。
现实世界中防火墙可以隔绝火灾的漫延,将危险阻隔在高墙之外。此术语在计算机领域也是类似的意思。基于IP地址配置所需的规则,对来往于设备的每一个网络包都先经iptables过滤一遍以决定丢弃或放行。计算机领域的防火墙就是将来自网络世界的“危险”阻隔在高墙之外。
Linux有“两套防火墙”:
1、运行于内核层的netfilter;
2、运行于用户层的iptables。
那为什么要将防火墙分成内核层和用户层两部分的呢?
答案非常简单。
因为无论是用户层还是内核层都有网络通信的需求。而用户又有权自由配置防火墙规则。直接将内核层的配置接口暴露给普通用户是不合理的,所以就有了iptables程序。其实iptables仅仅是一个“传话筒”,用户配置给它的规则会被传递到netfilter中起效。Linux中真正的防火墙是运行于内核的netfilter。
2、iptables概述
下面贴出一份iptables规则表的示例:
# iptables -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere 192.168.1.23 ACCEPT all -- anywhere 192.168.2.0/24 ACCEPT all -- 192.168.77.10 192.168.1.254 DROP all -- 192.168.77.10 192.168.1.254 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination #
上述标红部分可以理解成是一个“规则模块”,即对于“这一类”的网络通信,你想采用什么规则。iptables共提供五种“规则模块”:
1、PREROUTING;
2、POSTROUTING;
3、INPUT;
4、OUTPUT;
5、FORWARD。
后面标绿部分表示此类规则模块中的默认操作方式。操作方式共两种:
1、ACCEPT;
2、DROP。
各类规则模块下方的内容列表就表示各种类型的规则了。
如上述第一类模块:PREROUTING,它的默认规则是 ACCEPT。规则内容为空。即表示:对PREROUTING模块,所有的网络包都ACCEPT放行。
再看到下面的INPUT模块。它的默认规则是DROP,规则内容不为空。这表示,对于INPUT模块,所有不在规则内容里的类型,都DROP丢弃掉。
而iptables的规则是对顺序敏感的,即排在后面的规则内容的优先级大于前面的。
看第一条规则,它表示:对于发往192.168.1.23的TCP包放行,无论它的来源是哪里。
第二条规则,它表示:对于发往192.168.2 网段的任意类型网络包放行,无论它的来源是哪里。
第三条规则要与第四条规则一起看,因为它们是同一条规则。第三条表示对于来自192.168.77.10的发往192.168.1.254的任意类型网络包放行,但第四条则配置为丢弃,系统最终会为后面那条为准,即采取丢弃操作。
后面的可以此类推,就不再赘述了。
3、五链
一般提到iptables总是不得不说它的“四表五链”。四表下一节再说,这里先来看看五链。
所谓五链即上一节中提到的“规则模块”,即在网络通信过程中,适用于不同类型的网络包做过滤的通信规则集合。
五链分别为:
1、INPUT链;
2、OUTPUT链;
3、FORWARD链;
4、PREROUTING链;
5、POSTROUTING链;
INPUT链是用于过滤所有目的设备为本机的网络包的规则集合。
OUTPUT链是用于过滤所有从本机产生并发出去的网络包的规则集合。
FORWARD链是用于过滤所有以本机作为中转站的网络包的规则集合。再说通俗一点,这个网络包不是发给本机的,但是本机知道接下来应该把它传给谁的网络包类型。一般仅路由器才会用到这条链,因为普通网络终端设备默认是关闭“转发/中转”功能的。
PREROUTING链是用于过滤发给本机,但是在传递给应用之前要先做目的地址转换的网络包。一般路由器设备用这条链才比较多吧。
POSTROUTING链与PREROUTING链相对,用于过滤从本机发出,但是在发出之前要先做源地址转换的网络包。同样一般路由器设备才用的上这条链。
讲到这可能有的同学要问了,既然iptables有五条链,为何在上一节的示例中只看到有四条?
别急,下一节就告诉你为什么。
4、四表
除了五条链,iptables还拥有四张表:
1、filter表;
2、nat表;
3、mangle表;
4、raw表;
四表与五链之间是什么关系呢?
就是简单的包含与被包含的关系。链中列出了网络包在某个流向上的过滤规则集合,而表中则囊括了不同的链。
为何要这样划分呢?
因为网络通信是一个复杂的过程,每一张表中的链又都是独立的,只要在网络通信的不同过程应用不同的表,辅以不同的控制规则,就可以对网络通信的控制达到一个非常细粒化的程度。说白了,之所以弄个四表五链,纯粹是为了控制方便。但其控制方便的代价就是系统复杂。
不同的表用途不同,因此其包含的链条也不尽相同。具体如下:
1、filter表包含三个链条:
a. INPUT
b. OUTPUT
c. FORWARD
2、nat表包含三个链条:
a. PREROUTING
b. OUPUT
c. POSTROUTING
3、mangle表包含五条链条:
a. PREROUTING
b. INPUT
c. OUTPUT
d. FORWARD
e. POSTROUTING
4、raw表包含两条链条:
a. PREROUTING
b. OUTPUT
不同的表的用途用文字很难描述清楚,下面直接贴出一张不同流向的网络包及各表与链生效点的图来展示:
5、iptables规则的增删改查
iptables规则配置最权威的手册还得看官方文档,这里贴出地址,想深入学习的可以过去看看:
https://linux.die.net/man/8/iptables
也可通过命令 iptables --help 来查看简略版的帮助文档 。
与传统的Linux程序一致,iptables也是通过运行程序 + 传入参数来配置规则的。
iptables的参数组合非常复杂,但只需要记住以下几个点差不多就能随时享受徒手撸规则的乐趣了。
iptables配规则,必定离不开以下几种参数类型:
1、哪张表;
2、哪条链;
3、哪种操作类型;
新增、删除、插入还是替换?
4、哪种数据类型;
源地址、目的地址、数据类型是什么?
5、哪种操作方式;
放行还是丢弃?
搞清楚目的了敲起命令来就容易了,不用再死记硬背了。
指定哪张表是通过参数 -t / --table 来控制的。如:
iptables -t filter iptables -t nat iptables --table mangle
需要强调的是:表参数是可以省略不写的,默认操作的是 filter 表。
指定哪种操作类型和哪条链是一起的,它是通过参数 -A / --append 与 -D / --delete 来控制的。如:
iptables -A INPUT iptables -D OUTPUT iptables --table nat --append FORWARD
指定哪种数据类型是通过 -s / --source 与 -d / --destination / --dst 与 -p / --protocol 来指定的,分别表示源IP地址,目的IP地址与通信协议。如:
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.2.9 -p tcp iptables -A INPUT -s 192.168.1.0/24 -d 192.168.2.9 -p all iptables -A INPUT -s 192.168.1.7 -p tcp iptables -A INPUT -d 192.168.2.9 -p tcp
指定哪种操作方式是通过参数 -j / --jump 来控制的。如:
iptables -A OUTPUT -d 192.168.2.9 -p all -j DROP
--jump 参数的含义是“跳跃”,它除了配置当一个网络包符合此规则时的操作方式外,还可以控制满足匹配后跳转到另一条由用户定义的链条中。使用 -N / --new-chain 和 -X / --delete-chain 参数可以新增和删除自定义链。
一条完整的配置命令如下所示:
iptables --table filter --append INPUT -s 192.168.1.0/24 -d 192.168.2.9 -p udp --jump DROP
这条命令表示,在 nat 表的INPUT链上增加一条规则,此规则将所有来自192.168.1网段且目的主机为192.168.2.9的的UDP数据包丢弃。
插入和取代操作与新增和删除类似,就不再赘述了。