linux学习第十天

    xiaoxiao2023-11-22  169

    在RHEL 7系统中,firewalld防火墙取代了iptables防火墙。对于接触Linux系统比较早或学习过RHEL 6系统的读者来说,当他们发现曾经掌握的知识在RHEL 7中不再适用,需要全新学习firewalld时,难免会有抵触心理。其实,iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。大家甚至可以不用完全掌握本章介绍的内容,只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。

    8.2 Iptables

    在早期的Linux系统中,默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用iptables。考虑到iptables在当前生产环境中还具有顽强的生命力,以及为了使大家在求职面试过程中被问到iptables的相关知识时能胸有成竹,刘遄老师觉得还是有必要在本书中好好地讲解一下这项技术。更何况前文也提到,各个防火墙管理工具的配置思路是一致的,在掌握了iptables后再学习其他防火墙管理工具时,也有借鉴意义。

    8.2.1 策略与规则链

    防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。

    iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:

    在进行路由选择前处理数据包(PREROUTING);

    处理流入的数据包(INPUT);

    处理流出的数据包(OUTPUT);

    处理转发的数据包(FORWARD);

    在进行路由选择后处理数据包(POSTROUTING)。

    一般来说,从内网向外网发送的流量一般都是可控且良性的,因此我们使用最多的就是INPUT规则链,该规则链可以增大黑客人员从外网入侵内网的难度。

    比如在您居住的社区内,物业管理公司有两条规定:禁止小商小贩进入社区;各种车辆在进入社区时都要登记。显而易见,这两条规定应该是用于社区的正门的(流量必须经过的地方),而不是每家每户的防盗门上。根据前面提到的防火墙策略的匹配顺序,可能会存在多种情况。比如,来访人员是小商小贩,则直接会被物业公司的保安拒之门外,也就无需再对车辆进行登记。如果来访人员乘坐一辆汽车进入社区正门,则“禁止小商小贩进入社区”的第一条规则就没有被匹配到,因此按照顺序匹配第二条策略,即需要对车辆进行登记。如果是社区居民要进入正门,则这两条规定都不会匹配到,因此会执行默认的放行策略。

    但是,仅有策略规则还不能保证社区的安全,保安还应该知道采用什么样的动作来处理这些匹配的流量,比如“允许”、“拒绝”、“登记”、“不理它”。这些动作对应到iptables服务的术语中分别是ACCEPT(允许流量通过)、REJECT(拒绝流量通过)、LOG(记录日志信息)、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就会根据策略规则所预设的动作来处理这些流量。另外,再次提醒一下,防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。表8-1总结归纳了常用的iptables命令参数。再次强调,我们无需死记硬背这些参数,只需借助下面的实验来理解掌握即可。

    表8-1                                           iptables中常用的参数以及作用

    参数作用-P设置默认策略-F清空规则链-L查看规则链-A在规则链的末尾加入新规则-I num在规则链的头部加入新规则-D num删除某一条规则-s匹配来源地址IP/MASK,加叹号“!”表示除这个IP外-d匹配目标地址-i 网卡名称匹配从这块网卡流入的数据-o 网卡名称匹配从这块网卡流出的数据-p匹配协议,如TCP、UDP、ICMP--dport num匹配目标端口号--sport num匹配来源端口号

     

    在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 ………………省略部分输出信息………………

    在iptables命令后添加-F参数清空已有的防火墙规则链:

    [root@linuxprobe ~]# iptables -F [root@linuxprobe ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ………………省略部分输出信息………………

    把INPUT规则链的默认策略设置为拒绝:

    [root@linuxprobe ~]# iptables -P INPUT DROP [root@linuxprobe ~]# iptables -L Chain INPUT (policy DROP) target prot opt source destination …………省略部分输出信息………………

    如前面所提到的防火墙策略设置无非有两种方式,一种是“通”,一种是“堵”,当把INPUT链设置为默认拒绝后,就要往里面写入允许策略了,否则所有流入的数据包都会被默认拒绝掉,同学们需要留意规则链的默认策略拒绝动作只能是DROP,而不能是REJECT。

    Firewalld

    RHEL 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。

    相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。例如,我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。当前,我们希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。firewalld中常见的区域名称(默认为public)以及相应的策略规则如表8-2所示。

    表8-2                                     firewalld中常用的区域名称及策略规则

    区域默认规则策略trusted允许所有的数据包home拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量internal等同于home区域work拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量public拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量external拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量dmz拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量block拒绝流入的流量,除非与流出的流量相关drop拒绝流入的流量,除非与流出的流量相关

     

    8.3.1 终端管理工具

    第2章在讲解Linux命令时曾经听到,命令行终端是一种极富效率的工作方式,firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的,大家不要一听到长格式就头大,因为RHEL 7系统支持部分命令的参数补齐,其中就包含这条命令(很酷吧)。也就是说,现在除了能用Tab键自动补齐命令或文件名等内容之外,还可以用Tab键来补齐表8-3中所示的长格式参数了(这太棒了)。

    表8-3                                   firewall-cmd命令中使用的参数以及作用

    参数作用--get-default-zone查询默认的区域名称--set-default-zone=<区域名称>设置默认的区域,使其永久生效--get-zones显示可用的区域--get-services显示预先定义的服务--get-active-zones显示当前正在使用的区域与网卡名称--add-source=将源自此IP或子网的流量导向指定的区域--remove-source=不再将源自此IP或子网的流量导向某个指定区域--add-interface=<网卡名称>将源自该网卡的所有流量都导向某个指定区域--change-interface=<网卡名称>将某个网卡与区域进行关联--list-all显示当前区域的网卡配置参数、资源、端口以及服务等信息--list-all-zones显示所有区域的网卡配置参数、资源、端口以及服务等信息--add-service=<服务名>设置默认区域允许该服务的流量--add-port=<端口号/协议>设置默认区域允许该端口的流量--remove-service=<服务名>设置默认区域不再允许该服务的流量--remove-port=<端口号/协议>设置默认区域不再允许该端口的流量--reload让“永久生效”的配置规则立即生效,并覆盖当前的配置规则--panic-on开启应急状况模式--panic-off关闭应急状况模式

     

    与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

    接下来的实验都很简单,但是提醒大家一定要仔细查看刘遄老师使用的是Runtime模式还是Permanent模式。如果不关注这个细节,就算是正确配置了防火墙策略,也可能无法达到预期的效果。

     

    最新回复(0)