Linux中的防火墙简介
相信上过网的人基本多少都会听说过防火墙这个东西,虽然已经听过很久,但是对这个概念其实了解的不多,尤其是和各种安全软件混淆不清。但其实是不一样的东西。通常意义上我们说的计算机的防火墙是通过对计算机出入进行访问进行控制检测用来增强计算机安全性的一种工具。通常其并不具备我们通常理解的病毒防护,但是它可以通过对访问控制来降低感染病毒的记录。也就是说防火墙主要的作用是隔离,举个例子,在古代的城池都会有城墙,在城池的入口都会有人来检查来往的人群。如果把计算机比作一个城池,这个在城门口检查的人以及这个城墙就是防火墙。
防火墙分类
网络层防火墙
网络层防火墙也叫包过滤防火墙,其工作在OSI七层模型的下面三层,可以对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制 列表( ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议 状态等因素,或他们的组合来确定是否允许该数据包通过。Linux系统内置的iptables和firewalld就是此类防火墙,其优点是处理速度快且易于维护,但缺点也很明显,由于工作在底层协议,所以网络层防火墙并不能对应用层进行控制。
应用层防火墙
应用层防火墙也叫代理服务型防火墙( Proxy Service)它是将所有跨越防火墙的网络通信链路分为两段,内外网用户的访问都是通过代理服务器上的“链接”来实现,优点是在应用层对数据进行检查,比较安全,缺点则是会增加防火墙的负载。实际生产环境中,通常是二者结合使用。
iptables
iptables并不是防火墙,严格来说其只是Linux系统下一个配置防火墙的工具,在Linux的内核中默认是已经集成了防火墙的,叫做Netfilter组件。
四表五链
四表
filter:过滤规则表,根据定义的规则过滤符合条件的数据包
nat:地址转换规则表
mangle:修改数据标记的规则表
raw:关闭NAT表上启用的连接跟踪机制,可以加快数据包穿越防火墙的速度
五链
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
那,如何理解四表五链呢,首先先要清楚一个数据包在一个主机上的可能的路径,明确了这个之后就容易理解了。简单的说一下我的理解大致如下:
数据在到达目标主机之后会先检查路由表以确定是否是属于自己的,属于自己的则接受然后交由对应的程序,如果不属于本机则丢弃或者转发。另外一种情况是自身访问其他主机,则在出口需要查看路由表以确定路径。由此,数据在一台主机一共可以分为三条路,三条路可以有五个节点进行控制。这就是五链。如图:
那什么是四表呢,四表其实就是四张表。四张存储不同规则的表,什么意思呢,五链控制着一个数据包所有可能的路径节点,可是拦截下来要有动作啊,四表就是四种不同的动作,比如我在INPUT节点定义一条filter规则,表示我要对所有经过INPUT的数据包进行过滤。除了filter的其他三个表分别对应了对数据包的不同类型的操作。这里先说filter,也是我们会用的最多的。
如果一个规则同时在多张表中,其优先级是raw–>mangle–>nat–>filter
到这里应该明白了,表是规则,链是规则生效的节点,也就是说他们的关系是一个表对应五个链,即每个表都可以在五个节点进行定义。不过并不是,有些表并不支持五个节点。具体对应关系参照下图。
也就是说一个数据包的流向包含了以下多种选择或者一共有下面这些可能
iptables规则
所谓规则就是对匹配到的条件做指定的动作,匹配可以通过IP,端口,数据包中的内容或者更高级的功能来进行,动作就是对匹配到的数据所要做的操作,比如接收,拒绝,丢弃,修改或者其他,甚至自定义动作。
添加规则,其实如果能理解以上几张图,添加规则就很简单了,不过是一个命令的语法而已。如我要在INPUT节点添加一条针对来自1.1.1.1的filter类型的规则,就可以使用下面的命令。
iptables -t filter -A INPUT -s 1.1.1.1 -j DROP
如此一条简单的规则就被定义了,所有来自1.1.1.1的访问本机的数据包都会被丢弃。其中 -t 用来指定表,-A表示追加一条规则,-s指源地址,-j指定动作。很简单是吧,不过这个会把所有的全部拒掉,除非恶意攻击,我们应该很少会制定这样的规则,那我们还可以针对某个端口或协议如:
iptables -A INPUT -s host -p icmp -j REJECT iptables -A INPUT -p icmp --icmp-type 8 -j REJECT
在第一条规则中对源地址为host的ICMP数据包进行拒绝,第二条表示对所有的ICMP协议中数据包类型为8的数据包进行拒绝。(ICMP数据包类型8表示的是请求包,0位确认包。)
针对某个端口设定访问规则也是很常用的。如:
iptables -A INPUT -p tcp --dport 80 -j drop
直白点说就是禁掉对本机80端口的访问。也可以指定源地址只拒绝某个地址,或网段。
iptables -A INPUT -s 192.168.11.0/24 -p tcp --dport 80 -j drop
但是这种方法对于需要同时禁用多个端口来说会显得很繁琐,不过没关系,有对应的模块可以解决这个问题,使用 -m选项可以使用模块。
iptables -A INPUT -p tcp -m multiport --dports 20:22,80 -j drop
注意这里的指定端口的时候 –dports是有 s 的,在指定单个端口的时候不需要s,还有这里指定端口的时候使用了20:22这样的写法,这种写法用来表示连续的端口。不连续的端口需要使用 , 进行分割。
除此之外我们还可以对数据包上的标记位进行匹配,数据包的标记位是数据在经过对应协议的时候添加的一些额外的信息,如TCP协议数据包中的SYN,ACK,FIN等。
iptables -A INPUT -d host -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP iptables -A INPUT -d host -p tcp --syn -j DROP
以上两条规则的作用是相同的,–tcp-flags用来指定要检查的标记位,以上两条规则的作用都是丢弃SYN为1的TCP数据包(也就是三次握手的请求包。)
其他
在防火墙的规则中,顺序靠前的优先级是比较高的,也就是说如果是用-A进行追加规则的话,新加入的规则是优先级最低的,我们可以使用-I选项来插入,使用此选项的时候新添加的规则会被放到最上边,也就是优先级最高,或者也可以将记录直接插入到指定的位置如下:
iptables -I INPUT 5 -s host -j ACCEPT
编号可以通过–line-numbers进行查看,如:
iptables -nvL --line-numbers
当然除了添加,我们还可以删除或者修改已经存在的记录。
使用-D来删除某个记录,如:
iptables -D INPUT n.
使用-R来修改某个记录
iptables -R INPUT n. -s host -j ACCEPT
初次之外系统默认的防火墙规则是允许的,可以通过-P来进行修改,
iptables -P INPUT DROP
以上的全部示例都是基于filter表的,默认情况下并不需要明确指定,至于其他的表,之后在说。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!