Linux防火墙快速配置3招:Firewalld与Iptables实战指南
1. 项目概述为什么你需要掌握这三招在Linux世界里防火墙是你服务器的“门神”。无论是部署一个Web应用、搭建数据库还是运行一个微服务集群第一道安全防线往往就是它。但很多朋友尤其是刚接触运维或者开发的朋友一看到firewall-cmd那一长串命令或者iptables里复杂的规则链就有点发怵要么直接systemctl stop firewalld一关了之要么照着网上零散的教程操作结果端口没开对服务访问不了排查半天。我自己在管理线上服务器时也踩过不少坑。比如明明用firewall-cmd开了端口重启服务后规则丢了或者配置了iptables结果把自己SSH连接给阻断不得不去控制台救急。这些经历让我意识到掌握一套清晰、快速且可靠的防火墙配置方法不是“加分项”而是“生存技能”。今天要聊的“Linux防火墙快速配置3招”就是针对这种痛点提炼的。它不追求大而全的命令手册而是聚焦于三个最核心、最高频的应用场景快速启用与状态管理、精准开放服务端口、以及应对复杂策略的规则持久化。无论你用的是CentOS 7/8、Rocky Linux、AlmaLinux等默认搭载Firewalld的现代发行版还是Ubuntu、Debian或一些老系统上常见的iptables这三招的思路是相通的只是命令不同。我们的目标是让你在5分钟内能 confidently有信心地搞定服务器的基础网络访问控制把精力更多放在业务本身。2. 第一招防火墙服务管理——启动、停止与状态确认这是所有操作的起点。如果连防火墙服务本身都没搞明白后续的配置就是空中楼阁。这一招的核心是建立你对防火墙服务生命周期的控制力。2.1 理解Firewalld与Iptables的选择首先得弄清楚你系统上跑的是谁。现在主流的Linux发行版RHEL/CentOS 7, Fedora, openSUSE等默认使用Firewalld。它是个动态防火墙管理器背后其实还是调用iptables或nftables的规则但提供了更友好的firewall-cmd命令行接口和zone区域的概念规则可以动态更新而无需重启服务对新手更友好。而Iptables则是更经典、直接的包过滤工具规则直接、强大但配置相对繁琐规则变更需要谨慎处理。在一些云服务器镜像、Ubuntu Server默认使用ufw但底层是iptables或老系统中更常见。怎么快速判断执行这个命令sudo firewall-cmd --state 2/dev/null echo “Firewalld is running.” || sudo iptables -L -n 2/dev/null echo “Iptables is in use (or firewalld is stopped).”如果返回“Firewalld is running.”那我们就用第一套Firewalld命令。如果看到一堆链Chain和规则或者提示firewall-cmd命令未找到那就很可能在用iptables。注意有些服务器可能同时安装了firewalld和iptables-services但默认只启用一个。不要同时激活两者否则规则会冲突导致网络行为不可预测。2.2 Firewalld服务管理实操对于使用Firewalld的系统服务管理主要通过systemctl命令。1. 查看防火墙状态这是你每次操作前都应该做的第一步确认防火墙是否在运行。sudo systemctl status firewalld这个命令会输出详细的服务状态。你主要看两行Active: active (running)表示防火墙正在运行。Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)中的enabled表示已设置开机自启。一个更简洁的查看命令是sudo firewall-cmd --state直接返回running或not running。2. 启动与停止防火墙启动防火墙sudo systemctl start firewalld停止防火墙sudo systemctl stop firewalld3. 设置开机自启或禁用启用开机自启sudo systemctl enable firewalld禁用开机自启sudo systemctl disable firewalld4. 重新加载配置非常重要Firewalld修改规则后需要重新加载才能使变更生效但不会中断现有连接。这是Firewalld的一大优点。sudo firewall-cmd --reload千万别用systemctl restart firewalld来让规则生效这会重启整个防火墙服务可能导致短暂的网络中断。2.3 Iptables服务管理实操对于使用传统iptables的系统如CentOS 6或某些最小化安装管理方式略有不同。1. 查看iptables状态sudo service iptables status或者sudo systemctl status iptables # 如果系统是systemd管理如果看到规则列表说明服务正在运行且已配置规则。2. 启动与停止iptablessudo service iptables start sudo service iptables stop3. 保存与恢复规则iptables的命门这是iptables新手最容易踩坑的地方通过iptables命令直接添加的规则仅存在于内存中重启服务器就会丢失临时添加规则用iptables -A等命令立刻生效但重启消失。永久保存规则必须将当前内存中的规则保存到配置文件中。sudo service iptables save # 在CentOS 6/RHEL 6等系统或者在一些使用iptables-persistent的Debian/Ubuntu系统上sudo netfilter-persistent save保存后规则会写入/etc/sysconfig/iptablesRHEL系或/etc/iptables/rules.v4Debian系文件。4. 开机自启sudo chkconfig iptables on # CentOS 6 sudo systemctl enable iptables # 使用systemd的系统实操心得我强烈建议在操作iptables任何可能影响现有连接尤其是INPUT链的规则前先设置一个crontab任务每分钟检查SSH端口22是否还被允许或者更保险的做法在物理控制台或云服务器控制台预留一个救援会话。我曾经因为一条错误的iptables -P INPUT DROP策略把自己锁在服务器外面。3. 第二招端口与服务的开放——精准控制访问防火墙的核心功能就是控制流量。这一招教你如何精确地打开或关闭一扇“门”端口或者信任一个“送货员”服务。3.1 Firewalld的“区域Zone”概念Firewalld引入了“区域”来简化管理。你可以把区域理解为不同的安全级别场景模板比如public默认在公共场所使用仅允许选定的传入连接。trusted信任所有网络连接。home家庭网络信任度较高。internal内部网络信任度类似home。每个网卡可以绑定到一个区域。默认情况下新网卡会加入public区域。我们的操作通常围绕public区域进行。3.2 使用Firewalld开放端口最常用假设我们要开放TCP协议的8080端口给外部访问。1. 查看当前已开放的端口sudo firewall-cmd --zonepublic --list-ports2. 临时开放端口重启防火墙或服务器后失效sudo firewall-cmd --zonepublic --add-port8080/tcp这适用于临时测试。添加后可以立即用--list-ports查看。3. 永久开放端口sudo firewall-cmd --zonepublic --add-port8080/tcp --permanent--permanent参数表示将规则写入永久配置。但注意加了--permanent后规则不会立即生效必须执行重载sudo firewall-cmd --reload然后再次用--list-ports确认。4. 开放一个端口范围比如开放从5000到5010的TCP端口sudo firewall-cmd --zonepublic --add-port5000-5010/tcp --permanent sudo firewall-cmd --reload5. 移除已开放的端口sudo firewall-cmd --zonepublic --remove-port8080/tcp --permanent sudo firewall-cmd --reload3.3 使用Firewalld开放服务更语义化Firewalld预定义了许多常见的服务如http,https,ssh,mysql等。开放服务比开放端口更友好因为它包含了该服务可能需要的所有端口和协议。1. 查看所有预定义服务sudo firewall-cmd --get-services2. 永久开放HTTP80端口和HTTPS443端口服务sudo firewall-cmd --zonepublic --add-servicehttp --add-servicehttps --permanent sudo firewall-cmd --reload这比分别添加80/tcp和443/tcp两个端口更简洁也不容易遗漏。3. 移除服务sudo firewall-cmd --zonepublic --remove-servicemysql --permanent sudo firewall-cmd --reload3.4 使用Iptables开放端口在iptables中我们需要直接操作规则链。最常用的是INPUT链处理到达本机的数据包。1. 开放单个端口例如TCP 80sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT-A INPUT: 向INPUT链末尾追加一条规则。-p tcp: 指定协议为TCP。--dport 80: 指定目标端口为80。-j ACCEPT: 匹配此规则后的动作是“接受”。2. 开放UDP端口sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT # 开放DNS端口3. 开放端口范围sudo iptables -A INPUT -p tcp --dport 3000:3010 -j ACCEPT4. 允许本地回环loopback接口通信非常重要许多本地服务如数据库连接需要通过回环地址127.0.0.1通信必须允许。sudo iptables -A INPUT -i lo -j ACCEPT5. 允许已建立的和相关的连接这是保证你对外发起的请求能有回应包回来的关键规则通常放在靠前位置。sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT6. 设置默认策略在添加完所有允许ACCEPT规则后通常将INPUT链的默认策略设置为拒绝DROP实现“白名单”模式。sudo iptables -P INPUT DROP警告执行此命令前请务必确保你已经允许了SSH端口通常是22否则你会立刻断开连接一个安全的顺序是先sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT再设置默认策略。7. 保存规则切记执行完上述所有命令后内存中的规则已经生效。但必须保存到硬盘sudo service iptables save # 或你系统对应的保存命令3.5 高级技巧针对特定IP开放端口有时我们只想让某个特定的管理IP访问某个端口如数据库的3306端口。在Firewalld中使用富规则rich rule。sudo firewall-cmd --zonepublic --add-rich-rulerule familyipv4 source address192.168.1.100 port protocoltcp port3306 accept --permanent sudo firewall-cmd --reload在Iptables中sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPT这里-s 192.168.1.100指定了源IP地址。注意事项在配置数据库、Redis等中间件端口时强烈建议结合这种“IP白名单”和“修改默认监听地址”从0.0.0.0改为127.0.0.1或内网IP的方式双重保障安全。永远不要将敏感服务的端口直接暴露给整个互联网。4. 第三招规则查看、调试与持久化——让你的配置稳如磐石配置完了怎么知道生效了规则多了怎么管理怎么备份这一招解决运维中的“ visibility”可见性和“reliability”可靠性问题。4.1 Firewalld规则查看与验证1. 查看所有信息综合诊断sudo firewall-cmd --list-all或者指定区域sudo firewall-cmd --zonepublic --list-all这个命令会一次性列出该区域的所有设置启用的服务、开放的端口、网卡接口、富规则等非常直观。2. 分别查看不同配置查看服务sudo firewall-cmd --list-services查看端口sudo firewall-cmd --list-ports查看富规则sudo firewall-cmd --list-rich-rules3. 验证某个端口或服务是否已开放sudo firewall-cmd --zonepublic --query-port8080/tcp如果开放返回yes否则返回no。sudo firewall-cmd --zonepublic --query-servicehttp4. 查看运行时配置与永久配置sudo firewall-cmd --list-all查看当前运行时配置。sudo firewall-cmd --list-all --permanent查看已写入的永久配置。 两者对比可以检查--reload是否成功或者是否有未保存的临时规则。4.2 Iptables规则查看与解析Iptables的规则查看更底层信息量也更大。1. 查看所有链的所有规则默认filter表sudo iptables -L -n-L: 列出规则。-n: 以数字形式显示IP和端口不进行DNS反向解析速度更快。 输出分为INPUT、FORWARD、OUTPUT等链每条链下面按顺序排列着规则。2. 查看规则时显示行号用于后续删除或插入规则sudo iptables -L -n --line-numbers这个功能极其重要你会看到每条规则前面有一个数字编号。3. 以详细模式查看sudo iptables -L -n -v-v会显示更多信息如该规则匹配了多少数据包packets和字节bytes帮你判断规则是否被触发。4. 查看NAT表规则如果你做了端口转发sudo iptables -t nat -L -n -v4.3 规则的修改与删除在Firewalld中删除规则就是添加规则的反向操作使用--remove-参数。sudo firewall-cmd --zonepublic --remove-port8080/tcp --permanent sudo firewall-cmd --reload在Iptables中删除规则需要指定规则所在链和行号。 假设我们要删除INPUT链的第3条规则sudo iptables -D INPUT 3-D表示删除。删除后后面的规则行号会自动前移。如果不确定行号可以先执行sudo iptables -L -n --line-numbers查看。更稳妥的删除方式是指定完整的规则描述当你记不清行号时sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT4.4 配置的备份与恢复持久化的终极保障无论用Firewalld还是Iptables定期备份防火墙配置都是个好习惯特别是在进行重大变更之前。Firewalld备份Firewalld的永久配置存储在/etc/firewalld/目录下主要是zones/子目录下的XML文件。你可以直接备份这个目录。sudo cp -r /etc/firewalld /backup/firewalld_backup_$(date %Y%m%d)恢复时停止防火墙用备份文件覆盖原目录再启动即可。更简单的方法是导出活动区域配置sudo firewall-cmd --runtime-to-permanent # 将当前运行时配置转为永久配置覆盖 # 然后备份 /etc/firewalld 目录Iptables备份与恢复备份当前规则sudo iptables-save /backup/iptables_rules_backup_$(date %Y%m%d).rules从备份文件恢复规则sudo iptables-restore /backup/iptables_rules_backup_20231027.rules恢复后别忘了再次保存到系统配置文件中否则重启后还是旧的。sudo service iptables save直接备份配置文件 RHEL/CentOS系sudo cp /etc/sysconfig/iptables /backup/Debian/Ubuntu系sudo cp /etc/iptables/rules.v4 /backup/4.5 一个完整的配置检查清单在完成防火墙配置并认为自己大功告成时请按照这个清单走一遍可以避免80%的后续问题服务状态systemctl status firewalld或service iptables status确认服务是active (running)。规则列表用firewall-cmd --list-all或iptables -L -n确认你添加的端口/服务规则是否存在。默认策略对于iptables确认INPUT链的默认策略iptables -L -n第一行是否符合预期通常是DROP或ACCEPT。关键端口确认SSH端口22或你自定义的是否在允许列表中。这是生命线。本地通信确认回环接口lo和ESTABLISHED,RELATED状态规则iptables已允许。保存状态对于iptables确认已执行service iptables save。对于firewalld确认使用了--permanent并执行了--reload。重启测试在确保有控制台访问权限的前提下重启防火墙服务systemctl restart firewalld或重启服务器检查规则是否依然生效服务是否能正常访问。外部测试从另一台机器使用telnet 你的IP 端口或nmap -p 端口 你的IP来测试端口是否真正对外开放。5. 常见问题与排查技巧实录即使按照步骤操作也难免会遇到“为什么还是连不上”的情况。这里记录了几个我遇到最多、也最让人头疼的问题和解决方法。5.1 问题一Firewalld显示端口已开放但外部依然无法访问可能原因及排查步骤检查是否使用了--permanent和--reload这是最常见的原因。很多人只执行了firewall-cmd --add-port忘了加--permanent或者加了但忘了--reload。用firewall-cmd --list-ports --permanent和firewall-cmd --list-ports对比一下。检查区域绑定你的网卡可能不在public区域。用firewall-cmd --get-active-zones查看活动区域和绑定的接口。如果你的服务器IP对应的网卡比如eth0或ens192不在public区域下规则就不生效。可以用sudo firewall-cmd --zonepublic --change-interfaceeth0 --permanent来更改绑定。检查服务是否真的在监听防火墙只是“守门员”如果“家里没人”服务没启动门开了也没用。在服务器上执行sudo ss -tlnp | grep :8080查看8080端口是否有进程在监听以及监听地址是0.0.0.0还是127.0.0.1。如果只监听在127.0.0.1那么外部是无法访问的需要修改服务配置。云服务器安全组如果你用的是阿里云、腾讯云、AWS等云服务器云平台的安全组规则是更外一层的防火墙必须也在云控制台开放相应端口。这是很多人忽略的一点SELinux干扰在某些严格策略下SELinux可能会阻止网络服务绑定端口。可以临时设置为宽容模式测试sudo setenforce 0。如果问题解决则需要针对该服务配置SELinux策略而不是永久关闭SELinux。5.2 问题二配置Iptables后服务器自己无法访问外网如yum update失败可能原因你设置了iptables -P INPUT DROP但可能忘记了允许本机发出的请求的回应包进入或者忘记了设置OUTPUT链策略。解决方案确保你的规则顺序包含以下关键规则# 1. 允许本地回环 sudo iptables -A INPUT -i lo -j ACCEPT # 2. 允许已建立/相关的连接回应包靠这条 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 3. 允许SSH等你的服务端口... # 4. 设置INPUT默认策略为DROP sudo iptables -P INPUT DROP # 5. 通常OUTPUT链可以设为ACCEPT允许本机所有出站流量 sudo iptables -P OUTPUT ACCEPT规则顺序很重要ESTABLISHED,RELATED这条应该放在比较靠前的位置。5.3 问题三Iptables规则混乱想快速重置到默认安全状态不要慌按步骤来设置默认策略为ACCEPT避免被锁sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT清空所有链的所有规则sudo iptables -F删除所有用户自定义的链sudo iptables -X重置所有计数器sudo iptables -Z现在你有一张“白纸”了。重新应用你的基础安全规则比如允许SSH、允许本地通信等。最后别忘了保存sudo service iptables save。5.4 问题四Firewalld和Iptables服务冲突现象执行防火墙命令报错或者网络行为异常。解决确保系统上只有一个防火墙管理服务在运行。检查并停止其中一个sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl stop iptables sudo systemctl disable iptables然后启用你打算用的那个。对于现代系统我推荐优先使用firewalld除非有特殊兼容性要求。5.5 一个实用的调试命令tcpdump当所有配置都看似正确但连接就是不通时终极武器是抓包。sudo tcpdump -i any port 8080 -nnvv在服务器上运行此命令然后从客户端尝试连接。观察服务器网卡上是否有收到来自客户端IP和8080端口的SYN包。如果没收到问题可能在更外层云安全组、网络ACL、客户端本身。如果收到了SYN包但没有回复SYN-ACK那问题很可能就在服务器的防火墙或服务本身。这个工具能帮你把问题范围缩小到具体环节。