lamess / Firewalld常用操作

Created Tue, 02 Jul 2024 14:33:29 +0800 Modified Wed, 03 Jul 2024 20:08:30 +0800

Firewalld常用操作

FirewallD是防火墙的配置管理工具,用于实现持久的网络流量规则。FirewallD使用区域和服务而不是链式规则。它动态管理规则集,允许更新规则而不破坏现有会话和连接。

服务管理

使用systemd管理firewalld服务状态。

# 查询服务状态
systemctl status firewalld
# 启动服务
systemctl start firewalld
# 设置自启动
systemctl enable firewalld
# 停止服务
systemctl stop firewalld
# 重启服务
systemctl restart firewalld

区域

区域(Zone)是firewalld的防火墙策略模板集合,用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
Firewalld中常见的区域名称及对应策略规则如下。

区域 默认规则策略 官方说明
drop 拒绝流入的流量,除非与流出的流量相关 Any incoming network packets are dropped, there is no reply. Only outgoing network connections are possible.
block 拒绝流入的流量,除非与流出的流量相关 Any incoming network connections are rejected with an icmp-host-prohibited message for IPv4 and icmp6-adm-prohibited for IPv6. Only network connections initiated within this system are possible.
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 For use on external networks with IPv4 masquerading enabled especially for routers. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.
work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量 For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、smba-client、dhcpv6-client服务相关,则允许流量 For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.
internal 等同于home区域 For use on internal networks. You mostly trust the other computers on the networks to not harm your computer. Only selected incoming connections are accepted.
trusted 允许所有的数据包 All network connections are accepted.

终端管理工具

firewall-cmd是firewalld防火墙配置管理工具的CLI版本,常用的命令参数及作用如下。

查询firewalld状态。返回结果为runningnot running

firewall-cmd --state

显示当前区域的网卡配置参数、资源、端口以及服务等信息。

firewall-cmd --list-all

显示所有区域的网卡配置参数、资源、端口以及服务等信息。

firewall-cmd --list-all-zones

重新加载防火墙规则。在firewalld中设置的永久配置参数将成为新的运行时配置参数。

firewall-cmd --reload

将运行时规则写入永久配置。

firewall-cmd --runtime-to-permanent

查询默认使用的区域的名称。

firewall-cmd --get-default-zone

设置默认区域,并使其永久生效。

firewall-cmd --set-default-zone=<区域名称>
firewall-cmd --set-default-zone=public

查询指定网卡在firewalld服务中绑定的区域。

firewall-cmd --get-zone-of-interface=<网卡名称>
firewall-cmd --get-zone-of-interface=eno1

修改指定网卡的区域。

firewall-cmd --permanent --zone=<区域名称> --change-interface=<网卡名称>
firewall-cmd --permanent --zone=public --change-interface=eno1

修改指定service的流量放行策略。

firewall-cmd --permanent --zone=<区域名称> --add-service=<服务名称>
firewall-cmd --permanent --zone=<区域名称> --add-service={<服务名称1>,<服务名称2>}
firewall-cmd --permanent --zone=<区域名称> --remove-service=<服务名称>
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service={http,https}

修改指定端口流量策略。

firewall-cmd --permanent --zone=<区域名称> --add-port=<端口号>/<协议>
firewall-cmd --permanent --zone=<区域名称> --add-port=<起始端口-结束端口>/<协议>
firewall-cmd --permanent --zone=<区域名称> --add-port={<端口号1>,<端口号2>}/<协议>
firewall-cmd --permanent --zone=<区域名称> --remove-port=<端口号>/<协议>
firewall-cmd --permanent --zone=<区域名称> --add-port=8000/tcp
firewall-cmd --permanent --zone=<区域名称> --add-port=8000-8001/udp
firewall-cmd --permanent --zone=<区域名称> --add-port={8000,8001}/tcp
firewall-cmd --permanent --zone=<区域名称> --remove-port=8000/tcp

为特定的来源指定至trusted域,以设置白名单。

firewall-cmd --permanent --zone=trusted --add-source=<源IP>
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.1
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24

设置流量转发,将访问源端口的流量转发至目标端口。

# 本地端口转发
firewall-cmd --permanent --zone=<区域名称> --add-forward-port=port=<源端口>:proto=<协议>:toport=<目标端口>
# 转发至外部IP地址,需要先开启masquerade伪装流量,或者直接导向至external区域。
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --zone=<区域名称> --add-forward-port=port=<源端口>:proto=<协议>:toport=<目标端口>:toaddr=<目标IP>

使用“Rich Language”语法配置复杂防火墙规则

firewall-cmd --list-rich-rules
firewall-cmd --permanent --zone=<区域名称> --add-rich-rule='RULE'
firewall-cmd --permanent --zone=<区域名称> --remove-rich-rule='RULE'
# 设置指定IP对指定端口的访问逻辑
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="80" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" reject'
# 设置指定IP的访问逻辑
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.1" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" reject'
# 使用富规则针对来源IP进行端口转发
firewall-cmd --add-rich-rule='rule family=ipv4 source address="192.168.1.1" forward-port port=2222 protocol=tcp to-port=22 to-addr=192.168.1.2'

使用脱机管理工具

firewall-offline-cmd用于在firewalld服务未运行时修改防火墙配置。

查询配置。

firewall-offline-cmd --list-all
firewall-offline-cmd --list-all-zones
firewall-offline-cmd --get-default-zones
firewall-offline-cmd --list-rich-rules

用于修改配置,功能与firewall-cmd --permanent相似。

firewall-offline-cmd --set-default-zone=<区域名称>
firewall-offline-cmd --zone=<区域名称> --change-interface=<网卡名称>
firewall-offline-cmd --zone=<区域名称> --add-service=<服务名称>
firewall-offline-cmd --zone=<区域名称> --remove-service=<服务名称>
firewall-offline-cmd --zone=<区域名称> --add-port=<端口号>/<协议>
firewall-offline-cmd --zone=<区域名称> --remove-port=<端口号>/<协议>
firewall-offline-cmd --zone=<区域名称> --add-rich-rule='RULE'
firewall-offline-cmd --zone=<区域名称> --remove-rich-rule='RULE'

配置文件查询

Firewalld的配置文件路径为/etc/firewalld。在/etc/firewalld/firewalld.conf中记录了当前的DefaultZone信息。

DefaultZone=public

根据DefaultZone信息,找到/etc/firewalld/zones路径下对应的zone的配置文件,可以确认该zone下的具体防火墙规则。

而对于使用service的防火墙规则,通过查询/usr/lib/firewalld/services下对应的配置文,即可确认此service配置所对应的端口信息。

实战操作记录

记一次实际项目维护防火墙的操作流程,在此项目上,原来的防火墙未开启,因安全需要,决定启动firewalld服务。

因为从堡垒机登录,因此不知道真正的SSH端口。先查询SSH端口。

netstat -anop |grep sshd

确认端口已经被修改为2222。如果直接开启防火墙,可能导致远程离线。

综合评估后,先使用脱机管理工具增加端口配置。

firewall-offline-cmd --get-default-zones
firewall-offline-cmd --zone=public --add-port=2222/tcp

最后启动firewalld服务,并设置自启动。

systemctl enable firewalld --now