网络安全必备!Linux firewalld 防火墙原理 + 配置实战(放行http)

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服务。

#网络安全有你有我##我要上头条#

原文链接:,转发请注明来源!