☰
Linux关防火墙的真相:不是停服务,而是动三层策略
2026/9/26 16:39:21 网站建设 项目流程

1. 为什么在Linux里关防火墙不是“按个开关”那么简单

你刚装好CentOS或Ubuntu,想跑个Web服务,浏览器打不开localhost:8000,第一反应是“是不是防火墙挡着了?”——这想法完全对。但接下来敲一句sudo systemctl stop firewalld就完事?我干运维那会儿,真这么干过三次:第一次,测试环境通了,生产环境半夜报警;第二次,同事说“你关了防火墙,我们数据库端口全暴露了”;第三次,客户现场重启服务器后,防火墙自动又开了,他以为我骗人。后来我才明白:Linux里的“关防火墙”,根本不是关一个东西,而是关一套策略体系、两套底层机制、三种服务状态,还牵扯到系统启动逻辑和安全基线规范。

核心关键词——Linux、防火墙、firewalld、iptables、systemctl——每个词背后都站着一整套运行逻辑。firewalld不是防火墙本身,它是个动态管理器,像物业前台;真正干活的是iptables(或nftables),相当于保安队;而systemctl只是调度员,管它“今天上不上岗”。你用systemctl stop停掉firewalld,iptables规则还在内存里生效;你用iptables -F清空规则,firewalld下次启动又会把默认策略刷回去;你改了/etc/firewalld/firewalld.conf,不重载配置等于白改。更麻烦的是,不同发行版默认用的不是同一套:CentOS 7/8默认firewalld,Ubuntu 20.04+默认ufw(基于iptables),Debian老版本直接裸用iptables,而阿里云/腾讯云镜像甚至预装了自研的轻量级防护模块,systemctl list-unit-files | grep firewall一查,能冒出四五个名字。

所以“关闭防火墙”这个动作,本质是在回答四个问题:你要关的是哪一层策略?关的是临时状态还是永久配置?关的是用户空间服务还是内核规则?关完之后,其他依赖服务会不会连锁异常?比如Docker默认会往iptables里插链,你清空规则,容器网络立马断;Kubernetes的kube-proxy也依赖iptables,你iptables -P INPUT DROP再-F,master节点直接失联。这不是命令行炫技,是动系统安全神经中枢。我见过最典型的误操作:运维小哥为调试SSH连不上,顺手iptables -P INPUT DROP,然后发现连不上了——不是因为SSH没开,是因为他自己把自己锁在外面,连console都进不去,最后得靠云平台VNC重置密码重启。所以这篇不教你怎么“快速关”,而是带你理清楚:每条命令到底动了什么、影响范围有多大、什么场景下该用哪一种、关完怎么验证没留后门。适合刚接触Linux的开发、测试同学,也适合想补基础的初级运维——别怕命令多,关键是你得知道哪条命令在替你擦哪块玻璃。

2. 防火墙的三层结构:服务层、规则层、内核层,缺一不可

要真正理解“怎么关”,先得拆开Linux防火墙的物理结构。它不像Windows防火墙点一下“关闭”就灰掉,而是分三层嵌套:最上层是服务管理层(firewalld/ufw),中间是规则管理层(iptables/nftables),最底层是内核执行层(netfilter)。这三层不是并列关系,而是调用链:服务层下发指令 → 规则层编译成指令 → 内核层实时拦截数据包。关其中任何一层,效果完全不同。

2.1 服务层:firewalld与ufw,谁在管“开关”

firewalld是Red Hat系(CentOS/RHEL/Fedora)的默认服务,用D-Bus通信,支持区域(zone)概念,比如public、internal、trusted,每个区域有独立规则集。它不直接操作iptables,而是通过firewall-cmd生成临时规则,再由后台进程写入。ufw(Uncomplicated Firewall)是Ubuntu/Debian系的简化前端,本质是iptables的脚本封装,语法更接近自然语言,比如ufw allow 80/tcp。两者都不直接修改内核,只负责“翻译”和“调度”。

提示:systemctl status firewalld看到active (running),不代表iptables规则一定生效;同样,ufw status显示inactive,iptables链里可能还有遗留规则。服务层只是“指挥官”,不是“执行者”。

