文章目录
- Firewalld防火墙
- 什么是防火墙
- Firewalld防火墙的概念
- Firewalld防火墙运行模式
- Firewalld防火墙的命令
- Firewalld防火墙的高级规则
Firewalld防火墙
什么是防火墙
防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。
硬件防火墙和软件防火墙的主要区别在于它们的工作原理和应用场景。
工作原理
硬件防火墙是一种独立的网络设备,通常由专门的硬件和软件组成。
它工作在网络层或传输层,通过过滤和分析网络流量来保护网络安全。硬件防火墙通常具有更高的处理能力和速度,可以处理大量的网络流量,同时也可以提供更强的安全性能和可靠性。
软件防火墙则是一种基于软件的安全解决方案,通过在主机上运行防火墙软件来保护网络安全。
软件防火墙通常工作在操作系统内核层,通过监测网络流量和应用程序行为来实现防护。软件防火墙的处理能力和速度通常较低,但它可以提供更灵活、更细致的安全控制和配置,同时也可以在多种操作系统平台上运行。
应用场景
硬件防火墙通常应用于企业级网络或大型数据中心等场景,可以提供全面的安全防护和管理。
硬件防火墙可以对入侵尝试、恶意攻击、病毒和蠕虫等进行检测和防护,同时也可以支持多种安全协议和 VPN 连接。硬件防火墙通常需要专业人员进行配置和管理,成本较高。
软件防火墙则适用于小型企业或个人用户的网络安全保护。
软件防火墙可以在个人计算机或服务器上运行,提供基本的网络安全防护和管理。软件防火墙可以对网络连接和应用程序进行检测和防护,同时也可以进行更灵活的安全控制和配置。软件防火墙通常易于安装和配置,成本较低。
防火墙有很好的保护作用,入侵者首先必须穿越防火墙的安全防线,才能接触目标计算机。
Firewalld防火墙的概念
firewalld是Linux系统上的一种动态防火墙管理工具。它是Red Hat公司开发的,现在已经被很多Linux发行版广泛采用。相比于传统的iptables防火墙,firewalld具有更加灵活和易用的特点,可以实现更加细粒度的网络访问控制。
firewalld防火墙主要包括如下几个方面:
- 区域(zone)
firewalld将网络的不同部分分为若干个区域,每个区域都有一组预定义的规则集合。例如,public区域适用于公共互联网环境下的主机,internal区域适用于内部网络环境下的主机。
区域 | 默认策略 |
---|---|
trusted | 允许所有数据包 |
home | 拒绝流入的流量,除非与流出的流量相关,允许ssh、mdns、ippclient、amba-client、dhcpv6-client服务通过 |
internal | 等同于home |
work | 拒绝流入的流量,除非与流出的流量相关,允许ssh、ipp-client、dhcpv6-client服务通过 |
public | 拒绝流入的流量,除非与流出的流量相关,允许ssh、dhcpv6-client服务通过 |
external | 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过 |
dmz | 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过 |
block | 拒绝流入的流量,除非与流出的流量相关,非法流量采取拒绝操作 |
drop | 拒绝流入的流量,除非与流出的流量相关,废了流量采取丢弃操作 |
- 服务(Service)
在firewalld中,防火墙服务是一组预定义的规则,用于允许或拒绝对特定端口的访问。每个服务都有一个名称,并与一个或多个端口相关联。例如,HTTP服务通常使用端口80,可以定义一个HTTP服务规则来允许对该端口的访问
- 端口(Port)
firewalld防火墙的端口规则是一种基于端口号的规则,用于控制特定端口的访问。它可以允许或拒绝特定端口的进出流量。firewalld中的端口规则可以应用于指定的区域或服务,也可以直接应用于所有区域。
Firewalld防火墙运行模式
firewalld防火墙有两种运行模式:(运行时模式)runtime模式
和(永久模式)permanent模式
。
runtime模式:
runtime模式是指firewalld防火墙在内存中的运行模式
。在这种模式下,所有的防火墙规则都是临时的,它们只会在系统重新启动前保持有效。可以使用firewall-cmd命令在runtime模式下添加、删除、修改防火墙规则,但是这些更改在系统重新启动后会被清除。
permanent模式:
permanent模式是指firewalld防火墙在硬盘上的运行模式
。在这种模式下,所有的防火墙规则都是永久的,它们会被保存在硬盘上,并在系统重新启动后仍然有效。可以使用firewall-cmd命令的--permanent
选项将防火墙规则添加、删除、修改到permanent模式中。
Firewalld防火墙的命令
查看,开启和停止firewalld服务
语法:
systemctl [选项] firewalld
status:检查指定服务的运行状况
start:启动指定服务
stop:停止指定服务
restart:重启指定服务
reload:重新加载指定服务的配置文件
管理firewall配置
firewall-cmd [参数选项1] ... [参数选项n]
常用选项
- 查看防火墙规则:
firewall-cmd --list-all
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 查看可用的zone:
firewall-cmd --get-zones
。
[root@localhost ~]# firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
- 查看当前zone:
firewall-cmd --get-default-zone
。
[root@localhost ~]# firewall-cmd --get-default-zone
public
- 设置默认的zone:
firewall-cmd --set-default-zone=public
。
[root@localhost ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public # 默认就是public,所以再次设置会告诉当前状态已经是public
success # 执行成功
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
- 查看zone的详细信息:
firewall-cmd --zone=public --list-all
。
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 开放端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
。
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 设置成功
- 关闭端口:
firewall-cmd --zone=public --remove-port=80/tcp --permanent
。
[root@localhost ~]# firewall-cmd --zone=public --remove-port=80/tcp --permanent
success # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 开放服务:
firewall-cmd --zone=public --add-service=http --permanent
。
[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 关闭服务:
firewall-cmd --zone=public --remove-service=http --permanent
。
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 允许源IP访问:
firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent
。
[root@localhost ~]# firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources: 192.168.200.0/24
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 拒绝源IP访问:
firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
[root@localhost ~]# firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 重新加载防火墙规则:
firewall-cmd --reload
。
Firewalld防火墙的高级规则
在使用防火墙时,基础规则通常可以满足大多数情况下的需求,例如简单的端口和服务控制等。但是在一些更加复杂的场景下,基础规则的灵活性和细粒度控制就显得有限,这时需要使用高级规则来实现更加精细的流量控制,而 rich rule
就是 firewalld 防火墙中的一种高级规则。
在使用 firewall-cmd
命令设置 rich rule
高级规则时,可以参考以下常用参数:
family
:指定网络协议族,可选值为ipv4
、ipv6
、inet
、inet6
、arp
。例如:family="ipv4"
source address
:指定源 IP 地址,可以为单个 IP、IP 段或 CIDR 网段,例如source address="192.168.1.1"
、source address="192.168.1.1-192.168.1.10"
或source address="192.168.1.0/24"
。port port
:指定端口号,可以为单个端口、端口段或者逗号分隔的多个端口,例如port port="8080"
protocol
:指定协议,可以为tcp
、udp
、icmp
等协议。service name
:指定服务名,可以为/etc/services
中定义的服务名称,如http
、ftp
等。action
:指定动作,可以为accept
、drop
、reject
、masquerade
、redirect
等动作。
要注意的是,在使用 rich-rules
规则时,必须使用双引号将参数值括起来,例如:source address="192.168.1.0/24"
。还有就是,不能同时设置port
和 service name
测试案例
- 启动一个简单的HTTP服务器,可以通过浏览器访问到主机上的文件
[root@localhost ~]# nohup python -m SimpleHTTPServer 8080 > ceshil.log 2>&1 &
# python -m SimpleHTTPServer 8080
# 这行命令的意思是在本地主机上启动一个简单的HTTP服务器
# 监听8080端口,可以通过浏览器访问本地主机上的文件。
- 设置规则
[root@localhost ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" accept' --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" accept
# 我这里仅是展示了高级规则的使用方法,也可以使用基础规则设置。
- 访问浏览器
已经访问到了当前目录下的文件
[root@localhost ~]# ls -al
总用量 522640
dr-xr-x---. 6 root root 4096 6月 6 14:42 .
dr-xr-xr-x. 17 root root 239 5月 28 21:21 ..
-rw-r--r--. 1 root root 254 5月 29 12:17 0520source
drwx------. 4 root root 27 5月 26 13:11 .ansible
-rw-r--r--. 1 root root 113 6月 1 21:15 ansible.yaml
-rwxr-xr-x. 1 root root 8472 5月 29 10:19 a.out
-rw-------. 1 root root 5792 6月 6 13:47 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
drwxr-xr-x. 4 root root 55 6月 2 12:53 ceshi
-rw-r--r--. 1 root root 233 6月 6 14:57 ceshil.log
-rw-r--r--. 1 root root 254 5月 29 10:19 cos_value.c
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r--. 1 root root 535099919 5月 30 12:21 DjangoBlog.tar.gz
-rw-r--r--. 1 root root 86 5月 29 09:23 haha.c
-rw-r--r--. 1 root root 319 5月 29 09:31 main.c
-rw-r--r--. 1 root root 160 5月 29 11:43 makefile
-rw-r--r--. 1 root root 273 5月 29 12:18 ntp-4.2.8p3.tar.gz
drwxr-----. 3 root root 19 5月 26 12:00 .pki
-rw-r--r--. 1 root root 237 5月 29 10:16 sin_value.c
drwx------. 2 root root 57 5月 27 08:50 .ssh
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-------. 1 root root 0 6月 4 15:08 .viminfo
在一个局域网的小伙伴们就可以使用这个命令一起共享文件,下载到本地上
更多的firewall-cmd命令请查看
[root@localhost ~]# firewall-cmd --help
此内容参考B站Linux超哥讲解的Firewalld防火墙