Linux学习Day12:firewalld防火墙
RHEL7系统中集成了多种防火墙管理工具,其中firewalld服务(Dynamic Firewall Manager of Linux System,Linux系统的动态防火墙管理器)是默认的防火墙配置管理工具。firewalld服务支持动态更新技术并加入了区域的(zone)的概念,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户根据不同的场景选择合适的策略集合,从而实现防火墙策略之间的快速切换。比如,我们的办公电脑需要在办公室和咖啡厅使用,从安全性角度出发,在咖啡厅使用的时候需要配置更严格的防火墙策略。现在只要设置好区域集合,就可以很方便地切换防火墙策略规则。
firewalld中常见的区域名称(默认为public)以及相应的策略规则如下所示:
区域 | 默认规则策略 |
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 | 拒绝流入的流量,除非与流出的流量相关 |
一、终端管理工具——firewall-cmd
firewalld服务的配置工具有两种:一种是基于命令行界面的firewall-cmd命令,另一种则基于图形界面的配置工具。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 | 关闭应急状况模式 |
使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且会随着系统重启而失效。如果想让配置的策略一直存在,就需要使用永久模式(Permanent)模式了,方法就是在firewall-cmd命令设置防火墙策略时添加--permanent参数。但是使用--permanent参数设置策略只有在重启后才能生效,要想立即生效需要手动执行firewall-cmd --reload命令。
- 运行模式(Runtime):立即生效,重启失效
- 永久模式(Permanent):当前无效,重启生效
实验1:查看firewalld服务当前所使用的区域
[root@linuxprobe ~]# firewall-cmd --get-default-zone
dmz
实验2:查询eno16777728网卡在firewalld服务中的区域
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728
dmz
实验3:在firewalld服务中将eno16777728网卡的默认区域修改为external,并在系统重启后生效
[root@linuxprobe ~]# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777728 //运行模式下的区域名称
dmz
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777728 //永久模式下的区域名称
external
实验4:把firewalld服务的默认区域设置为public
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
实验5:启动/关闭firewalld防火墙服务的应急状态模式,阻断一切网络连接(远程连接时慎用)
[root@linuxprobe ~]# firewall-cmd --panic-on //开启应急模式,阻断一切流量
success
[root@linuxprobe ~]# firewall-cmd --panic-off //关闭应急模式
success
实验6:查询public区域是否允许SSH和HTTPS协议的流量
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@linuxprobe ~]# firewall-cmd --query-service=ssh //因为当前为public区域,可以省略--zone参数
yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no
实验7:设置public区域永久允许HTTPS协议的流量,并立即生效
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@linuxprobe ~]# firewall-cmd --reload
success
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
yes
实验8:设置public区域永久拒绝HTTP协议的流量,并立即生效
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxprobe ~]# firewall-cmd --reload
success
实验9:把firewalld服务中访问8080和8081的端口的流量策略设置为允许,但仅限当前生效
[root@linuxprobe ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
实验10:把原本访问888端口的流量转发到22端口,要求当前和永久生效
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:tpaddr=192.168.134.10
success //port=<源端口号>、proto=<协议>、tpport=<目标端口号>、tpaddr=<目标IP地址>
[root@linuxprobe ~]# firewall-cmd --reload
success
[C:\~]$ ssh 192.168.134.10 888 //在windows主机通过888端口远程访问虚拟机
Connecting to 192.168.134.10:888... //成功通过888端口实现远程访问
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sat Mar 21 10:35:58 2020 from 192.168.134.1
[root@linuxprobe ~]#
firewalld服务中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址、目的地址等诸多信息进行更有针对性的策略配置。 它的优先级在所有的防火墙策略中也是最高的。
实验11:配置一条富规则,使其拒绝192.168.134.0/24网段的所有用户访问本主机的SSH服务
[root@linuxprobe ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.134.0/24" service name="ssh" reject"
success
在客户端尝试使用ssh命令来访问虚拟机的ssh服务,结果访问失败。
[C:\~]$ ssh 192.168.134.10 22
Connecting to 192.168.134.10:22...
Could not connect to '192.168.134.10' (port 22): Connection failed.
二、图形管理工具
firewalld服务的图形化管理工具拥有操作简单、功能强大的特点,几乎可以实现所有命令行来执行的操作。输入firewall-config命令就可以进入图形化管理工具(前提是Linux系统拥有图形化界面),如下所示:
[root@linuxprobe ~]# firewall-config
知识补充:在使用firewall-config图形化工具配置完防火墙策略之后,无须进行二次确认。因为只要有修改内容,它就自动保存。
实验1:添加一条防火墙策略规则,允许访问8080~8088端口(tcp协议)的流量通过,并将其设置为永久生效。
第1步:选择永久模式,放行http、https服务的流量
第2步:放行访问8080~8088端口的流量
第3步:点击"Reload Firewalld",让配置的防火墙策略立即生效(相当于firewall-cmd --reload命令)
第4步:关闭防火墙图形配置工具,然后用命令行验证刚才配置的结果
[root@linuxprobe ~]# firewall-cmd --list-ports
8080-8088/tcp
SNAT(Source Network Address Translation,源网络地址转换)技术是一种解决IP地址匮乏而设计的技术,可以使得内网中的多个主机通过同一个外网IP接入Internet。目前该技术已经广泛应用到我们的日常生活中,比如家中的无线路由器。如果企业内网的网关服务器没有应用SNAT技术,互联网中的服务器在接收到内网PC的请求数据包,在发送响应数据包时,将无法在网络中找到这个内网IP地址,所以内网PC就接收不到数据包了,如下图所示:
在使用了SNAT技术的网络中,互联网中的网络服务器就会将响应数据包发送给网关服务器,再由网关服务器发送给内网中的PC主机。
使用iptables命令实现SNAT技术是一件很麻烦的事情,但是在firewalld图形化管理工具中就很简单了。用户只需选中Masquerade zone复选框,就是自动开启了SNAT技术。
实验2:使用firewall-config图形化工具配置防火墙策略,将本机888端口流量转发至22端口,并要求当前和永久生效。
第1步:开启防火墙SNAT技术
第2步:配置本地端口转发
第3步:让防火墙策略规则立即生效
实验3:使用firewall-config图形化工具配置一条富规则,允许192.168.134.1主机访问到本机的1234端口。
知识补充:上图中的"inverted"表示反选,代表除了这个IP地址以外的所有地址
实验4:使用firewall-config图形化工具把网卡与防火墙策略区域进行绑定
四、服务的访问控制列表
TCP Wrappers是RHEL7系统中默认的一款流量控制程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux系统中有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能够允许或禁止Linux系统提供服务的防火墙。
TCP Wrappers服务的防火墙策略由两个控制列表文件所控制,即允许控制列表文件与禁止控制列表文件。控制列表文件修改后立即生效,系统会先检查允许控制文件列表(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则会进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果两个文件都没有匹配到,则默认放行流量。
TCP Wrappers服务的控制列表文件配置起来并不复杂,常用的参数如下所示:
客户端类型 | 示例 | 满足示例的客户端列表 |
单一主机 | 192.168.10.10 | IP地址为192.168.10.10的主机 |
指定网段 | 192.168.10. | IP段为192.168.10.0/24的主机 |
指定网段 | 192.168.10.0/255.255.255.0 | IP段为192.168.10.0/24的主机 |
指定DNS后缀 | .linuxprobe.com | 所有DNS后缀为.linuxprobe.com的主机 |
指定主机名称 | www.linuxprobe.com | 主机名称为www.linuxprobe.com的主机 |
指定所有客户端 | ALL | 所有主机全部包括在内 |
在配置TCP Wrappers服务时需要遵守两个原则:
- 编写拒绝策略规则时,填写的是服务名称,而不是协议名称。举个例子,sshd是服务名称,ssh是协议名称。
- 建议先写拒绝策略规则,再编写允许策略规则。
实验:编写控制列表文件,只允许192.168.134.1主机访问本机的sshd服务
第1步:编写拒绝控制列表文件
[root@linuxprobe ~]# vim /etc/hosts.deny
#
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
#
sshd:* //拒绝所有用户访问本机的sshd服务
[root@linuxprobe ~]# ssh 192.168.134.10
ssh_exchange_identification: read: Connection reset by peer //访问被拒绝
第2步:编写允许控制列表文件,使其放行来自192.168.134.10主机访问sshd服务的流量。
[root@linuxprobe ~]# vim /etc/hosts.allow # # hosts.allow This file contains access rules which are used to # allow or deny connections to network services that # either use the tcp_wrappers library or that have been # started through a tcp_wrappers-enabled xinetd. # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers # sshd:192.168.134.10 //允许192.168.134.10主机访问sshd服务 [root@linuxprobe ~]# ssh 192.168.134.10 root@192.168.134.10's password: Last failed login: Sat Mar 21 16:42:10 BNT 2020 from 192.168.134.10 on ssh:notty There was 1 failed login attempt since the last successful login. Last login: Sat Mar 21 15:25:45 2020 from 192.168.134.1 [root@linuxprobe ~]# //远程访问成功