验证方法很简单:

# 查看firewalld是否运行 sudo systemctl is-active firewalld # 查看ufw状态(Ubuntu) sudo ufw status verbose # 但更重要的是看底层规则是否为空 sudo iptables -L INPUT -v -n | head -10

如果iptables -L INPUT输出里有大量ACCEPT/REJECT行,说明即使firewalld停了,规则还在;如果全是默认ACCEPT,才说明真清空了。

2.2 规则层:iptables与nftables,真正的“执法者”

iptables是传统工具,基于IPv4的netfilter框架,有INPUT、FORWARD、OUTPUT三张表,每张表含多条链(chain),链里是具体规则(rule)。它的规则是有顺序的:数据包从上到下匹配,一旦命中就执行动作(ACCEPT/DROP/REJECT),不再往下走。所以iptables -A INPUT -p tcp --dport 22 -j ACCEPT加在末尾,可能被前面的-j DROP挡住;而iptables -I INPUT 1 ...插在开头,才能确保优先放行。

nftables是较新的替代方案(RHEL 8+/CentOS 8+默认),用统一语法管理IPv4/IPv6/netdev,规则存储在内核的nft表中,性能更好。但很多老脚本、Docker、K8s仍依赖iptables兼容层,所以即使系统用nftables,iptables命令可能还在转发到nft后端。

注意:iptables -F清空所有链,但不会删除自定义链(比如DOCKER-USER),也不会重置策略(policy)。iptables -P INPUT ACCEPT才是把INPUT链默认策略设为接受,而iptables -P INPUT DROP是默认拒绝——后者必须配合白名单规则,否则系统直接瘫痪。

2.3 内核层:netfilter,沉默的守门人

netfilter是Linux内核的网络子系统,在TCP/IP协议栈的关键位置(如IP层入口、出口)挂载钩子(hook),当数据包经过时触发规则匹配。它不关心你是firewalld还是手动iptables,只认内核里加载的规则结构体。关掉firewalld服务,netfilter钩子还在;清空iptables规则,netfilter只是没规则可执行,默认策略起作用。

验证内核层是否“真安静”,不能只看服务状态:

# 查看netfilter模块是否加载(通常默认加载) lsmod | grep nf_ # 查看当前生效的规则数(非零即有拦截逻辑) sudo iptables -S | wc -l # 输出大于10基本说明有规则 sudo nft list ruleset | wc -l # nftables同理

2.4 三层联动的真实案例:一次Docker部署引发的连锁反应

去年帮客户部署Spring Boot应用,他们要求开放8080端口。我按常规操作:

sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload

结果应用还是访问不了。抓包发现请求能到服务器,但响应发不出去。排查发现:

  • firewall-cmd --list-all显示8080已开放;
  • iptables -L DOCKER-USER里却有一条REJECT all -- 0.0.0.0/0 0.0.0.0/0;
  • 原来Docker启动时自动创建了DOCKER-USER链,并默认拒绝所有流量,firewalld的规则只加在INPUT链,没覆盖DOCKER-USER。

最终解决:

# 在DOCKER-USER链开头插入放行规则 sudo iptables -I DOCKER-USER -p tcp --dport 8080 -j ACCEPT # 并保存(否则重启Docker丢失) sudo iptables-save > /etc/sysconfig/iptables

这个案例说明:关防火墙不是关一个服务,而是协调三层——firewalld管INPUT,Docker管DOCKER-USER,netfilter同时执行两者规则。你只动firewalld,可能漏掉其他组件埋的雷。

3. 四种关闭方式详解:临时关闭、永久禁用、规则清空、服务卸载,适用场景全解析

市面上流传的“Linux关防火墙命令”大多只给一行代码,但从没告诉你这行代码动了哪一层、持续多久、有无副作用。下面我把真实生产环境中用过的四种方式,按风险等级和适用场景拆解清楚,每种都附带验证步骤和避坑要点。

3.1 方式一:临时停止服务(最低风险,调试首选)

