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数据包丢弃。

 

插入和取代操作与新增和删除类似,就不再赘述了。

 


 

posted @ 2021-05-25 19:51  大窟窿  阅读(292)  评论(0编辑  收藏  举报