随着互联网行业快速发展,服务器成为用户部署网络业务重要的网络工具,但随之而来的就是更密集的网络攻击,这给网站带来了很大的阻碍。防火墙作为保障网络安全的主要设备,可以很好的抵御网络攻击。
防火墙基本上使用硬件和软件两种机制来限制流量。可以使用硬件,如电路级网关、代理服务器、应用网关等,来提供深入的保护。亦可以使用软件,如包过滤等手段,允许/禁止流量。如同时使用软硬件进行防护,效果会更好。本文仅讨论软件机制。
从centos7开始,引入firewalld防火墙管理工具,引入区域概念。相较于原版本一直使用的iptables工具,有重大改变。
对于初次接触防火墙管理的读者,只需关注区域、服务、端口、目标和源等概念,全面使用firewalld工具;而对于使用linux老系统、低版本的读者,则只能尽快熟悉"五表五键"等概念,使用iptables管理工具。
PS:centos7系统默认没有安装iptables工具,想训练其使用,需要单独下载、安装。
防火墙底层原理
管理员在用户态,通过防火墙管理工具来设置防火墙的规则,配置在相关文件中。是否应用或启动,由iptables命令接口传递到内核netfilter模块。需要执行时,防火墙的规则由内核中的netfilter模块具体执行。
当数据包经过防火墙时,系统内核会将客户请求逐一与所设置的规则进行匹配,当匹配成功之后,由防火墙执行规则中定义的行为,如放行、阻止、丢弃等。
配置防火墙就是添加、删除、修改这些规则。例如,设置一条规则,拒绝所有的ICMP数据包,设置好该规则之后,该规则就会保存到内核的netfilter模块,之后所有的ICMP数据包都会被拒绝。
防火墙的规则,早期的CentOS 5/6操作系统默认使用iptables工具,从CentOS 7开始,默认使用firewalld工具。
两个管理工具的底层原理在于,iptables从细节入手,从物理层面设置规则,分析网络连接的各个层次,有表有链等。而firewalld从大处着手,从逻辑层面设置规则与要求。区域、目标、源是其核心概念,而关注端口、服务亦具独特视角。
一个系统中只能选择一项管理工具,不能同时使用。原因在于:iptables允许所有流量通过,只限制指定规则的流量;而firewalld则相反,禁止所有流量通过,只允许符合规则的才允许通过。二者原理与手段完全相左。本文主要讨论firewalld的概念与使用。
一、firewalld服务
在CentOS 7中,新引入了firewalld服务,取代了CentOS 6之前的iptables服务。
1.firewalld特点
比较而言,firewalld允许哪些服务可用,哪些端口可用,属于更高一层的防火墙。firewalld提供了支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算),并且拥有两种配置模式:运行时(Runtime)模式和永久(Permanent)模式。
firewalld是一种动态的、用户友好的Linux防火墙管理工具。相较于传统的iptables,firewalld提供了更灵活、更方便的防火墙配置方式,使得管理员能够更容易地管理网络安全策略。
传统的iptables配置可能比较复杂,尤其是对于新手来说。firewalld通过引入概念化的“区域”、“服务”和“端口”等概念,简化了防火墙的配置。管理员无需深入了解iptables的规则语法,只需使用简单的命令和配置文件就能轻松管理防火墙。
2.firewalld核心概念
区域(Zones)
Firewalld引入了"区域"的概念,用于定义不同的网络区域,每个区域可以有不同的防火墙规则。常见的区域包括public、private、work、home等。默认情况下,网络接口会被分配到public区域。
服务(Services)
服务是一组预定义的规则,用于定义允许通过防火墙的特定网络服务。例如,HTTP、SSH等服务都可以被定义为服务,从而简化防火墙规则的配置。
端口(Ports)
端口用于标识网络通信中的特定应用程序。Firewalld允许你通过端口来控制流入或流出的数据包。可以打开或关闭特定端口,也可以定义自定义端口。
源和目标
firewalld允许你根据数据包的来源和目标来定义规则。这使得你可以限制特定IP地址或地址范围的访问,增强了网络安全性。
3.使用方式
a.firewall-cmd
firewall-cmd是firewalld的字符界面管理工具
可以通过远程连接工具,配置防火墙规则。
b.firewall-config
firewall-config是firewalld的图形用户界面管理工具
在系统桌面中,命令行执行firewall-config命令,打开firewalld的图形用户界面管理工具。
如用远程连接工具,如xshell,执行命令firewall-config,将不能打开图形管理工具,提示在windows系统中安装xmanager,可以直接打开该工具且配置防火墙规则。
c.修改firewalld配置文件
firewalld的配置文件分为主配置文件和区域/服务/端口配置文件。
主配置文件位于/etc/firewalld/firewalld.conf,包含一般的Firewalld设置,如默认区域等。
每个区域都有一个对应的配置文件,位于/etc/firewalld/zones/目录下。这些文件包含特定区域的防火墙规则。
服务配置文件位于/etc/firewalld/services/目录下,定义了预定义服务的防火墙规则。
4.管理工具关系
现有防火墙管理手段的基本框架如下,供参考。
二、命令语法
在三种使用firewalld的方法中,我们重点讨论firewall-cmd。
1.启动firewalld
CentOS Stream 9操作系统默认开启了firewalld服务,用户可以使用systemctl命令查看firewalld服务状态。
2.命令格式
firewalld命令格式简单:
firewall-cmd [options..]
firewall-cmd命令常用选项
参数 | 含义 |
--get-default-zone | 查询默认的区域名称 |
--set-default-zone=区域名称 | 设置默认的区域,使其永久生效 |
--get-zones | 显示可用的区域 |
--get--services | 显示预先定义的服务 |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
--add-source= | 将源自此IP或子网的流量导向指定的区域 |
--remove-source | 不再将源自此IP或子网的流量都导向某个指定区域 |
--add-service=服务名 | 设置默认区域允许该服务的流量 |
--add-port=端口号/协议 | 设置默认区域允许该端口的流量 |
--remove-service=服务名 | 设置默认区域不再允许该端口的流量 |
--add-interface=网卡名称 | 将源自该的所有流量都导向某个指定区域 |
--change-interface=网卡名称 | 将某个网卡与区域进行关联 |
--list-all | 显示当前区域的配置参数、资源、端口以及服务等信息 |
--list-all-zones | 显示所有区域的配置参数、资源、端口以及服务等信息 |
--reload | 让永久生效的配置规则立即生效,并覆盖当前的配置规则 |
--panic-on | 开启应急状况模式 |
--panic-off | 关闭应急状况模式 |
3.常见区域
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 | 拒绝流入的流量,除非与流出的流量相关(丢弃) |
4.帮助信息
firewalld命令众多,一般可以通过帮助查看详细使用方法。
5.模式选择
firewalld配置的防火墙策略,分为运行时(Runtime)模式、永久(Permanent)模式两种。
默认的是运行时(Runtime)模式,配置的策略便会立即生效,但是,系统一旦重启就会失效。
永久生效(Permanent)模式,可以使firewalld配置永久生效,但是,此模式需要重启系统,或者手动执行firewall-cmd --reload命令,配置的策略才会立即生效。
三、使用技巧
1.命令应用别名
firewalld命令比较复杂,也不易录入,可以设置别名,加快录入,并确保正确无误。建议如下:
alias f=firewall-cmd
alias fz='firewall-cmd --zone=public'
alias fp='firewall-cmd --permanent'
alias fl='firewall-cmd --list-all'
alias fr='firewall-cmd --reload'
2.简写参数/选项
在firewalld命令使用中,系统支持简写。这是系统一大特点,各版本都可应用。
一般是用单词的前三个字母。
--state 简写 --st[ate]
--masquerade 简写 --mas
--permanent 简写 --per
--list-service 简写 --list-ser
--remove-masquerade 简写 --remove-mas
--add-service 简写 --add-ser
3.补全
正常使用firewall-cmd命令录入参数时,可以按Tab键补全命令,按两次,可以提示可选择的内容。
如使用别名,不再支持Tab键补全。
4.符号使用
a.空格
在使用firewalld命令中,可以用空格代替=号
执行上述命令时,可用空格代替=号,功能相同。
了解这一特性后,可用空格代替命令中的=号,录入时相对容易些。
b.双引号
在配置富规则时,根据习惯,可以加双引号。
配置一条富规则,拒绝192.168.100.2主机的ssh服务:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.2" service name="ssh" reject'
第1次添加时命令中加双引号。查看效果后删除该富规则。
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.100.2" service name="ssh" reject'
第2次添加时不加双引号,效果相同
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.100.2 service name=ssh reject'
c.=号
我们添加一个httpd服务,把=号替换为空格,结果相同
firewall-cmd --add-service http
d.-
添加多个端口时,开始端口加上“-”结束端口:
四、案例
首先使用systemctl命令,查看firewalld(防火墙)的状态(status)、重新启动(restart)、临时关闭(stop)、临时开启(start)防火墙服务。
1.查看使用区域
查看firewalld服务当前所使用的区域
命令:
firewall-cmd --get-default-zone
效果:
2.查看所有信息
查看firewalld当前区域的配置参数、资源、服务等信息
命令:
firewall-cmd --list-all
效果:
(3)查看单项信息
查看public区域是否允许https服务和FTP协议数据包通过
命令:
firewall-cmd --zone=public --query-service=https
firewall-cmd --zone=public --query-service=ftp
效果:
(4)永久设置
将https设置为永久允许,并立即生效
命令中添加选项--permanent,为永久设置;没有此选项,为临时设置。
命令:
firewall-cmd --permanent --zone=public --add-service=https #设置规则
firewall-cmd –reload #立即生效
firewall-cmd --zone=public --query-service=https
效果:
将http设置为永久允许,并立即生效
命令:
f --zone public --add-ser http --per #--per位置任意
f –rel #使规则生效,用命令别名和简写
f --list-ser #查看所有允许的服务
效果:
(5)设置端口
将10000端口的数据包设置为允许,仅限当前有效
命令:
firewall-cmd --list-port #默认查看当前的区域
firewall-cmd --zone=public --add-port=10000/tcp
firewall-cmd --list-port #不加--zone=public时,默认查看当前的区域
效果:
(6)设置富规则
配置一条富规则,拒绝172.168.1.0/24网段的所有用户访问本机的ssh服务
命令:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service="ssh" reject'
效果:
基础规则是设置前几项,而最后一项是富规则。