这是最安全的“关法”,只影响当前会话,重启后自动恢复。适用于:本地开发调试、临时开放端口测试、故障排查。

Red Hat系(firewalld):

# 停止服务(立即生效) sudo systemctl stop firewalld # 验证:服务状态应为inactive sudo systemctl is-active firewalld # 输出 inactive # 但必须检查iptables规则是否残留 sudo iptables -L INPUT -n | grep -E "(REJECT|DROP)" # 若有,说明规则未清

Debian/Ubuntu系(ufw):

# 关闭ufw(注意:ufw disable是禁用,不是停止服务) sudo ufw disable # 验证:ufw状态为inactive,且iptables规则清空 sudo ufw status verbose # 应显示 Status: inactive sudo iptables -L INPUT -n | grep -E "policy.*DROP" # 若policy是DROP,需额外处理

实操心得:systemctl stop后,firewalld的规则仍在iptables中生效!我曾遇到过:systemctl stop firewalld后,iptables -L INPUT依然显示一堆规则,导致端口不通。正确做法是——停止服务后,立刻执行sudo iptables -F && sudo iptables -P INPUT ACCEPT清空并重置策略。UFW同理,ufw disable后建议跟sudo iptables -F,因为ufw的disable只是停服务,不清理规则。

风险提示:此方式不改变开机启动项,重启后firewalld/ufw自动拉起。若你忘了重启前恢复,上线后防火墙突然开启,服务中断。

3.2 方式二:永久禁用服务(中等风险,测试环境推荐)

适用于:虚拟机测试环境、CI/CD构建节点、离线开发机。目标是让防火墙服务永不启动。

firewalld永久禁用:

# 禁用开机自启 sudo systemctl disable firewalld # 立即停止(避免当前运行) sudo systemctl stop firewalld # 验证:检查unit文件状态 sudo systemctl is-enabled firewalld # 应输出 disabled

ufw永久禁用:

# ufw本身没有systemctl enable/disable,靠配置文件控制 echo "ENABLED=no" | sudo tee /etc/default/ufw sudo ufw disable # 同时关闭当前实例 # 验证:/etc/default/ufw内容应为ENABLED=no sudo cat /etc/default/ufw

注意:systemctl disable只是移除软链接,不删除服务文件。某些云镜像(如阿里云CentOS)会把firewalld设为masked(屏蔽),此时systemctl disable无效,需先sudo systemctl unmask firewalld。另外,禁用firewalld后,iptables-services包可能仍存在,其自带的/etc/sysconfig/iptables文件若非空,重启后iptables会自动加载——这是隐藏雷区!务必检查:sudo ls -l /etc/sysconfig/iptables,若存在且非空,要么清空它,要么sudo systemctl disable iptables。

3.3 方式三:彻底清空iptables规则(高风险,仅限内网可信环境)

这是最暴力的方式,直接清空内核规则,不管上层服务是否运行。适用于:内网隔离的测试集群、物理机单机开发、需要绝对干净网络环境的场景。

标准清空流程(必做三步):

# 1. 清空所有链的规则 sudo iptables -F # 2. 清空用户自定义链(如DOCKER-USER、KUBE-FIREWALL) sudo iptables -X # 3. 重置各链默认策略为ACCEPT(关键!否则INPUT/FORWARD默认DROP) sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT # 验证:所有链策略应为ACCEPT,且无规则 sudo iptables -S | grep "^-P" # 应输出 -P INPUT ACCEPT 等 sudo iptables -S | grep "^-A" # 应无输出(-A表示追加规则)

nftables清空(RHEL 8+/CentOS 8+):

# 列出所有表 sudo nft list tables # 删除所有表(谨慎!) sudo nft delete table ip filter sudo nft delete table ip6 filter # 或重置为默认(更安全) sudo nft flush ruleset

踩坑实录:某次清空iptables后,Docker容器无法上网。排查发现:iptables -t nat -L POSTROUTING里有一条MASQUERADE规则被清掉了,这是Docker实现容器NAT的核心。解决方案:清空前先备份sudo iptables-save > /tmp/iptables-backup,清空后手动恢复关键NAT规则,或重启docker服务让它重建。另外,iptables -P INPUT DROP后执行-F,策略仍是DROP,必须显式-P INPUT ACCEPT,否则所有入站连接被拒——这是新手最高频失误。

