2019-08-18

关键字:iptables、Linux 防火墙


 

iptables 是 Linux 上的一款防火墙配置软件。

 

防火墙的基本概念

防火墙是指工作在计算机设备系统边缘或网络设备边缘,能根据既定的规则对数据报文进行检测并做出相应处理的模块。这一模块既可以是软件也可以是硬件。iptables 是属于软件防火墙的范畴。

 

在 cent os 中防火墙分为内核态组件与用户态组件。其中,内核态的组件是真正用于定义规则并检测数据报文的模块,而用户态的防火墙通常只直到配置内核态的规则的作用。内核态的防火墙名称为 netfilter,用户态的就是 iptables。但这些组件的名称在不同版本的 cent os 上会有不同的叫法。这种 netfileter 和 iptables 的名称是在 cent os 6 上的名称。但通常,我们就简单地认为 iptables 就是 Linux 的防火墙就可以了。

 

Linux 防火墙的简介

对于计算机设备而言,只有它需要与外界进行数据交换时它才有必要去安装防火墙模块。而数据报文的流转方向无非就三种:1、从外部流至本机应用;2、从本机应用发送至外部网络环境;3、从外部经由本机发送至外部网络环境。因此,防火墙最基本的几道“检查门坎”就是输入、输出与转发了。而在 Linux 防火墙中,检查门坎有专有词汇,称为“链”。即“输入链”、“输出链”与“转发链”。但真实的数据报文流转又远不止这么简单,所以还有另外一些有其它用途的链。在 Linux 防火墙中,它们被称为“四表五链”。

 

四表:

1、raw 表

2、mangle 表

3、nat 表

4、filter 表

 

五链:

1、Input Chain

2、Output Chain

3、Forward Chain

4、PreRouting Chain

5、PostRouting Chain

 

不同的表中记载的是用于不同场景下的过滤规则。raw表下的规则是用于确定是否对该数据包进行状态跟踪的,它通常涉及到 prerouting chain 和 output chain。mangle表则用于为数据包设置标记,它通常涉及到全部的五个链。nat表则用于修改数据包中的源、目标地址或端口,它通常涉及到 prerouting chain, postrouting chain 与 output chain。而 filter 表则用于确定是否放行 该数据包,它通常涉及到 input chain, forward chain 与 output chain。

 

在这四张表中,filter 表是用的最多的表,它也是 iptables 默认的表,在你不指定表名时,所写的规则就默认应用到 filter 表下。而对我们非 Linux 运维人员来说,就更是只用的上 filter 表了,甚至于大多数时候都是将防火墙给关掉的。

 

Linux 的防火墙在检查数据包时是按表按链顺序检查的,并且采用一种“匹配即停止”的检查方式,若所配置的规则列表中没有匹配的项,则按默认策略处理。Linux 防火墙表检查顺序为:raw表、mangle表、nat表、filter表。链检查顺序就不说了。

 

iptables语法规则

首先必再次强调,iptables 其实仅仅只是一个配置工具而已,真正起到数据包过滤作用的其实是运行于内核态的 netfilter 模块。我们对 iptables 的操作仅仅是配置过滤规则而已。iptables 的基本语法如下所示

iptables [-t 表名] 选项 [链] [条件] [-j 控制类型]

 

可选择的选项有以下几种:

1、-A

  在指定链的末尾添加一条规则。

2、-I

  在指定链的开头或指定序号处插入一条规则。

3、-L

  列出所有的规则条目。

4、-n

  以数字形式显示IP地址与端口。

5、-v

  以更详细的形式显示当前规则信息。

6、--line-numbers

  显示规则的序号。

7、-D

  删除指定序号的规则。

8、-F

  清空指定表内的所有规则。

9、-P

  为指定的链设置默认的规则。

 

可选择的控制类型有以下几种:

1、ACCEPT

  允许数据包通过。

2、DROP

  丢弃数据包,但不会给出任何回应。

3、REJECT

  丢弃数据包,并且给源端发送回应。

4、LOG

  记录日志信息,然后传递给下一条规则继续匹配。

5、SNAT

  修改数据包源端地址。

6、DNAT

  修改数据包目的端地址。

7、REDIRECT

  重定向。

 

DROP 与 REJECT 选项对于本机来说效果完全一样,都是丢弃数据包。但这两个选项对源端来讲就有很大区别了。DROP 与 REJECT 唯一的区别就是会不会给源端作出回应。而源端在发出一个数据包时通常都会等待目的端的响应信息。若目的端对数据包采取的是 DROP 操作,则源端就只能在那苦等,直至超时。而若目的端采取的是 REJECT,源端就能立即得到响应结果。目的端的两种处理方式对源端的体验就有很大的差别了。

 

iptables 语句要输入的参数还挺多的,但它有一些选项有默认值,在某些情况下可以减少输入量。例如,默认的表名是 filter 表,默认的链是所有链。

 

iptables实例

iptables -t filter -A INPUT -p tcp -j ACCEPT

上面命令表示,在 filter 表中的 input chain 追加一条规则,放行所有的 tcp 入站请求数据包。

 

iptables -I INPUT -p udp -j ACCEPT

上面命令表示,在 filter 表中的 input chain 插入一条规则,放行所有的 udp 入站请求。而若要在指定位置插入规则,则直接在 INPUT 后面加序号即可。在 iptables 的规则中,序号是从 1 开始的。假设我们要将上面的规则插入到第 2 条的位置上,则可以用:

iptables -I INPUT 2 -p udp -j ACCEPT

 

同样地,删除规则也是直接在链名后面加要删除的规则序号即可,假设我们现在要删除规则列表中的第 3 条规则,则:

iptables -D INPUT 3

 

如果规则比较多,数序号不好数,则可以在查询时通过 --line-numbers 参数来列出每条规则的序号,例如:

[chorm@cos101 ~]$ sudo iptables --line-numbers -L


Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
2    ACCEPT     tcp  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

 

查看当前所有规则信息可以使用 iptables -L 命令,加多一个 -v 参数会多显示几列数据出来。

iptables -L -v

[chorm@cos1 ~]$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1157 79453 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             state NEW tcp dpt:ssh
   14   862 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-host-prohibited
    0     0 DROP       tcp  --  any    any     anywhere             anywhere            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 99 packets, 12603 bytes)
 pkts bytes target     prot opt in     out     source               destination

加多一个 -v 参数多显示出来的几列数据,值得我们关注的是最前面两列 pkts 与 bytes。它们表示的是当前规则匹配过的包数量与字节数量(不管是否成功匹配)。通常运维人员可以通过这些信息来调整规则顺序,将比较少出现的数据包类型移到后面,高频类型数据包规则移到前面,这样可以减少规则匹配次数,从而减少系统资源的浪费情况。

 

通过命令行设置的过滤规则都是一次性生效的。在你重启系统以后这些规则就没有了。如果想要让自己配置的规则永久生效,则需要将当前规则导出到外部配置记录文件中。这个用于记录 iptables 配置规则的外部文件位于

/etc/sysconfig/iptables

而保存规则的命令为

service iptables save

 

 

还有更多高级规则的设置暂时就不列了,例如 iptables 的通用匹配规则、隐含匹配规则与显式匹配规则。有需要的话再自行查询详细用法就好了,笔者这边关于 Linux 的防火墙也仅仅是出于拓展知识面的目的来学习的,能达到扫盲的效果就可以了,反正我平时用 Linux 时也是要关掉防火墙的。

 


 

+++