上一篇文章学习了用户及文件相关权限,本篇继续学习防火墙技术。
防火墙作为公网与内网之间的保护屏障,对系统至关重要。防火墙又分为硬件防火墙和软件防火墙,主要功能都是依据设置的策略对穿越防火墙的流量进行过滤。本篇主要讲解Centos7系统自带的软件防火墙。
由于在初学阶段为了避免干扰很多时候我们都是直接关闭防火墙,但在生产环境这样做是很不安全的,因此我们需要掌握防火墙的相关配置方法。
一、Linux防火墙概述
Linux系统包含两个层面的防火墙,一种是基于TCP/IP的流量过滤工具,另外一种是TCP Wrappers服务。前者包括iptables、firewalld等防火墙,后者是能允许或禁止Linux系统提供服务的防火墙,在更高层面保护系统的安全。
在RHEL7系统中,firewalld取代了之前版本的iptables防火墙,成为默认的防火墙。二者有很大区别,iptables的防火墙策略是交由内核层面的netfilter网络过滤器来处理的,而firewalld则是交由内核层面的nftables包过滤框架来处理。
严格意义上说,iptables和firewalld都不是真正的防火墙,只是用来定义防火墙策略的防火墙管理工具而已,他们都是一种服务。
防火墙管理工具主要是为了方便运维管理人员对防火墙策略进行配置和管理,这类工具思路大同小异,只要掌握一个即可,本文主要讲解firewalld这款防火墙管理工具。
二、firewalld防火墙管理工具
Centos7中集成了多款防火墙工具,其中默认的是firewalld,全称为:Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器。它用于命令行界面CLI或图形用户界面GUI两种管理方式,下文将分别进行介绍。
firewalld相比之前传统的防火墙管理配置工具,它支持动态更新技术并加入了区域(zone)的概念。简单说就是事先定义几套防火墙策略模板,用户根据实际场景进行选择,从而实现策略之间的快速切换。比如设置好home和work区域的策略后,在家就选择home区域,在公司就选择work策略,极大提升了防火墙策略的应用效率。
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 | 同block |
2.1 firewall-cmd
firewall-cmd是 firewalld 防火墙配置管理工具的 CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的。它的参数较多,但是由于centos7已经支持此命令的参数补齐了,所以要多用tab键。下表列出常用的参数及作用,更多参数自行通过man命令进行查看。
参数 | 作用 |
---|---|
--get-default-zone | 查询默认的区域名称 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-zones | 显示可用的区域 |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
--get-services | 显示预先定义的服务 |
--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 | 关闭应急状况模式 |
使用firewall配置策略有两种模式:运行时模式(runtime)、永久模式(permanent)。运行时模式又称为当前生效模式,而且随着系统的重启会失效,它是默认的模式。而如果需要配置永久生效,就需要添加--permanent 参数。
主要注意的是永久模式配置的策略只有重启之后才能自动生效,如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload 命令。
2.1.1 防火墙状态管理
如果安装本系列教程逐步操作的话,系统以及是默认安装了firewalld服务,如果你用的是其他系统或未安装firewalld服务,可以通过命令自行安装即可。安装命令:yum install firewalld firewall-config
- 查看防火墙状态
[root@heimatengyun ~]# firewall-cmd --state
running
[root@heimatengyun ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2019-12-21 21:26:53 CST; 1h 31min ago
Main PID: 915 (firewalld)
CGroup: /system.slice/firewalld.service
└─915 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Dec 21 21:26:53 heimatengyun systemd[1]: Started firewalld - dynamic firewal....
Hint: Some lines were ellipsized, use -l to show in full.
可以使用firewall-cmd --state 或systemctl status firewalld查看防火墙状态。
- 重启防火墙服务
[root@heimatengyun ~]# systemctl restart firewalld.service
注意等同于systemctl restart firewalld,可以省略服务后缀名。
- 停止防火墙服务
[root@heimatengyun ~]# systemctl stop firewalld
[root@heimatengyun ~]# firewall-cmd --state
not running
- 启动防火墙服务
[root@heimatengyun ~]# systemctl start firewalld
[root@heimatengyun ~]# firewall-cmd --state
running
2.1.2 防火墙配置文件
配置文件说明:firewalld 存放配置文件有两个目录,/usr/lib/firewalld/和/etc/firewalld/。前者存放了一些默认的文件,后者主要是存放用户自定义的数据,所以我们添加的service或者rule都在后者下面进行。
[root@heimatengyun ~]# ls /usr/lib/firewalld/
icmptypes services zones
[root@heimatengyun ~]# ls /etc/firewalld/
firewalld.conf icmptypes lockdown-whitelist.xml services zones
server:存储服务数据,就是一组定义好的规则。
zones:存储区域规则。
firewalld.conf:默认配置文件,可以设置默认使用的区域,默认区域为 public,对应 zones目录下的public.xml。
2.1.3 常用配置命令及案例
- 查看当前使用的区域
[root@heimatengyun ~]# firewall-cmd --get-default-zone
public
- 查看当前使用的区域是否允许请求ssh和https协议的流量
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
no
- 设置https协议流量为永久允许并立即生效
[root@heimatengyun ~]# firewall-cmd --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --zone=public --query-service=https
yes
[root@heimatengyun ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@heimatengyun ~]# firewall-cmd --reload
success
- 允许8080和8081端口流量,仅限当前生效
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
[root@heimatengyun ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@heimatengyun ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
2.2 firewall-config
firewall-config是 firewalld 防火墙配置管理工具的 GUI(图形用户界面)版本,几 乎可以实现所有以命令行来执行的操作。即使没有扎实的 Linux 命令基 础,也完全可以通过它来妥善配置 RHEL 7 中的防火墙策略。
2.2.1 主界面
输入命令后,将打开主界面
[root@heimatengyun ~]# firewall-config
顶部的Configuration对应选择是运行模式还是永久模式。
左边Zones选项卡对应的是不同的区域。
2.2.2 配置案例
在使用 firewall-config 工具配置完防火墙策略之后,无须进行二次确认,因为只要有修改内容,它就自动进行保存。
- 配置允许当前区域中http服务流量且仅限当前有效
- 试添加一条防火墙策略规则,使其放行访问 8080~8088 端口(TCP 协议)的流量, 并将其设置为永久生效
添加规则后,还需要reload让配置的策略立即生效。
三、TCP Wrappers服务
TCP Wrappers是RHEL7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。
前文已提到firewalld是基于TCP/IP 协议的流量过滤工具,而 TCP Wrappers 服务则是能允许或 禁止 Linux 系统提供服务的防火墙,从而在更高层面保护了 Linux 系统的安全运行。
TCP Wrappers 服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文 件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。
控制列表 文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应 的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若 找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。
3.1 配置原则
- 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
- 建议先编写拒绝策略规则,再编写允许策略规则。
3.2 常用配置参数
TCP Wrappers服务的控制列表文件中常用的参数如下表:
客户端类型 | 示例 | 满足条件的客户端列表 |
---|---|---|
单一主机 | 192.168.1.1 | ip地址为192.168.1.1的主机 |
指定网段 | 192.168.1. | ip段为192.168.1.0/24的主机 |
指定网段 | 192.168.10.0/255.255.255.0 | IP 段为 192.168.10.0/24 的主机 |
指定 DNS 后缀 | .heimatengyun.com | 所有后缀为.heimatengyun.com的主机 |
指定主机名称 | www.heimatengyun.com | 主机名称为www.heimatengyun.com的主机 |
指定所有客户端 | ALL或* | 所有主机全部包括在内 |
3.3 案例
- 配置指定ip能远程登录到服务器
编辑hosts.deny文件
[root@heimatengyun ~]# vi /etc/hosts.deny
添加:sshd:* 保存并退出。
此时退出远程连接工具,再次远程连接,将无法连接进去。
直接登录虚拟机,并编辑/etc/hosts.allow文件,允许本地电脑的ip能远程连接服务器。
[root@heimatengyun ~]# vi /etc/hosts.allow
添加:sshd:192.168.78. 保存并退出
注意此处的192.168.78. 为你将访问linux的ip地址,根据实际情况进行设置。本文演示的环境中取的是VMnet8的ip地址,而不是宿主机的ip。
然后再次用远程连接工具,发现可以连接上了。