3.4 方式四:卸载防火墙软件(最高风险,仅限特殊需求)

适用于:嵌入式设备、极简Linux发行版(如Alpine)、安全合规允许的离线系统。目标是移除防火墙二进制文件,杜绝任何启用可能。

firewalld卸载:

# CentOS/RHEL sudo yum remove firewalld # Ubuntu/Debian(ufw) sudo apt-get remove ufw # 验证:二进制文件应不存在 which firewall-cmd # 应无输出 which ufw # 应无输出

iptables卸载(不推荐!):

# 注意:iptables是netfilter的用户态工具,卸载后仍可通过nftables管理 # 但Docker/K8s等依赖iptables命令,卸载会导致服务异常 sudo yum remove iptables-services # RHEL系 sudo apt-get remove iptables # Debian系

重要警告:卸载firewalld/ufw后,systemctl list-unit-files | grep firewall可能仍有残留服务(如iptables.service)。必须检查/usr/lib/systemd/system/目录,手动删除相关.service文件,否则重启后可能因依赖关系自动启动。更危险的是:某些国产Linux(如银河麒麟)将防火墙深度集成到系统安全中心,卸载可能导致图形界面崩溃或安全审计失败。我曾在一个政务云项目里卸载firewalld,结果系统日志服务(rsyslog)因缺少SELinux上下文报错,整个日志链断裂——最后只能重装。

4. 实操全流程:从诊断到关闭再到验证,每一步都附带参数原理与现场记录

光讲理论不够,下面以真实故障场景为例,完整演示一次“Linux关防火墙”的标准化操作流程。场景:新装Ubuntu 22.04服务器,部署Nginx后无法从外网访问80端口,需排查并安全关闭防火墙。

4.1 第一步:诊断——确认是不是防火墙的问题

不要一上来就关,先用最小成本验证。
检查网络连通性:

# 从本机curl,确认Nginx服务正常 curl -I http://localhost # 输出应为 HTTP/1.1 200 OK # 检查端口监听状态 sudo ss -tuln | grep ':80' # 应显示 nginx 进程监听 0.0.0.0:80 或 *:80 # 检查防火墙状态(Ubuntu默认ufw) sudo ufw status verbose # 若输出Status: active,则大概率是它挡着了

深入验证:

# 查看ufw日志(需先启用日志) sudo ufw logging on sudo tail -f /var/log/ufw.log # 然后从另一台机器curl你的IP,观察日志是否出现DENY记录 # 或直接抓包看是否被drop sudo tcpdump -i any port 80 -nn # 若看到SYN包进来但无SYN-ACK返回,基本确定防火墙拦截

原理说明:ss -tuln比netstat更快更轻量,-t(TCP)、-u(UDP)、-l(监听)、-n(数字端口),避免DNS解析延迟。tcpdump抓包时指定-i any捕获所有网卡,比-i eth0更可靠,尤其在多网卡或bonding环境下。

4.2 第二步:选择关闭方式——根据环境决策树

画个简易决策树帮你选:

  • 是否生产环境?→ 是 → 跳过关闭,改用ufw allow 80/tcp开放端口
  • 是否测试/开发环境?→ 是 → 继续
  • 是否云服务器(AWS/Aliyun)?→ 是 → 优先关云平台安全组,再考虑系统防火墙
  • 是否物理机/内网?→ 是 → 可用永久禁用或清空规则

本次是本地VM测试环境,选永久禁用ufw(方式二),因为后续要频繁测试不同服务,不想每次重启都手动关。

4.3 第三步:执行关闭——带参数计算的精准操作

# 1. 记录当前ufw状态(留痕) sudo ufw status verbose > /tmp/ufw-before-$(date +%s).log # 2. 禁用ufw(修改配置文件) echo "ENABLED=no" | sudo tee /etc/default/ufw # 3. 停止当前ufw服务 sudo ufw disable # 4. 清空iptables残留规则(关键!) sudo iptables -F sudo iptables -X sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT # 5. 保存iptables规则(防止重启丢失) sudo iptables-save > /etc/iptables/rules.v4

