Skip to main content

firewall-cmd命令安全加固OpenClaw服务器

你当前的 Ubunturich 24.04rule 上,默认并不安装写反了方向
destination firewall-cmd (Firewalld)
,而是使用 ufw (Uncomplicated Firewall)。firewall-cmdaddressCentOS/RHEL/Fedora目标地址,表示“发往某个网段的流量”,而你需要的是 等发行版的默认工具。限制来源地址 (source) 访问本机。

如果你必须在 Ubuntu 24.04 上使用因此规则应全部使用 firewall-cmd,你需要先手动安装并替换掉默认的source ufw但强烈建议在生产环境的 Ubuntu 上直接使用 ufw 或 iptables/nftables,因为混用两个防火墙管理工具可能导致规则冲突或系统不稳定。

以下提供两种方案:方案一(推荐) 使用 Ubuntu 原生的 ufw 实现你的需求;方案二 强行安装并使用 firewall-cmdaddress


另外还要注意

方案一:使用规则优先级顺序 Ubuntu

原生

允许 ufw (强烈推荐)

这是最稳定、最符合 Ubuntu 24.04 习惯的做法。逻辑是:默认拒绝所有入站和出站,然后只放行特定的 IP 和必要的服务

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.10/24

to any port

再拒绝 22 proto tcp # 4. 允许特定 IP (192.168.0.1) 访问本机的所有端口 (或指定业务端口) # 这里假设 192.168.0.1 需要访问本机的所有服务 sudo ufw allow from 192.168.0.1 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 from 192.168.0.1 =可能被 只有 192.168.0.1 可以访问本机 default deny outgoing/24 + deny out to ... = 本机无法访问 192.168.1.0/24 等网段 规则误拦截。

    方案二:强行安装并使用

    一、先删除错误规则

    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 访问允许网关访问

    # 添加富规则 (Rich Rule):来源是 192.168.0.1 的包,接受所有端口 sudo
    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.1" accept'
    #
    如果需要保留
    SSH

    2 给所有人调试(不建议),可以加:禁止 #192.168.0.0/24 sudo访问(排除网关)

    firewall-cmd --permanent --add-service=sshrich-rule='rule #family="ipv4" 但根据你的需求source address="除了192.192.168.0.1之外...禁止访问",上面那条0/24" richreject'
    

    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'
    #
    拒绝访问
    192.168.30.0/24

    三、确保 sudoSSH 开放

    你已经有:

    services: ssh
    

    如果需要可以再确认:

    firewall-cmd --permanent --add-rich-rule='ruleservice=ssh
    family="ipv4"
    destination
    address="192.168.30.0/24"

    四、重新加载规则

    reject' # 5. 【可选但推荐】如果想彻底禁止访问除必要外的所有内网出站 # 你可以添加一条规则拒绝整个 192.168.0.0/16 除了 192.168.0.1 (作为网关或管理机) # 但根据你的具体描述,只需禁止那三个网段即可。 # 6. 重载配置使生效 sudo
    firewall-cmd --reload
    #
    7.
    验证规则

    五、最终预期结果

    sudo firewall-cmd --list-all sudo
    firewall-cmd --list-rich-rules
    

    验证测试方法

    应该类似:

    rule 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
    

    六、实现效果

    来源IP 是否能访问 192.168.0.1 ✅ 允许 192.168.0.x ❌ 禁止 192.168.1.x ❌ 禁止 192.168.4.x ❌ 禁止 其他公网IP ✅ 可访问 SSH

    配置完成后,请在同一内网的其他机器上进行测试:并且:

      • 测试入站隔离服务器访问外网不受影响

        • 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.33 服务器。 尝试 ping 192.168.1.10 -> 应失败 尝试 ping 192.168.4.10 -> 应失败 尝试 ping 192.168.30.10 -> 应失败 尝试 ping 192.168.0.1 (如果没被禁止) -> 应成功 (取决于你是否限制了出站到其他 .0.x)。

          七、生产环境更严谨写法(推荐)

          总结建议

          只限制

            SSH 首选方案一而不是全部流量: (UFW):Ubuntu 24.04 原生支持,配置简单,不易出错,性能损耗低。 关于 OpenClaw 的特别提示:如果你的 OpenClaw 需要访问互联网下载模型或调用 API,请务必在防火墙中放行
            80 和 443 端口的出站流量,否则 AI 将无法工作。
            
              UFW: sudo ufw allow out to any port 80,443 proto tcp Firewalld: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destinationsource portaddress="192.168.1.0/24" port=service name="443"ssh" protocol="tcp"reject accept' (注意这会让它能访问所有

              否则会影响:

              443,包括内网的
              443,如果需要更细粒度控制,需结合 destination

              ping

              address)。

              http

              agent

              监控

              如果你需要,我可以给你一份

              企业级 firewalld SSH 白名单/黑名单最佳实践配置(非常适合运维服务器),规则更安全、更清晰。