1. 项目概述重新认识Linux系统安全每次看到“Linux防火墙配置”这个标题很多朋友的第一反应可能就是去搜几条iptables或firewalld的命令觉得配几条规则、开几个端口就算完事了。我刚开始接触运维的时候也是这么想的直到有一次线上服务器被当成肉鸡疯狂对外发包我才彻底明白真正的系统安全远不止于在门口放个保安那么简单。它更像是一个立体的、动态的防御体系而防火墙只是这个体系中最显眼、但也最容易被误解的一环。今天我们就来彻底拆解一下“Linux系统安全”这个宏大命题。它绝不是一个孤立的配置任务而是一套从底层内核加固、到网络访问控制、再到应用服务防护的完整方法论。无论是刚接触Linux的新手还是有一定基础但想构建系统化安全认知的同行这篇文章都将带你从零开始搭建一个既坚固又灵活的安全防线。我们会从最基础的原理讲起逐步深入到实战配置并分享那些只有踩过坑才知道的“潜规则”和排查技巧。收藏这一篇不是因为它能解决所有问题而是因为它能帮你建立一个正确的安全观和一套可复用的排查框架。2. 核心需求解析我们到底在防什么在动手敲任何命令之前我们必须先搞清楚防御的目标。盲目配置规则往往会导致该防的没防住不该挡的却打不开给日常运维带来无数麻烦。2.1 威胁模型分析攻击者从哪来想干嘛一个清晰的威胁模型是安全建设的起点。对于一台典型的Linux服务器我们主要面临以下几类威胁网络层攻击这是最直接的威胁。包括端口扫描与探测攻击者使用nmap等工具扫描你的服务器寻找开放的端口和运行的服务识别潜在漏洞。暴力破解针对SSH、FTP、数据库等服务的登录接口使用自动化工具尝试海量用户名密码组合。拒绝服务DoS/DDoS通过海量垃圾流量耗尽服务器的带宽、连接数或CPU资源使其无法提供正常服务。漏洞利用针对特定服务如Apache、Nginx、Redis的已知漏洞发起攻击试图获取权限或执行恶意代码。主机层攻击如果攻击者已经通过某种方式如应用漏洞在系统上执行了命令那么防御重点就转向了限制其横向移动和权限提升。权限提升Privilege Escalation攻击者利用系统配置错误、内核漏洞或SUID程序漏洞从普通用户权限提升到root权限。信息窃取读取/etc/passwd、/etc/shadow、应用配置文件、数据库连接字符串等敏感信息。持久化驻留在系统中安装后门、创建隐藏账户、设置定时任务cron或系统服务以便长期控制。应用层攻击这通常与防火墙关系不大但却是最常被攻破的入口。例如SQL注入、跨站脚本XSS、远程代码执行RCE等。防火墙虽然无法解析HTTP请求内容但可以通过限制访问来源、频率等方式为应用安全争取时间。2.2 安全配置的核心目标基于以上威胁我们的安全配置需要达成以下几个核心目标最小权限原则任何用户、进程、服务都只拥有完成其功能所必需的最小权限。比如运行Web服务的用户不应该有读写系统日志目录的权限。纵深防御不依赖单一安全措施。即使防火墙被绕过还有SELinux/AppArmor即使应用被攻破还有文件系统权限和用户隔离。多层防御使得攻击成本大大增加。减少攻击面关闭所有不必要的服务、端口和功能。一台服务器运行的服务越少潜在的漏洞就越少。监控与审计能够发现异常行为并及时告警。安全不是一劳永逸的配置而是一个持续监控和响应的过程。理解了这些我们再去看防火墙配置就会明白它主要聚焦于网络层攻击的防御是纵深防御的第一道关卡但绝非全部。3. 防火墙基石从iptables到firewalld的演进与选择提到Linux防火墙iptables是一个无法绕开的基石。即使你现在用着更友好的firewalld或ufw理解iptables的核心概念也至关重要因为它们是前者的底层引擎。3.1 iptables核心概念四维表iptables的规则并非杂乱无章而是被组织在几个内置的“表”和“链”中。你可以把它想象成一个有多层过滤网的流水线。四个核心表filter表最常用的表负责过滤数据包决定是放行ACCEPT还是拒绝DROP/REJECT。我们常说的防火墙规则大多在这里。nat表用于网络地址转换例如做SNAT让内网机器上外网或DNAT端口映射。mangle表用于修改数据包内容如修改TTL值、设置QoS标记等。一般使用较少。raw表用于配置数据包是否被连接跟踪机制处理。在不想让某些流量被状态跟踪时会用到。五个内置链以filter表为例数据包会像流水线上的零件依次经过不同的检查点链INPUT处理发往本机的数据包。比如有人访问你的SSH服务这个包就会经过INPUT链。OUTPUT处理从本机发出的数据包。FORWARD处理经过本机转发的数据包当你的Linux充当路由器时。PREROUTING(nat/mangle/raw表)数据包进入后在路由决策之前处理。POSTROUTING(nat/mangle表)数据包发出前在路由决策之后处理。一条规则的基本构成是匹配条件 执行动作target。例如“如果数据包来自192.168.1.100且目标端口是22那么就允许它。”实操心得很多新手会混淆DROP和REJECT。DROP是直接丢弃包不回应任何信息对方会一直等待直到超时。REJECT会返回一个“拒绝访问”的响应如ICMP port-unreachable。从安全角度DROP更能隐藏你的存在但可能给调试带来麻烦。对于明确的恶意IP用DROP对于可能误操作的内网IP用REJECT更友好。3.2 firewalld更符合现代需求的动态防火墙管理器iptables功能强大但规则管理繁琐直接修改规则文件是静态的更改后需要全部重载。firewalld的出现解决了这些问题动态管理规则运行时即可更新无需重启服务不会中断现有连接。区域Zone概念将网络接口绑定到不同的信任区域如public、internal、dmz每个区域有预定义的规则集。这非常贴合服务器可能有多个网卡、处于不同网络环境如外网、内网、管理网的场景。服务Service管理预定义了常见服务如ssh、http、https的端口和协议可以直接放行服务而非手动记端口。富规则Rich Rules提供更强大、更易读的规则语法支持源IP、时间、日志等复杂条件。如何选择新手/追求便捷CentOS/RHEL 7、Fedora、OpenSUSE等默认集成了firewalld直接用它上手快管理方便。深度控制/老派运维Debian/Ubuntu系传统上多用iptables或者你需要编写非常复杂的、firewalld富规则难以表达的规则时可以直接操作iptables。不过Ubuntu也推荐使用ufw底层也是iptables。生产环境建议我个人在CentOS/RHEL生产环境中首选firewalld。它的区域概念和动态特性非常适合应对网络变更。对于Debian/Ubuntuufw是极佳的选择。4. 实战构建从零配置一个生产级防火墙策略光说不练假把式。下面我们以firewalld为例一步步搭建一个兼顾安全和可用的防火墙策略。假设我们有一台新装的CentOS 8服务器需要部署Web服务HTTP/HTTPS和提供SSH管理。4.1 初始状态检查与清场首先查看防火墙状态和默认区域。sudo systemctl status firewalld # 查看服务状态 sudo firewall-cmd --state # 查看运行状态 sudo firewall-cmd --get-default-zone # 查看默认区域通常是public sudo firewall-cmd --list-all # 列出默认区域的所有规则如果系统之前有杂乱的iptables规则为了纯净起点可以谨慎操作# 临时停止firewalld并清空iptables规则会断网务必在本地控制台操作 sudo systemctl stop firewalld sudo iptables -F # 清空filter表所有链规则 sudo iptables -X # 删除用户自定义链 sudo iptables -Z # 计数器归零 sudo systemctl start firewalld4.2 策略定制白名单优于黑名单安全的核心思想是“默认拒绝按需放行”。我们先将默认区域public的策略设置为DROP然后只开放必要的端口。设置默认策略为DROP注意直接设置--set-default-zonedrop会立刻断开所有连接包括你当前的SSH所以我们需要更稳妥的方法创建一个新的严格区域再将网卡移入。# 创建一个名为‘strict’的新区域默认策略为DROP sudo firewall-cmd --permanent --new-zonestrict sudo firewall-cmd --permanent --zonestrict --set-targetDROP # 将我们需要的服务SSH先添加到这个区域否则加进去就失联了 sudo firewall-cmd --permanent --zonestrict --add-servicessh # 重载配置使新区域生效 sudo firewall-cmd --reload # 将你的公网网卡例如eth0绑定到strict区域 sudo firewall-cmd --permanent --zonestrict --change-interfaceeth0 sudo firewall-cmd --reload现在除了SSH所有其他入站流量都被丢弃了。放行Web服务sudo firewall-cmd --permanent --zonestrict --add-servicehttp sudo firewall-cmd --permanent --zonestrict --add-servicehttps sudo firewall-cmd --reload放行特定源IP的SSH强烈推荐如果管理服务器的IP是固定的例如公司出口IP203.0.113.100将其设为白名单能极大减少暴力破解。sudo firewall-cmd --permanent --zonestrict --add-rich-rulerule familyipv4 source address203.0.113.100 service namessh accept # 同时移除之前对所有人开放的SSH规则避免规则冲突或冗余 sudo firewall-cmd --permanent --zonestrict --remove-servicessh sudo firewall-cmd --reload现在只有来自203.0.113.100的IP可以SSH其他IP连22端口都无法连接。配置内部/管理区域如果服务器有第二块网卡如eth1IP段10.0.0.0/24用于内网管理或内部服务通信我们可以将其放入更宽松的internal区域。sudo firewall-cmd --permanent --zoneinternal --change-interfaceeth1 sudo firewall-cmd --permanent --zoneinternal --add-servicessh # 内网可以SSH sudo firewall-cmd --permanent --zoneinternal --add-servicemysql # 例如内网可以访问数据库 sudo firewall-cmd --reload4.3 高级防护规则配置基础的端口开关只是第一步下面这些规则能让你的防火墙更智能。限制连接速率防暴力破解即使SSH端口暴露也可以通过限制单IP的连接频率来增加破解难度。# 使用富规则限制每分钟同一源IP最多新建3个SSH连接超过则拒绝 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 service namessh limit value3/m accept sudo firewall-cmd --reload记录并拒绝异常扫描对于尝试连接我们未开放端口的行为直接拒绝并记录日志便于后续分析。# 在strict区域的末尾添加一条默认日志规则注意顺序这条应放在最后 # 先添加一条拒绝所有并记录的规则谨慎会记录大量日志 # sudo firewall-cmd --permanent --zonestrict --add-rich-rulerule familyipv4 log prefixFIREWALL_DROP: levelinfo limit value1/m drop # 更佳实践只对尝试连接某些高危空端口的行为记录日志 # 例如记录尝试连接常见未开端口如21/ftp, 23/telnet, 445/smb的请求 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 port port21 protocoltcp log prefixFTP_SCAN: levelwarning drop sudo firewall-cmd --reload日志可以在/var/log/messages或journalctl -u firewalld中查看。IPset管理大批量IP如果你需要封禁一个很长的IP地址列表例如已知的攻击源一条条写富规则很低效。firewalld支持ipset。# 创建一个名为“blocklist”的ipset存储IPv4地址 sudo firewall-cmd --permanent --new-ipsetblocklist --typehash:ip --optionfamilyinet # 向ipset中添加IP支持CIDR格式 sudo firewall-cmd --permanent --ipsetblocklist --add-entry192.168.2.0/24 sudo firewall-cmd --permanent --ipsetblocklist --add-entry10.1.1.100 # 使用富规则引用这个ipset拒绝其所有流量 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 source ipsetblocklist drop sudo firewall-cmd --reload # 查看ipset内容 sudo firewall-cmd --info-ipsetblocklist5. 超越防火墙构建系统级纵深防御体系配置好防火墙我们只完成了安全建设的一半。真正的坚固堡垒需要多层防御。下面介绍几个必须配置的系统级安全措施。5.1 SSH服务加固关掉大门上的破窗SSH是服务器最重要的入口必须重点加固。修改默认端口将端口从22改为一个大于1024的非知名端口能减少90%以上的自动化扫描和爆破尝试。# 编辑 /etc/ssh/sshd_config Port 5922 # 例如改为5922注意改端口后防火墙规则也要同步修改firewall-cmd --permanent --zonestrict --add-port5922/tcp禁止root直接登录强制使用普通用户登录后再su或sudo。PermitRootLogin no使用密钥认证禁用密码这是最有效的一步。生成密钥对将公钥上传到服务器的~/.ssh/authorized_keys然后禁用密码登录。PasswordAuthentication no PubkeyAuthentication yes使用Fail2ban动态封禁Fail2ban会监控系统日志如/var/log/secure当发现同一个IP在短时间内多次认证失败就自动调用防火墙iptables或firewalld将其临时封禁。# 安装 sudo yum install fail2ban # 创建本地配置文件覆盖默认设置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑 jail.local启用并配置[sshd]段落 [sshd] enabled true port 5922 # 如果你改了SSH端口 maxretry 3 # 最大重试次数 bantime 3600 # 封禁时间秒 findtime 600 # 在10分钟内触发 # 启动并设置开机自启 sudo systemctl enable --now fail2ban5.2 用户与权限最小化遵循最小权限原则能有效限制攻击者横向移动。使用sudo替代su为普通用户分配精确的sudo权限而不是直接给root密码。编辑/etc/sudoers始终使用visudo命令# 允许用户 alice 重启web服务且无需密码 alice ALL(root) NOPASSWD: /bin/systemctl restart nginx # 允许组 devs 执行所有命令但需要密码 %devs ALL(ALL) ALL定期审计用户和权限# 检查空密码账户 sudo awk -F: ($2 ) {print $1} /etc/shadow # 检查UID为0的用户除了root是否还有其他 sudo awk -F: ($3 0) {print $1} /etc/passwd # 检查所有用户的cron任务 sudo cat /etc/passwd | cut -d: -f1 | xargs -I {} crontab -l -u {} 2/dev/null5.3 入侵检测与文件完整性监控防火墙是门卫但还需要内部的监控摄像头。安装配置AIDEAIDE会创建一个系统文件的数据库哈希值、权限等定期检查是否有文件被篡改。sudo yum install aide sudo aide --init sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 定期检查可放入cron sudo aide --check配置集中化日志将服务器的重要日志/var/log/secure,/var/log/messages, 防火墙日志应用日志实时发送到一台独立的日志服务器如ELK Stack或Graylog。这样即使服务器被攻破攻击者也无法抹除所有犯罪痕迹。6. 常见问题与排查技巧实录在实际运维中防火墙问题往往表现为“网络不通”。下面是一个系统化的排查流程和常见问题清单。6.1 网络不通的排查流程当发现服务无法访问时请按以下顺序排查可以节省大量时间服务本身是否正常# 检查服务进程 sudo systemctl status nginx # 检查服务是否监听在预期端口0.0.0.0表示监听所有IP sudo ss -tlnp | grep :80 sudo netstat -tlnp | grep :80 # 如果ss命令不可用主机本地防火墙是否允许# 查看firewalld当前生效规则 sudo firewall-cmd --list-all --zonestrict # 临时完全关闭防火墙进行测试生产环境慎用测试后立即恢复 sudo firewall-cmd --set-default-zonetrusted # 如果关闭防火墙后通了问题就在防火墙规则上。云服务商安全组/网络ACL是否允许这是新手最常踩的坑在阿里云、AWS、腾讯云等平台上除了操作系统防火墙还有一层安全组Security Group或网络ACL。你需要在那里也放行相应的端口如80, 443, SSH端口。规则是叠加生效的两边都必须允许。上游网络设备是否限制检查公司出口防火墙、路由器或ISP是否有拦截。DNS解析是否正确如果是域名访问检查nslookup或dig命令看域名是否解析到正确的IP。6.2 常见问题速查表问题现象可能原因排查命令/解决方案SSH连接超时1. 防火墙未放行SSH端口2. SSH服务未运行或监听IP错误3. 安全组未放行4. 本地网络或ISP问题systemctl status sshdss -tlnp | grep :22firewall-cmd --list-all检查云平台安全组能ping通但端口不通防火墙或安全组拦截了特定端口telnet IP PORT测试检查防火墙规则和安全组修改firewalld规则后不生效1. 未使用--permanent参数规则重启后丢失2. 未执行--reload3. 规则冲突后添加的规则优先级可能更高firewall-cmd --runtime-to-permanent将运行时规则转永久仔细检查--list-all的输出顺序服务器主动出站连接失败OUTPUT链或出口方向安全组被限制firewall-cmd --direct --get-all-rules查看直接规则检查安全组出站规则日志中出现大量DROP记录正常扫描流量或被误拦截的正常业务分析日志来源IPsudo journalctl -u firewalld --since 1 hour ago确认是否为需放行的业务IP6.3 高级调试技巧使用tcpdump抓包定位这是终极武器。当所有逻辑检查都找不出问题时直接看网络包。# 在服务器上抓取到达80端口的包 sudo tcpdump -i eth0 -nn tcp port 80 # 更精确地抓取来自特定IP的包 sudo tcpdump -i eth0 -nn src host 203.0.113.100 and tcp port 80如果能在服务器网卡上看到客户端的SYN包但服务没响应那问题很可能在本地服务或防火墙。如果连SYN包都看不到问题就在网络链路上安全组、物理防火墙等。理解规则匹配顺序在firewalld的同一个区域zone内富规则的匹配顺序基本上是按照添加的顺序但并非绝对复杂情况下建议用--list-all --zonexxx查看确认。iptables的规则顺序则至关重要它是从上到下逐条匹配的。一条错误的规则顺序可能导致后续规则失效。
Linux防火墙配置与系统安全纵深防御实战指南
发布时间:2026/6/30 19:22:59
1. 项目概述重新认识Linux系统安全每次看到“Linux防火墙配置”这个标题很多朋友的第一反应可能就是去搜几条iptables或firewalld的命令觉得配几条规则、开几个端口就算完事了。我刚开始接触运维的时候也是这么想的直到有一次线上服务器被当成肉鸡疯狂对外发包我才彻底明白真正的系统安全远不止于在门口放个保安那么简单。它更像是一个立体的、动态的防御体系而防火墙只是这个体系中最显眼、但也最容易被误解的一环。今天我们就来彻底拆解一下“Linux系统安全”这个宏大命题。它绝不是一个孤立的配置任务而是一套从底层内核加固、到网络访问控制、再到应用服务防护的完整方法论。无论是刚接触Linux的新手还是有一定基础但想构建系统化安全认知的同行这篇文章都将带你从零开始搭建一个既坚固又灵活的安全防线。我们会从最基础的原理讲起逐步深入到实战配置并分享那些只有踩过坑才知道的“潜规则”和排查技巧。收藏这一篇不是因为它能解决所有问题而是因为它能帮你建立一个正确的安全观和一套可复用的排查框架。2. 核心需求解析我们到底在防什么在动手敲任何命令之前我们必须先搞清楚防御的目标。盲目配置规则往往会导致该防的没防住不该挡的却打不开给日常运维带来无数麻烦。2.1 威胁模型分析攻击者从哪来想干嘛一个清晰的威胁模型是安全建设的起点。对于一台典型的Linux服务器我们主要面临以下几类威胁网络层攻击这是最直接的威胁。包括端口扫描与探测攻击者使用nmap等工具扫描你的服务器寻找开放的端口和运行的服务识别潜在漏洞。暴力破解针对SSH、FTP、数据库等服务的登录接口使用自动化工具尝试海量用户名密码组合。拒绝服务DoS/DDoS通过海量垃圾流量耗尽服务器的带宽、连接数或CPU资源使其无法提供正常服务。漏洞利用针对特定服务如Apache、Nginx、Redis的已知漏洞发起攻击试图获取权限或执行恶意代码。主机层攻击如果攻击者已经通过某种方式如应用漏洞在系统上执行了命令那么防御重点就转向了限制其横向移动和权限提升。权限提升Privilege Escalation攻击者利用系统配置错误、内核漏洞或SUID程序漏洞从普通用户权限提升到root权限。信息窃取读取/etc/passwd、/etc/shadow、应用配置文件、数据库连接字符串等敏感信息。持久化驻留在系统中安装后门、创建隐藏账户、设置定时任务cron或系统服务以便长期控制。应用层攻击这通常与防火墙关系不大但却是最常被攻破的入口。例如SQL注入、跨站脚本XSS、远程代码执行RCE等。防火墙虽然无法解析HTTP请求内容但可以通过限制访问来源、频率等方式为应用安全争取时间。2.2 安全配置的核心目标基于以上威胁我们的安全配置需要达成以下几个核心目标最小权限原则任何用户、进程、服务都只拥有完成其功能所必需的最小权限。比如运行Web服务的用户不应该有读写系统日志目录的权限。纵深防御不依赖单一安全措施。即使防火墙被绕过还有SELinux/AppArmor即使应用被攻破还有文件系统权限和用户隔离。多层防御使得攻击成本大大增加。减少攻击面关闭所有不必要的服务、端口和功能。一台服务器运行的服务越少潜在的漏洞就越少。监控与审计能够发现异常行为并及时告警。安全不是一劳永逸的配置而是一个持续监控和响应的过程。理解了这些我们再去看防火墙配置就会明白它主要聚焦于网络层攻击的防御是纵深防御的第一道关卡但绝非全部。3. 防火墙基石从iptables到firewalld的演进与选择提到Linux防火墙iptables是一个无法绕开的基石。即使你现在用着更友好的firewalld或ufw理解iptables的核心概念也至关重要因为它们是前者的底层引擎。3.1 iptables核心概念四维表iptables的规则并非杂乱无章而是被组织在几个内置的“表”和“链”中。你可以把它想象成一个有多层过滤网的流水线。四个核心表filter表最常用的表负责过滤数据包决定是放行ACCEPT还是拒绝DROP/REJECT。我们常说的防火墙规则大多在这里。nat表用于网络地址转换例如做SNAT让内网机器上外网或DNAT端口映射。mangle表用于修改数据包内容如修改TTL值、设置QoS标记等。一般使用较少。raw表用于配置数据包是否被连接跟踪机制处理。在不想让某些流量被状态跟踪时会用到。五个内置链以filter表为例数据包会像流水线上的零件依次经过不同的检查点链INPUT处理发往本机的数据包。比如有人访问你的SSH服务这个包就会经过INPUT链。OUTPUT处理从本机发出的数据包。FORWARD处理经过本机转发的数据包当你的Linux充当路由器时。PREROUTING(nat/mangle/raw表)数据包进入后在路由决策之前处理。POSTROUTING(nat/mangle表)数据包发出前在路由决策之后处理。一条规则的基本构成是匹配条件 执行动作target。例如“如果数据包来自192.168.1.100且目标端口是22那么就允许它。”实操心得很多新手会混淆DROP和REJECT。DROP是直接丢弃包不回应任何信息对方会一直等待直到超时。REJECT会返回一个“拒绝访问”的响应如ICMP port-unreachable。从安全角度DROP更能隐藏你的存在但可能给调试带来麻烦。对于明确的恶意IP用DROP对于可能误操作的内网IP用REJECT更友好。3.2 firewalld更符合现代需求的动态防火墙管理器iptables功能强大但规则管理繁琐直接修改规则文件是静态的更改后需要全部重载。firewalld的出现解决了这些问题动态管理规则运行时即可更新无需重启服务不会中断现有连接。区域Zone概念将网络接口绑定到不同的信任区域如public、internal、dmz每个区域有预定义的规则集。这非常贴合服务器可能有多个网卡、处于不同网络环境如外网、内网、管理网的场景。服务Service管理预定义了常见服务如ssh、http、https的端口和协议可以直接放行服务而非手动记端口。富规则Rich Rules提供更强大、更易读的规则语法支持源IP、时间、日志等复杂条件。如何选择新手/追求便捷CentOS/RHEL 7、Fedora、OpenSUSE等默认集成了firewalld直接用它上手快管理方便。深度控制/老派运维Debian/Ubuntu系传统上多用iptables或者你需要编写非常复杂的、firewalld富规则难以表达的规则时可以直接操作iptables。不过Ubuntu也推荐使用ufw底层也是iptables。生产环境建议我个人在CentOS/RHEL生产环境中首选firewalld。它的区域概念和动态特性非常适合应对网络变更。对于Debian/Ubuntuufw是极佳的选择。4. 实战构建从零配置一个生产级防火墙策略光说不练假把式。下面我们以firewalld为例一步步搭建一个兼顾安全和可用的防火墙策略。假设我们有一台新装的CentOS 8服务器需要部署Web服务HTTP/HTTPS和提供SSH管理。4.1 初始状态检查与清场首先查看防火墙状态和默认区域。sudo systemctl status firewalld # 查看服务状态 sudo firewall-cmd --state # 查看运行状态 sudo firewall-cmd --get-default-zone # 查看默认区域通常是public sudo firewall-cmd --list-all # 列出默认区域的所有规则如果系统之前有杂乱的iptables规则为了纯净起点可以谨慎操作# 临时停止firewalld并清空iptables规则会断网务必在本地控制台操作 sudo systemctl stop firewalld sudo iptables -F # 清空filter表所有链规则 sudo iptables -X # 删除用户自定义链 sudo iptables -Z # 计数器归零 sudo systemctl start firewalld4.2 策略定制白名单优于黑名单安全的核心思想是“默认拒绝按需放行”。我们先将默认区域public的策略设置为DROP然后只开放必要的端口。设置默认策略为DROP注意直接设置--set-default-zonedrop会立刻断开所有连接包括你当前的SSH所以我们需要更稳妥的方法创建一个新的严格区域再将网卡移入。# 创建一个名为‘strict’的新区域默认策略为DROP sudo firewall-cmd --permanent --new-zonestrict sudo firewall-cmd --permanent --zonestrict --set-targetDROP # 将我们需要的服务SSH先添加到这个区域否则加进去就失联了 sudo firewall-cmd --permanent --zonestrict --add-servicessh # 重载配置使新区域生效 sudo firewall-cmd --reload # 将你的公网网卡例如eth0绑定到strict区域 sudo firewall-cmd --permanent --zonestrict --change-interfaceeth0 sudo firewall-cmd --reload现在除了SSH所有其他入站流量都被丢弃了。放行Web服务sudo firewall-cmd --permanent --zonestrict --add-servicehttp sudo firewall-cmd --permanent --zonestrict --add-servicehttps sudo firewall-cmd --reload放行特定源IP的SSH强烈推荐如果管理服务器的IP是固定的例如公司出口IP203.0.113.100将其设为白名单能极大减少暴力破解。sudo firewall-cmd --permanent --zonestrict --add-rich-rulerule familyipv4 source address203.0.113.100 service namessh accept # 同时移除之前对所有人开放的SSH规则避免规则冲突或冗余 sudo firewall-cmd --permanent --zonestrict --remove-servicessh sudo firewall-cmd --reload现在只有来自203.0.113.100的IP可以SSH其他IP连22端口都无法连接。配置内部/管理区域如果服务器有第二块网卡如eth1IP段10.0.0.0/24用于内网管理或内部服务通信我们可以将其放入更宽松的internal区域。sudo firewall-cmd --permanent --zoneinternal --change-interfaceeth1 sudo firewall-cmd --permanent --zoneinternal --add-servicessh # 内网可以SSH sudo firewall-cmd --permanent --zoneinternal --add-servicemysql # 例如内网可以访问数据库 sudo firewall-cmd --reload4.3 高级防护规则配置基础的端口开关只是第一步下面这些规则能让你的防火墙更智能。限制连接速率防暴力破解即使SSH端口暴露也可以通过限制单IP的连接频率来增加破解难度。# 使用富规则限制每分钟同一源IP最多新建3个SSH连接超过则拒绝 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 service namessh limit value3/m accept sudo firewall-cmd --reload记录并拒绝异常扫描对于尝试连接我们未开放端口的行为直接拒绝并记录日志便于后续分析。# 在strict区域的末尾添加一条默认日志规则注意顺序这条应放在最后 # 先添加一条拒绝所有并记录的规则谨慎会记录大量日志 # sudo firewall-cmd --permanent --zonestrict --add-rich-rulerule familyipv4 log prefixFIREWALL_DROP: levelinfo limit value1/m drop # 更佳实践只对尝试连接某些高危空端口的行为记录日志 # 例如记录尝试连接常见未开端口如21/ftp, 23/telnet, 445/smb的请求 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 port port21 protocoltcp log prefixFTP_SCAN: levelwarning drop sudo firewall-cmd --reload日志可以在/var/log/messages或journalctl -u firewalld中查看。IPset管理大批量IP如果你需要封禁一个很长的IP地址列表例如已知的攻击源一条条写富规则很低效。firewalld支持ipset。# 创建一个名为“blocklist”的ipset存储IPv4地址 sudo firewall-cmd --permanent --new-ipsetblocklist --typehash:ip --optionfamilyinet # 向ipset中添加IP支持CIDR格式 sudo firewall-cmd --permanent --ipsetblocklist --add-entry192.168.2.0/24 sudo firewall-cmd --permanent --ipsetblocklist --add-entry10.1.1.100 # 使用富规则引用这个ipset拒绝其所有流量 sudo firewall-cmd --permanent --zonestrict --add-rich-rule rule familyipv4 source ipsetblocklist drop sudo firewall-cmd --reload # 查看ipset内容 sudo firewall-cmd --info-ipsetblocklist5. 超越防火墙构建系统级纵深防御体系配置好防火墙我们只完成了安全建设的一半。真正的坚固堡垒需要多层防御。下面介绍几个必须配置的系统级安全措施。5.1 SSH服务加固关掉大门上的破窗SSH是服务器最重要的入口必须重点加固。修改默认端口将端口从22改为一个大于1024的非知名端口能减少90%以上的自动化扫描和爆破尝试。# 编辑 /etc/ssh/sshd_config Port 5922 # 例如改为5922注意改端口后防火墙规则也要同步修改firewall-cmd --permanent --zonestrict --add-port5922/tcp禁止root直接登录强制使用普通用户登录后再su或sudo。PermitRootLogin no使用密钥认证禁用密码这是最有效的一步。生成密钥对将公钥上传到服务器的~/.ssh/authorized_keys然后禁用密码登录。PasswordAuthentication no PubkeyAuthentication yes使用Fail2ban动态封禁Fail2ban会监控系统日志如/var/log/secure当发现同一个IP在短时间内多次认证失败就自动调用防火墙iptables或firewalld将其临时封禁。# 安装 sudo yum install fail2ban # 创建本地配置文件覆盖默认设置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑 jail.local启用并配置[sshd]段落 [sshd] enabled true port 5922 # 如果你改了SSH端口 maxretry 3 # 最大重试次数 bantime 3600 # 封禁时间秒 findtime 600 # 在10分钟内触发 # 启动并设置开机自启 sudo systemctl enable --now fail2ban5.2 用户与权限最小化遵循最小权限原则能有效限制攻击者横向移动。使用sudo替代su为普通用户分配精确的sudo权限而不是直接给root密码。编辑/etc/sudoers始终使用visudo命令# 允许用户 alice 重启web服务且无需密码 alice ALL(root) NOPASSWD: /bin/systemctl restart nginx # 允许组 devs 执行所有命令但需要密码 %devs ALL(ALL) ALL定期审计用户和权限# 检查空密码账户 sudo awk -F: ($2 ) {print $1} /etc/shadow # 检查UID为0的用户除了root是否还有其他 sudo awk -F: ($3 0) {print $1} /etc/passwd # 检查所有用户的cron任务 sudo cat /etc/passwd | cut -d: -f1 | xargs -I {} crontab -l -u {} 2/dev/null5.3 入侵检测与文件完整性监控防火墙是门卫但还需要内部的监控摄像头。安装配置AIDEAIDE会创建一个系统文件的数据库哈希值、权限等定期检查是否有文件被篡改。sudo yum install aide sudo aide --init sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 定期检查可放入cron sudo aide --check配置集中化日志将服务器的重要日志/var/log/secure,/var/log/messages, 防火墙日志应用日志实时发送到一台独立的日志服务器如ELK Stack或Graylog。这样即使服务器被攻破攻击者也无法抹除所有犯罪痕迹。6. 常见问题与排查技巧实录在实际运维中防火墙问题往往表现为“网络不通”。下面是一个系统化的排查流程和常见问题清单。6.1 网络不通的排查流程当发现服务无法访问时请按以下顺序排查可以节省大量时间服务本身是否正常# 检查服务进程 sudo systemctl status nginx # 检查服务是否监听在预期端口0.0.0.0表示监听所有IP sudo ss -tlnp | grep :80 sudo netstat -tlnp | grep :80 # 如果ss命令不可用主机本地防火墙是否允许# 查看firewalld当前生效规则 sudo firewall-cmd --list-all --zonestrict # 临时完全关闭防火墙进行测试生产环境慎用测试后立即恢复 sudo firewall-cmd --set-default-zonetrusted # 如果关闭防火墙后通了问题就在防火墙规则上。云服务商安全组/网络ACL是否允许这是新手最常踩的坑在阿里云、AWS、腾讯云等平台上除了操作系统防火墙还有一层安全组Security Group或网络ACL。你需要在那里也放行相应的端口如80, 443, SSH端口。规则是叠加生效的两边都必须允许。上游网络设备是否限制检查公司出口防火墙、路由器或ISP是否有拦截。DNS解析是否正确如果是域名访问检查nslookup或dig命令看域名是否解析到正确的IP。6.2 常见问题速查表问题现象可能原因排查命令/解决方案SSH连接超时1. 防火墙未放行SSH端口2. SSH服务未运行或监听IP错误3. 安全组未放行4. 本地网络或ISP问题systemctl status sshdss -tlnp | grep :22firewall-cmd --list-all检查云平台安全组能ping通但端口不通防火墙或安全组拦截了特定端口telnet IP PORT测试检查防火墙规则和安全组修改firewalld规则后不生效1. 未使用--permanent参数规则重启后丢失2. 未执行--reload3. 规则冲突后添加的规则优先级可能更高firewall-cmd --runtime-to-permanent将运行时规则转永久仔细检查--list-all的输出顺序服务器主动出站连接失败OUTPUT链或出口方向安全组被限制firewall-cmd --direct --get-all-rules查看直接规则检查安全组出站规则日志中出现大量DROP记录正常扫描流量或被误拦截的正常业务分析日志来源IPsudo journalctl -u firewalld --since 1 hour ago确认是否为需放行的业务IP6.3 高级调试技巧使用tcpdump抓包定位这是终极武器。当所有逻辑检查都找不出问题时直接看网络包。# 在服务器上抓取到达80端口的包 sudo tcpdump -i eth0 -nn tcp port 80 # 更精确地抓取来自特定IP的包 sudo tcpdump -i eth0 -nn src host 203.0.113.100 and tcp port 80如果能在服务器网卡上看到客户端的SYN包但服务没响应那问题很可能在本地服务或防火墙。如果连SYN包都看不到问题就在网络链路上安全组、物理防火墙等。理解规则匹配顺序在firewalld的同一个区域zone内富规则的匹配顺序基本上是按照添加的顺序但并非绝对复杂情况下建议用--list-all --zonexxx查看确认。iptables的规则顺序则至关重要它是从上到下逐条匹配的。一条错误的规则顺序可能导致后续规则失效。