参数原理详解:

  • /etc/default/ufw中的ENABLED=no是ufw的启动开关,值为yes时ufw enable才生效;
  • iptables -P INPUT ACCEPT中的-P是policy(策略),INPUT链默认策略是ACCEPT,但某些镜像(如Ubuntu Server最小安装)可能设为DROP,必须显式重置;
  • iptables-save > /etc/iptables/rules.v4是Debian/Ubuntu的持久化机制,/etc/network/if-pre-up.d/iptables脚本会在网卡启动前加载此文件。

4.4 第四步:验证关闭效果——三重校验法

校验一:服务层

sudo ufw status verbose # 应输出:Status: inactive

校验二:规则层

sudo iptables -S | grep "^-P" # 应输出三行:-P INPUT ACCEPT, -P FORWARD ACCEPT, -P OUTPUT ACCEPT sudo iptables -S | grep "^-A" # 应无输出(-A表示规则,无输出说明规则清空)

校验三:网络层(终极验证)

# 从本机测试 curl -I http://localhost # 从局域网另一台机器测试(假设IP为192.168.1.100) curl -I http://192.168.1.100 # 检查连接跟踪(确认无拦截) sudo conntrack -L | grep "dport=80" # 若有大量ESTABLISHED状态,说明连接正常建立

实操记录:本次操作后,curl http://192.168.1.100返回200,但curl https://192.168.1.100超时——原来Nginx没配HTTPS,不是防火墙问题。这说明:验证必须覆盖实际业务端口,不能只测80。另外,conntrack -L显示连接状态,比单纯看端口更准,因为TCP三次握手完成才算真正通。

4.5 第五步:善后与回滚——安全闭环的必备动作

关完不是结束,而是开始:

# 1. 记录操作日志(运维黄金准则) echo "$(date): ufw permanently disabled and iptables reset by $(whoami)" | sudo tee -a /var/log/firewall-change.log # 2. 创建回滚脚本(放在/home下,命名清晰) cat > ~/rollback-firewall.sh << 'EOF' #!/bin/bash # 回滚:重新启用ufw并恢复默认规则 sudo sed -i 's/ENABLED=no/ENABLED=yes/' /etc/default/ufw sudo ufw enable sudo ufw default deny incoming sudo ufw allow OpenSSH EOF chmod +x ~/rollback-firewall.sh # 3. 通知相关人员(邮件/IM) echo "防火墙已永久禁用,IP: $(hostname -I | awk '{print $1}')" | mail -s "【运维通知】防火墙变更" admin@example.com

经验之谈:我坚持每条高危操作都写回滚脚本,哪怕当时觉得“不可能出错”。去年一次批量更新,脚本里iptables -P INPUT DROP少了个ACCEPT,导致20台服务器全部失联。幸好有回滚脚本,3分钟内全部恢复。回滚脚本必须:

  • 用sudo sed -i直接改配置,不依赖交互;
  • ufw default deny incoming设默认拒绝,比ufw reset更可控;
  • ufw allow OpenSSH确保远程通道畅通,这是生命线。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

以下是我踩过的、同事问爆的、客户现场高频问题,全是血泪经验,按发生频率排序。

5.1 问题一:“关了防火墙,端口还是不通!”——真相是云平台安全组在作祟

现象:ufw disable后,iptables -L全空,ss -tuln | grep 80显示监听,但外网curl超时。
排查路径:

  1. 先确认是否云服务器:curl http://169.254.169.254/latest/meta-data/instance-id(AWS)或curl http://100.100.100.200/latest/meta-data/instance-id(阿里云),有返回即云环境;
  2. 登云平台控制台,查“安全组”规则,确认入方向80端口是否开放;
  3. 云安全组优先级高于系统防火墙,即使系统关了,安全组没开照样不通。

解决方案:云环境必须双开——系统防火墙+云安全组。阿里云安全组默认只开22,需手动添加80/443;AWS安全组需在Inbound Rules里加HTTP规则。记住:systemctl stop firewalld对云安全组零影响。

