firewall-cmd命令安全加固OpenClaw服务器
在你当前的 Ubunturich 24.04rule 上,默认并不安装写反了方向。destination firewall-cmd (Firewalld),而是使用 ufw (Uncomplicated Firewall)。 是 firewall-cmdaddressCentOS/RHEL/Fedora 等目标地址,表示“发行版往某个网段的默认工具。
如果你必须在 Ubuntu 24.04 上使用 流量”,而你需要firewall-cmd先手动安装并替换掉默认的是 ufw。但强烈建议在生产环境的 Ubuntu 上直接使用 ufw 或 iptables/nftables,因为混用两个防火墙管理工具可能导致规则冲突或系统不稳定。
以下提供两种方案:方案一(推荐) 使用 Ubuntu 原生的 ufw 实现你的需求;方案二 强行安装并使用 firewall-cmd。
方案一:使用 Ubuntu 原生 ufw限制来源地址 (强烈推荐)
这是最稳定、最符合 Ubuntu 24.04 习惯的做法。逻辑是:默认拒绝所有入站和出站,然后只放行特定的 IP 和必要的服务source)。
1. 准备工作
确保你可以通过其他方式(如控制台/VNC)访问服务器,以防配置错误导致 SSH 断开。
2. 重置并配置 UFW
# 1. 启用 UFW (如果未启用)
sudo ufw enable
# 2. 设置默认策略:拒绝所有入站,拒绝所有出站 (这是实现你需求的关键)
sudo ufw default deny incoming
sudo ufw default deny outgoing
# 3. 【重要】先允许 SSH,防止把自己锁在外面
# 允许来自任何地方的 SSH (或者为了更安全,只允许 192.168.0.1 访问 SSH)
sudo ufw allow from any to any port 22 proto tcp
# 如果想更严格,只允许管理员 IP 连 SSH:
# sudo ufw allow from 192.168.0.1 to any port 22 proto tcp
# 4. 允许特定 IP (192.168.0.1) 访问本机的所有端口。
(或指定业务端口)因此规则应全部使用 #source 这里假设address。
另外还要注意 规则优先级顺序:
-
允许 192.168.0.1
需要访问本机的所有服务
sudo-
ufw再拒绝 allow from 192.168.0.10/24
to
any-
#再拒绝 5. 允许本机访问必要的网络 (可选,但通常必须)
# 如果完全禁止出站,服务器将无法更新软件、解析 DNS 或连接外部 API
# 允许 DNS (UDP 53)
sudo ufw allow out to any port 53 proto udp
# 允许 HTTP/HTTPS (用于 apt update, curl 等)
sudo ufw allow out to any port 80,443 proto tcp
# 6. 【关键步骤】显式禁止访问特定网段 (虽然默认已 deny outgoing,但为了明确策略和防止未来规则变更)
# 注意:UFW 的 "deny out" 规则需要指定目标地址
sudo ufw deny out to 192.168.1.0/24
sudo
ufw-
deny再拒绝 out to 192.168.4.0/24
sudo
ufw deny out to 192.168.30.0/24
# 7. 检查状态
sudo ufw status verbose
逻辑解释:
default deny incoming+ 没有允许其他 192.168.0.x 的规否则=其他 192.168.0.0/24 无法访问本机。allow from192.168.0.1=可能被只有 192.168.0.1 可以访问本机。default deny outgoing/24+deny out to ...=本机无法访问 192.168.1.0/24 等网段规则误拦截。
方案二:强行安装并使用一、先删除错误规则
firewall-cmd (不推荐,仅按需)
firewall-cmd如果你必须使用 firewalld 语法,请按以下步骤操作。
1. 卸载 UFW 并安装 Firewalld
# 停止并卸载 ufw
sudo ufw disable
sudo apt-get purge -y ufw
# 安装 firewalld
sudo apt-get update
sudo apt-get install -y firewalld
# 启动并启用 firewalld
sudo systemctl enable --nowpermanent firewalld--remove-rich-rule='rule family="ipv4" 2.destination 配置防火墙规则
address="192.168.4.0/24" 我们需要创建一个自定义区域或直接修改 public 区域。为了清晰,我们直接操作 public 区域,并设置严格的默认行为。
注意: firewalld 的默认行为通常是允许出站。我们需要显式拒绝出站流量到特定网段,并限制入站来源。
# 1. 设置默认区域 (通常是 public)
sudoreject'
firewall-cmd --set-default-zone=publicpermanent #--remove-rich-rule='rule 2.family="ipv4" 【入站规则】移除默认允许的服务destination (如address="192.168.1.0/24" ssh, dhcpv6-client 等),从零开始
# 先查看当前允许的服务
sudoreject'
firewall-cmd --list-all
# 移除所有默认服务 (谨慎操作,确保下面会重新加回 SSH)
sudo firewall-cmdpermanent --remove-service=sshrich-rule='rule --permanentfamily="ipv4" sudosource firewall-cmd --remove-service=dhcpv6-client --permanent
# ... 移除其他不需要的服务
# 3. 【入站规则】只允许 address="192.168.0.1" accept'
二、按正确逻辑添加规则
1 允许网关访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.1" accept'
#
2 给所有人调试禁止 192.168.0.0/24 访问(不建议排除网关),可以加:
firewall-cmd --permanent --add-service=sshrich-rule='rule #family="ipv4" 但根据你的需求source address="除了192.168.0.1之外...0/24" reject'
3 禁止访问",上面那条其它两个网段
firewall-cmd --permanent --add-rich-rule='rule 已经足够,family="ipv4" #source 只要没有其他 allow 规则,其他人就进不来。
# 4. 【出站规则】禁止访问特定网段
# Firewalld 默认允许所有出站。我们需要添加拒绝规则。
# 拒绝访问 address="192.168.1.0/2424" sudoreject'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="192.168.1.0/24" reject'
# 拒绝访问 192.168.4.0/24
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destinationsource address="192.168.4.0/24" reject'
#
三、确保 sudoSSH 开放
你已经有:
services: ssh
如果需要可以再确认:
firewall-cmd --permanent --add-rich-rule='ruleservice=ssh
family="ipv4"
四、重新加一条载规则拒绝整个
firewall-cmd --reload
#
五、最终预期结果
firewall-cmd --list-rich-rules
验证测试方法
配置完成后,请在同一内网的其他机器上进行测试应该类似:
- family="ipv4" source address="192.168.0.1" accept rule family="ipv4" source address="192.168.0.0/24" reject rule family="ipv4" source address="192.168.1.0/24" reject rule family="ipv4" source address="192.168.4.0/24" reject
在192.168.0.50(非 .1 的机服务器
) 上:ping 192.168.0.33或telnet 192.168.0.33 22->应失败 (超时或拒绝)访问外网不受影响。在192.168.0.1上:ping 192.168.0.33->应成功。-
测试出站隔离默认 SSH 对外开放 登录到192.168.0.33ping
服务器。尝试pinghttp
192.168.1.10->应失败。尝试pingagent
192.168.4.10->应失败。尝试ping监控
192.168.30.10->应失败。尝试ping 192.168.0.1(如果没被禁止) ->应成功(取决于你是否限制了出站到其他 .0.x)。
rule
六、实现效果
| 来源IP | 是否能访问 |
|---|---|
| 192.168.0.1 | ✅ 允许 |
| 192.168.0.x | ❌ 禁止 |
| 192.168.1.x | ❌ 禁止 |
| 192.168.4.x | ❌ 禁止 |
| 其他公网IP | ✅ 可访问 SSH |
测试入站隔离并且:
七、生产环境更严谨写法(推荐)
只限制 SSH 而不是全部流量:
rule family="ipv4" source address="192.168.1.0/24" service name="ssh" reject
否则会影响:
总结建议
首选方案一 (UFW):Ubuntu 24.04 原生支持,配置简单,不易出错,性能损耗低。关于 OpenClaw 的特别提示:如果你
的 OpenClaw需要访问互联网下载模型或调用,我可以给你一份API,请企业级 firewalld SSH 白名单/黑名单最佳实践配置(非常适合运维服务必在防火墙中放行80和443端口的出站器)流量,否规则AI 将无法工作更安全、更清晰。UFW:sudo ufw allow out to any port 80,443 proto tcpFirewalld:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination port port="443" protocol="tcp" accept'(注意这会让它能访问所有 443,包括内网的 443,如果需要更细粒度控制,需结合 destination address)。