00:00/00:00
本章节已编写及校对完毕,现有奖征集建议、若您发现本章中有错别字或补充欢迎联系刘遄老师QQ:5604583。
章节简述:
保证数据的安全性是继可用性之后最为重要的一项工作,防火墙技术作为公网与内网之间的保护屏障,起着至关重要的作用。面对同学们普遍不了解在红帽RHEL7系统中新旧两款防火墙的差异,刘遄老师决定先带领读者正确的认识在红帽RHEL7系统中firewalld防火墙服务与iptables防火墙服务之间的关系,从理论和事实层面剖析真相。
本章节内将会分别使用iptables、firewall-cmd、firewall-config和Tcp_wrappers等防火墙策略配置服务来完成数十个根据真实工作需求而设计的防火墙策略配置实验,让同学们不仅能够熟练的对请求数据包流量进行过滤,还能够基于服务程序进行允许和关闭操作,做到保证Linux系统安全万无一失。
本章目录结构
8.1 防火墙管理工具保证数据的安全性是继可用性之后最为重要的一项工作,众所周知外部公网相比企业内网更加的“罪恶丛生”,因此防火墙技术作为公网与内网之间的保护屏障,虽然有软件或硬件之分,但主要功能都是依据策略对外部请求进行过滤。防火墙技术能够做到监控每一个数据包并判断是否有相应的匹配策略规则,直到匹配到其中一条策略规则或执行默认策略为止,防火墙策略可以基于来源地址、请求动作或协议等信息来定制,最终仅让合法的用户请求流入到内网中,其余的均被丢弃。
图8-1 防火墙作为公网与内网之间的保护屏障
在红帽RHEL7系统中Firewalld服务取代了Iptables服务,对于接触Linux系统比较早或学习过红帽RHEL6系统的读者来讲,突然改用Firewalld服务后确实不免会有些抵触心理,或许会觉得Firewalld服务是一次不小的改变。但其实Iptables服务与Firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙策略功能的“防火墙管理工具”而已,iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话说,当前在Linux系统中其实同时有多个防火墙管理工具共同存在,它们的作用都是为了方便运维人员管理Linux系统的防火墙策略,而咱们只要配置妥当其中一个就足够了。虽然各个工具之间各有优劣特色,但对于防火墙策略的配置思路上是保持一致的,同学们甚至可以不用完全掌握本章节内的知识,而是在这诸多个防火墙管理工具中任选一款来学透即可,完全能够满足日常的工作所需。
8.2 Iptables在较早期的Linux系统中想配置防火墙默认使用的都是iptables防火墙管理命令,而新型Firewalld防火墙管理服务已经被投入使用多年,但还记得刘遄老师在第0章0.6小节里谈到过企业不愿意及时升级的原因吧,于是不论出于什么样的原因,目前市场上还有大量的生产环境中在使用着iptables命令来管理着防火墙的规则策略。虽然明知iptables可能有着即将被“淘汰”的命运,但为了让同学们不必在面试时尴尬以及看完手中这本《Linux就该这么学》书籍后能“通吃”各个版本的Linux系统,刘遄老师觉得还是有必要把这一项技术好好卖力气讲一下,更何况各个工具的配置防火墙策略思路上大体一致,具有很高的相同性及借鉴意义。
8.2.1 策略与规则链防火墙会从上至下来读取规则策略,一旦匹配到了合适的就会去执行并立即结束匹配工作,但也有转了一圈之后发现没有匹配到合适规则的时候,那么就会去执行默认的策略。因此对防火墙策略的设置无非有两种,一种是“通”,一种是“堵”——当防火墙的默认策略是拒绝的,就要设置允许规则,否则谁都进不来了,而如果防火墙的默认策略是允许的,就要设置拒绝规则,否则谁都能进来了,起不到防范的作用。
iptables命令把对数据进行过滤或处理数据包的策略叫做规则,把多条规则又存放到一个规则链中,规则链是依据处理数据包位置的不同而进行的分类,包括有:在进行路由选择前处理数据包(PREROUTING)、处理流入的数据包(INPUT)、处理流出的数据包(OUTPUT)、处理转发的数据包(FORWARD)、在进行路由选择后处理数据包(POSTROUTING)。从内网向外网发送的数据一般都是可控且良性的,因此显而易见咱们使用最多的就是INPUT数据链,这个链中定义的规则起到了保证私网设施不受外网骇客侵犯的作用。
比如您所居住的社区物业保安有两条规定——“禁止小商贩进入社区,各种车辆都需要登记”,这两条安保规定很明显应该是作用到了社区的正门(流量必须经过的地方),而不是每家每户的防盗门上。根据前面提到的防火墙策略的匹配顺序规则,咱们可以猜想有多种情况——比如来访人员是小商贩,则会被物业保安直接拒绝在大门外,也无需再对车辆进行登记,而如果来访人员是一辆汽车,那么因为第一条禁止小商贩策略就没有被匹配到,因而按顺序匹配到第二条策略,需要对车辆进行登记,再有如果来访的是社区居民,则既不满足小商贩策略,也不满足车辆登记策略,因此会执行默认的放行策略。
不过只有规则策略还不能保证社区的安全,物业保安还应该知道该怎么样处理这些被匹配到的流量,比如包括有“允许”、“登记”、“拒绝”、“不理他”,这些动作对应到iptables命令术语中是ACCEPT(允许流量通过)、LOG(记录日志信息)、REJECT(拒绝流量通过)、DROP(拒绝流量通过)。允许动作和记录日志工作都比较好理解,着重需要讲解的是这两条拒绝动作的不同点,其中REJECT和DROP的动作操作都是把数据包拒绝,DROP是直接把数据包抛弃不响应,而REJECT会拒绝后再回复一条“您的信息我已收到,但被扔掉了”,让对方清晰的看到数据被拒绝的响应。就好比说您有一天正在家里看电视,突然有人敲门,透过“猫眼”一看是推销商品的,咱们如果不需要的情况下就会直接拒绝他们(REJECT)。但如果透过“猫眼”看到的是债主带了几十个小弟来讨债,这种情况不光要拒绝开门,还要默不作声,伪装成自己不在家的样子(DROP),这就是两种拒绝动作的不同之处。
把Linux系统设置成REJECT拒绝动作策略后,对方会看到本机的端口不可达的响应:
[root@linuxprobe ~]# ping -c 4 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. From 192.168.10.10 icmp_seq=1 Destination Port Unreachable From 192.168.10.10 icmp_seq=2 Destination Port Unreachable From 192.168.10.10 icmp_seq=3 Destination Port Unreachable From 192.168.10.10 icmp_seq=4 Destination Port Unreachable --- 192.168.10.10 ping statistics --- 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3002ms把Linux系统设置成DROP拒绝动作策略后,对方会看到本机响应超时的提醒,无法判断流量是被拒绝,还是对方主机当前不在线:
[root@linuxprobe ~]# ping -c 4 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. --- 192.168.10.10 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3000ms 8.2.2 基本的命令参数iptables是一款基于命令行的防火墙策略管理工具,由于该命令是基于终端执行且存在有大量参数的,学习起来难度还是较大的,好在对于日常控制防火墙策略来讲,您无需深入的了解诸如“四表五链”的理论概念,只需要掌握常用的参数并做到灵活搭配即可,以便于能够更顺畅的胜任工作所需。iptables命令可以根据数据流量的源地址、目的地址、传输协议、服务类型等等信息项进行匹配,一旦数据包与策略匹配上后,iptables就会根据策略所预设的动作来处理这些数据包流量,另外再来提醒下同学们防火墙策略的匹配顺序规则是从上至下的,因此切记要把较为严格、优先级较高的策略放到靠前位置,否则有可能产生错误。下表中为读者们总结归纳了几乎所有常用的iptables命令参数,刘遄老师遵循《Linux就该这么学》书籍的编写初衷而设计了大量动手实验,让您无需生背硬记这些参数,可以结合下面的实例来逐个参阅即可。
参数 作用使用iptables命令-L参数查看已有的防火墙策略:
[root@linuxprobe ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere INPUT_direct all -- anywhere anywhere INPUT_ZONES_SOURCE all -- anywhere anywhere INPUT_ZONES all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-host-prohibited ………………省略部分输出