5.2 问题二:“重启后防火墙又开了!”——systemd启动顺序的陷阱

现象:systemctl disable firewalld后重启,systemctl is-active firewalld返回active。
根因:某些服务(如cloud-init、NetworkManager)在启动时会检测firewalld状态,若发现disabled,会自动systemctl start firewalld。
验证:

# 查看启动日志中firewalld的启动记录 sudo journalctl -b | grep firewalld | head -5 # 若看到"Started firewalld..."且时间在NetworkManager之后,就是它干的

解决:

# 屏蔽firewalld(比disable更彻底) sudo systemctl mask firewalld # mask会创建指向/dev/null的软链接,任何start/enable都失败 # 或禁用触发服务(谨慎!) sudo systemctl disable cloud-init

5.3 问题三:“Docker容器网络断了!”——iptables规则被清空的连锁反应

现象:iptables -F后,容器能ping通宿主机,但无法访问外网,curl google.com超时。
原理:Docker在nat表中创建POSTROUTING链,执行MASQUERADE实现SNAT,清空iptables会删掉此规则。
修复:

# 重启docker服务(自动重建规则) sudo systemctl restart docker # 或手动添加(临时) sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

表格:Docker相关iptables链及作用
| 链名 | 表 | 作用 | 清空后影响 |
|------|----|------|------------|
| DOCKER | filter | 容器端口映射过滤 | 容器端口无法访问 |
| DOCKER-USER | filter | 用户自定义规则入口 | 自定义规则失效 |
| POSTROUTING | nat | 容器出网SNAT | 容器无法访问外网 |

5.4 问题四:“systemctl上传不了中文名称文件”——与防火墙无关的冤案

现象:标题里提到的热搜词,其实是常见误解。systemctl是服务管理命令,不涉及文件上传;上传中文名文件失败,通常是SFTP/SCP客户端编码问题或/etc/vsftpd.conf中utf8_filesystem=YES未设置。
验证:

# 测试纯命令行上传(排除GUI干扰) scp -r 你好.txt user@server:/tmp/ # 若成功,说明是客户端问题;若失败,看错误信息

提示:这类问题常被归咎于防火墙,但实际与netfilter无关。真正该查的是:SSH配置(/etc/ssh/sshd_config中AcceptEnv LANG LC_*)、SFTP服务端编码、客户端locale设置。别让防火墙背锅。

5.5 问题五:“防火墙关闭有影响吗?”——安全与便利的平衡术

真相:关闭防火墙不等于“不安全”,而是把防护责任转移到其他层:

  • 网络层:依赖路由器ACL、交换机端口安全;
  • 应用层:Nginx/Apache配置allow/deny、应用自身鉴权;
  • 主机层:SSH密钥登录、fail2ban防爆破、定期更新补丁。

我的实践建议:

  • 生产环境:永不关闭,用firewall-cmd --add-port=8080/tcp --permanent精确开放;
  • 开发环境:永久禁用,但宿主机用VirtualBox/VMware的网络模式设为NAT,天然隔离;
  • CI/CD节点:清空iptables,但用iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT只允内网访问,再-P INPUT DROP。

最后分享个小技巧:用alias fwoff='sudo systemctl stop firewalld && sudo iptables -F && sudo iptables -P INPUT ACCEPT'定义快捷命令,但务必配上alias fwoff='sudo systemctl start firewalld && sudo firewall-cmd --reload'回滚别名。我把它写进~/.bashrc,每天用十几次,从未翻车。

6. 不同发行版与国产系统的实操差异:CentOS、Ubuntu、银河麒麟、openEuler专项指南

虽然都是Linux,但发行版差异让“关防火墙”变成一场适配游戏。下面按主流系统分类,给出精准命令和注意事项。

6.1 CentOS/RHEL 7-8:firewalld为主力,nftables渐进替代

CentOS 7:

  • 默认firewalld,iptables-services包可选;
  • 关闭命令:sudo systemctl disable firewalld && sudo systemctl stop firewalld;
  • 若装了iptables,需同步sudo systemctl disable iptables && sudo systemctl stop iptables。

