firewalld 命令 #
firewalld
是一个动态防火墙管理工具,它使用"区域"和"服务"的概念来简化防火墙配置。firewall-cmd
是firewalld
的命令行客户端,用于管理防火墙规则。
基本概念 #
- 区域(Zone): 定义了网络连接的信任级别,每个区域包含一组防火墙规则
- 服务(Service): 预定义的规则集,用于允许特定应用程序的网络流量
- 端口(Port): 特定的网络端口和协议
- 富规则(Rich Rule): 更复杂的防火墙规则,提供更精细的控制
常用命令 #
状态管理 #
1. 检查 firewalld 状态 #
firewall-cmd --state
2. 重新加载防火墙配置 #
firewall-cmd --reload
3. 完全重新加载防火墙(包括永久规则) #
firewall-cmd --complete-reload
区域管理 #
1. 列出所有可用区域 #
firewall-cmd --get-zones
2. 列出所有活动区域 #
firewall-cmd --get-active-zones
3. 获取默认区域 #
firewall-cmd --get-default-zone
4. 设置默认区域 #
firewall-cmd --set-default-zone=public
5. 将网络接口添加到区域 #
firewall-cmd --zone=public --add-interface=eth0
服务管理 #
1. 列出所有可用服务 #
firewall-cmd --get-services
2. 列出区域中启用的服务 #
firewall-cmd --zone=public --list-services
3. 添加服务到区域 #
firewall-cmd --zone=public --add-service=http
4. 永久添加服务到区域 #
firewall-cmd --permanent --zone=public --add-service=http
5. 从区域移除服务 #
firewall-cmd --zone=public --remove-service=http
端口管理 #
1. 列出区域中开放的端口 #
firewall-cmd --zone=public --list-ports
2. 添加端口到区域 #
firewall-cmd --zone=public --add-port=8080/tcp
3. 永久添加端口到区域 #
firewall-cmd --permanent --zone=public --add-port=8080/tcp
4. 从区域移除端口 #
firewall-cmd --zone=public --remove-port=8080/tcp
富规则管理 #
1. 列出区域中的富规则 #
firewall-cmd --zone=public --list-rich-rules
2. 添加富规则 #
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
3. 永久添加富规则 #
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
4. 移除富规则 #
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
伪装和端口转发 #
1. 启用伪装(NAT) #
firewall-cmd --zone=public --add-masquerade
2. 检查伪装是否启用 #
firewall-cmd --zone=public --query-masquerade
3. 添加端口转发 #
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
4. 添加端口转发到另一个 IP #
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10
常见用法示例 #
1. 允许 HTTP 和 HTTPS 流量 #
# 添加HTTP和HTTPS服务
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
# 重新加载防火墙
firewall-cmd --reload
2. 允许特定 IP 访问 SSH #
# 添加富规则
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.5" service name="ssh" accept'
# 重新加载防火墙
firewall-cmd --reload
3. 阻止特定 IP #
# 添加富规则阻止IP
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" reject'
# 重新加载防火墙
firewall-cmd --reload
4. 设置端口转发 #
# 启用伪装
firewall-cmd --permanent --zone=public --add-masquerade
# 添加端口转发
firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10
# 重新加载防火墙
firewall-cmd --reload
5. 创建自定义服务 #
# 创建新服务文件
cat > /etc/firewalld/services/myapp.xml << EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MyApp</short>
<description>My custom application</description>
<port protocol="tcp" port="8080"/>
<port protocol="udp" port="8125"/>
</service>
EOF
# 重新加载防火墙
firewall-cmd --reload
# 添加服务到区域
firewall-cmd --permanent --zone=public --add-service=myapp
firewall-cmd --reload
注意事项 #
- 没有
--permanent
选项的命令只会修改运行时配置,重启后会丢失 - 使用
--permanent
选项的命令只会修改永久配置,不会立即生效,需要重新加载防火墙 - 建议先测试运行时配置,确认无误后再应用永久配置
- 在远程管理服务器时,要特别小心防火墙规则,避免意外锁定自己
- 某些复杂的防火墙规则可能需要使用富规则语法
firewalld
与传统的iptables
服务可能会相互冲突,应避免同时运行