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 时也是要关掉防火墙的。