5.1 了解firewall防火墙基础概念与原理
5.1.1 Linux 防火墙概述
在网络安全领域,防火墙是保障网络安全的关键屏障,Linux 系统中的 firewall 防火墙(firewalld 服务)是一款功能强大且灵活的防火墙管理工具,广泛应用于企业级服务器、云环境以及各类网络安全场景。它采用动态管理策略,能够在不中断网络连接的情况下实时更新防火墙规则,极大地提高了网络安全管理的效率和灵活性。
与传统防火墙相比,firewalld 引入了区域(zone)和服务(service)的概念,这是其独特且高效的管理方式。区域是一组预定义的规则集合,每个区域代表不同的网络信任程度,例如 public(公共网络,安全级别高,开放的服务少)、private(私有网络,相对信任,开放更多服务)、trusted(可信网络,几乎完全信任,开放大量服务)等。服务则对应常见的网络应用协议和端口,如 http 服务对应 80 端口,ssh 服务对应 22 端口等。通过将网络接口分配到不同区域,并针对区域配置允许或拒绝特定服务,管理员可以轻松实现精细化的网络访问控制。
5.1.2 firewall 工作原理
firewalld 基于 Netfilter/iptables 框架构建,Netfilter 是 Linux 内核中的数据包过滤、网络地址转换(NAT)和数据包处理框架,iptables 是基于该框架的命令行工具,而 firewalld 则提供了更高级、更易于管理的接口。
当网络数据包进入 Linux 系统时,首先会经过 Netfilter 框架的检查。firewalld 根据预先配置的规则,对数据包的源地址、目的地址、端口号、协议类型等信息进行匹配。如果数据包符合某个允许规则,就会被放行通过;如果匹配到拒绝规则,则会被丢弃;若没有匹配到任何规则,将按照默认策略进行处理(通常默认策略为拒绝)。同时,firewalld 支持状态检测功能,能够跟踪网络连接的状态,对于已经建立的连接,后续相关数据包会被自动放行,提高了网络通信的效率和安全性。
5.1.3 firewall 规则管理
firewall 的规则管理主要围绕区域和服务展开。管理员可以通过命令行工具(如 firewall-cmd)或图形化界面工具(如 firewall-config)来进行操作。通过 firewall-cmd 命令,可以实现添加、删除、查询防火墙规则等操作。例如,使用 firewall-cmd --add-service=http --zone=public 命令,即可在 public 区域中添加允许 http 服务通过的规则,使得外部网络能够访问该 Linux 系统上的 Web 服务。此外,还可以针对特定的 IP 地址、IP 段或端口范围进行规则配置,满足复杂的网络安全需求。
在 firewalld 中,不同的网络区域(域)有着不同的默认配置,具体如下表所示:
网络区名称 | 默认配置 |
trusted | 可接受所有的网络连接 |
home | 用于家庭网络 |
internal | 用于内部网络,仅接受 ssh,mdns,gp-client,samba-client,dhcpv6-client 连接 |
work | 用于工作区,仅接受 ssh,ipp-client,dhcpv6-client 服务连接 |
public | 用于公共区域,仅接受 ssh,ipp-client,dhcpv6-client 服务连接,是 firewalld 的默认区域 |
dmz | 仅接受 ssh 服务的连接 |
firewalld 的默认区域是 public,合理利用这些区域的特性,能够帮助管理员更高效地进行网络访问控制 。
5.2 Firewalld常用操作
5.2.1 Firewalld规则的两种状态
firewall-config(需要有图形化界面的才能使用),firewall-cmd是命令行工具,实际生产环境主要使用firewall-cmd来操作
运行时( runtime):修改规则马上生效,但是临时生效,默认是运行时状态 持久配置( permanent): 修改后需要重载才会生效。
firewall-cmd --permanent [RULE]
firewall-cmd --reload
5.2.2 Firewalld常见选项
可以通过firewall-cmd --help查看帮助,firewalld的选项很多,下面列出一些比较常用的。
--permanent # 配置写入到配置文件,永久生效
--reload # 重载配置文件,永久生效
--zone= # 指定区域,默认是public
--get-default-zone # 查看默认区域
--set-default-zone= # 设置默认区域
--get-zones # 获取所有可用的区域
--get-active-zones # 获取当前激活(活跃)的区域
--add-source= # 添加地址,可以是主机或网段,遵循当前区域的target
--remove-source # 移除地址,可以是主机或网段,遵循当前区域的target
--add-service= # 添加服务
--remove-service= # 移除服务
--list-services # 显示当前区域内允许访问的所有服务
--add-port=xx/tcp # 添加端口,后面要指定是TCP还是UDP
--remove-port= # 移除端口,遵循当前区域的target
--list-ports # 显示指定区域内允许访问的所有端口号
--list-all # 列出当前使用的区域的配置
--list-all-zones # 列出所有区域的配置
--get-zone-of-interface= # 获取指定接口所在的区域
--list-icmp-blocks # 显示指定区域内拒绝访问的所有ICMP类型
--list-protocols --列出在指定区域中允许通过的协议
5.2.3 常用的增删改查操作
(1)查看规则firewall-cmd --list-all,不指定区域默认显示public区域。
当前区域的配置信息解释:
[root@localhost ]# firewall-cmd --list-all # 活动的区域
target: default # 默认启动的区域
icmp-block-inversion: no # ICMP协议类型黑白名单开关(yes/no)
interfaces: eth0 # 关联的网卡接口
sources: # 来源,可以是IP地址,也可以是mac地址
services: dhcpv6-client ssh # 列出允许通过这个防火墙的服务
ports: 80/tcp # 列出允许通过这个防火墙的目标端口。(即 需要对外开放的端口)
protocols: # 协议值可以是一个协议 ID 数字,或者一个协议名
masquerade: no # 表示这个区域是否允许 IP 伪装。如果允许,它将允许 IP 转发,它可以让你的计算机作为一个路由器
forward-ports: # 列出转发的端口
source-ports: # 允许的来源端口
icmp-blocks: # 可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许
rich rules: # 富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的
查看信息常用的命令:
# 查询默认区域配置信息
firewall-cmd --list-all
# 查看区域配置信息
firewall-cmd --list-all --zone=work
# 查询所有端口
firewall-cmd --list-ports
# 查询指定端口
firewall-cmd --zone=public --query-port=22/tcp
# 查询放通IP段
firewall-cmd --list-sources
# 查看默认区域
firewall-cmd --get-default-zone
# 查看所有可以使用的区域
firewall-cmd --get-zones
# 查看活跃的区域
firewall-cmd --get-active-zones
# 查看网卡绑定在了哪个区域
firewall-cmd --get-zone-of-interface=[IFACE]
# 查看所有服务
firewall-cmd --get-services
(2)添加规则,以端口方式放行服务。
开放特定端口,例如MySQL数据库默认端口3306,firewall-cmd --zone=public --add-port=3306/tcp --permanent。
开放snmp的161的UDP端口,默认的zone是public,可以不指定zone,firewall-cmd --add-port=161/udp --permanent。
生效配置,firewall-cmd --reload
查看规则,firewall-cmd --list-ports 或firewall-cmd --list-all。
(3)添加规则,以服务名称的方式放行服务。
放行nfs服务的所有端口,firewall-cmd --zone=public --add-service=nfs --permanent。
放行ssh服务,firewall-cmd --zone=public --add-service=ssh --permanent。
重载防火墙并查看放行结果。
(4)删除规则,删除开放的3306端口,firewall-cmd --permanent --remove-port=3306/tcp 。
删除nfs服务,firewall-cmd --permanent --remove-service=nfs。
重载防火墙并查看放行结果。
5.2.4 Firewalld防火墙富规则
Firewalld 防火墙的富规则是一种功能强大且灵活的高级规则配置方式 ,相较于基础规则,它能够实现更精细、更复杂的网络访问控制。富规则可以针对网络数据包的源地址、目的地址、端口、协议、连接状态等多种属性进行细致的条件设定。
(1)富规则常用的选项
firewall-cmd
--list-rich-rules --列出富规则
--add-rich-rule=<rule> --添加富规则
--remove-rich-rule=<rule> --移除富规则
--list-all 和 --list-all-zones --也能列出存在的富规则
(2)富规则语法,规则的几乎每个单一元素都能够以option=value形式来采用附加参数。
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
具体格式如下所示
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
destination address="address[/mask]" invert="True"
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value
" to-addr="address"
log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
accept | reject [type="reject type"] | drop
(3)常用的富规则配置,如设置对特定IP访问特定端口。
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.10.10.110/32" port port="1521" protocol="tcp" accept"
firewall-cmd --reload
批量加端口,允许某个网段访问多个端口。
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.10.10.0/24 port port=8080-8090 protocol=tcp accept'
firewall-cmd --reload
开启某个IP访问某个服务。
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 service name=nfs source address="10.10.10.101/32" accept'
firewall-cmd --reload
拒绝某个IP访问所有端口。
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.10.10.110/32 reject'
firewall-cmd --reload
查看配置结果。
5.3 firewall实战案例——放行http服务
5.3.1 安装http服务
(1)确保虚拟机可以上网以及yum源可用的情况下安装http服务yum -y install httpd。
启动http服务并设置开机自启动systemctl start httpd && systemctl enable httpd
启动之后查看http服务状态systemctl status httpd
(2)修改服务端口(可降低遭受自动扫描和攻击的风险、避免冲突),将
/etc/httpd/conf/httpd.conf配置文件中的监听端口改为12090。
修改完成后重启http服务systemctl restart httpd,查看服务端口信息netstat -ntpl,若提示没有netstat命令,则执行yum -y install net-tools命令安装。
(3)使用curl命令测试服务是否可以访问curl http://localhost:12090,出现http服务主页代码即成功。
接下来在开启firewalld防火墙的情况下,在宿主机上的浏览器访问虚拟机的http服务,结果是访问失败。
5.3.2 以端口的方式放行http服务
(1)放行12090端口firewall-cmd --zone=public --add-port=12090/tcp --permanent
(2)查看放行结果firewall-cmd --list-all
(3)在宿主机上的浏览器访问虚拟机的http服务
成功访问到虚拟机安装的http服务,将上面添加的这条规则删除firewall-cmd --zone=public --remove-port=12090/tcp --permanent,并查看结果。
5.3.3 以服务名称的方式放行服务
(1)放行http服务firewall-cmd --zone=public --add-service=http --permanent
(2)查看放行结果firewall-cmd --list-all,可以看到在“services”属性的后面增加了http
(3)在宿主机上的浏览器访问虚拟机的http服务。