CentOS 8/RHEL 8+:

  • 默认nftables,firewalld后端已切nft;
  • iptables命令仍可用(兼容层),但iptables-save保存到/etc/sysconfig/iptables无效;
  • 正确持久化:sudo nft list ruleset > /etc/nftables.conf,并sudo systemctl enable nftables。

注意:RHEL 8+中firewall-cmd操作的仍是nftables规则,sudo firewall-cmd --list-all-zones看到的规则实际存于nft表中。nft list ruleset输出比iptables -S更简洁,推荐用nft替代iptables。

6.2 Ubuntu/Debian:ufw是亲儿子,iptables是老前辈

Ubuntu 20.04+:

  • 默认ufw,iptables命令存在但不默认启用;
  • 关闭:echo "ENABLED=no" | sudo tee /etc/default/ufw && sudo ufw disable;
  • 持久化iptables:sudo apt install iptables-persistent,然后sudo netfilter-persistent save。

Debian 11+:

  • 默认无防火墙,但iptables包需手动安装;
  • 若装了ufw,处理同Ubuntu;
  • 若裸用iptables,持久化靠/etc/network/if-pre-up.d/iptables脚本。

实操对比:Ubuntu的ufw日志在/var/log/ufw.log,Debian需手动配置rsyslog;Ubuntu的ufw allow 'OpenSSH'用服务名,Debian需写端口号ufw allow 22。

6.3 银河麒麟V10:国产系统里的“双模防火墙”

银河麒麟基于Ubuntu,但深度定制:

  • 图形界面有“麒麟安全中心”,后台服务叫kylin-firewall;
  • 命令行仍兼容ufw,但sudo ufw status可能显示inactive,而安全中心显示“已开启”;
  • 真正控制权在/etc/kylin-firewall/配置目录;
  • 安全合规要求:禁用防火墙需sudo kylin-firewall --disable,而非ufw命令。

风险提示:直接ufw disable可能被安全中心自动恢复。必须用厂商命令,或联系麒麟技术支持获取kylin-firewall的CLI文档。我曾在一个政务项目里,ufw disable后5分钟,systemctl status kylin-firewall显示active,日志里有“auto-recover triggered”。

6.4 openEuler 22.03:华为系新锐,firewalld+nftables双引擎

openEuler默认firewalld,但底层用nftables:

  • firewall-cmd操作生效,iptables命令被重定向到nft;
  • 持久化配置在/etc/firewalld/,规则存于nft;
  • 关闭命令同CentOS 8:sudo systemctl disable firewalld && sudo systemctl stop firewalld;
  • 验证用sudo nft list ruleset,而非iptables -L。

特别注意:openEuler的dnf包管理器中,firewalld包依赖nftables,卸载firewalld不会卸载nftables,但nft list ruleset可能仍有残留规则,需sudo nft flush ruleset彻底清空。

6.5 Docker Desktop for Linux:桌面环境的隐形防火墙

Docker Desktop在Linux上用WSL2或专用VM,其防火墙独立于宿主机:

  • Windows宿主机防火墙可能拦截Docker端口;
  • Linux宿主机上,Docker Desktop启动的VM有自己的firewalld;
  • 解决方案:在Docker Desktop设置里关“Firewall integration”,或在VM内执行sudo systemctl stop firewalld。

经验:Docker Desktop的Linux VM默认IP是192.168.65.0/24,若宿主机防火墙-A INPUT -s 192.168.65.0/24 -j ACCEPT没开,容器端口映射会失败。这不是宿主机问题,而是VM网络策略。

7. 安全底线与最佳实践:什么时候不该关,以及替代方案

最后,必须划清红线:不是所有场景都适合关防火墙。关是手段,不是目的;目的是让服务可达,而防火墙只是其中一环。以下是不可妥协的安全底线和更优替代方案。

7.1 绝对禁止关闭防火墙的三大场景

1. 互联网直连的生产服务器
哪怕只开一个端口,也必须用防火墙做最小权限开放。`firewall-cmd --add-port=443/tcp --

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询