资讯动态

Ubuntu防火墙与安全加固:从iptables到UFW的实战指南

发布时间:2026/10/13 4:11:21 来源:尧图企业网站定制
如果你手里有一台 Ubuntu 机器不管是云主机还是家里那台吃灰的旧电脑防火墙和杀毒软件大概率是你最不想碰的东西。我当年也是这么想的总觉得 Linux 嘛默认就挺安全直到有一次测试服务器被扫描器盯上日志里一夜之间全是 SSH 登录失败的记录我才意识到“裸奔”这件事有多被动。这篇文章就围绕 Ubuntu 下的防火墙netfilter、iptables、UFW和杀毒软件展开从内核的数据包处理机制讲到 UFW 的日常操作再到 ClamAV、rkhunter、fail2ban 这套外围“保安”最后把我踩过的坑一起丢给你。内容不追求面面俱到但求你看完能直接动手给自己的机器装一道像样的门禁。1. 为什么每个 Ubuntu 用户都该正视防火墙与安全基线1.1 “默认开放”不是懒是风险很多刚接触 Ubuntu 的人会有一种错觉装完系统什么都没配置是不是就代表“没有防火墙”实际上 Ubuntu 默认安装了 UFW 这个前端工具只是默认状态是 inactive等于所有对外监听端口都直接暴露在网络上。换句话说只要系统里有服务在监听比如 SSH、Nginx、MySQL它就相当于把门敞开着等别人来敲。我见过不少新手把 MySQL 装好后发现远程连不上一顿排查最后发现是防火墙把 3306 挡住了于是干脆ufw disable一了百了。这个操作确实解决了问题但也把最基础的边界防护一起拆了。防火墙不是用来给生活添堵的它是在告诉你哪些门可以开哪些门必须关哪些人进来需要盘问。把“禁用防火墙”当成解决问题的万能药迟早会在日志里看到不想看的东西。比较合理的心态是先搞清楚这台机器到底要对外提供什么服务然后只放行这些服务的端口其余默认拒绝。这就是安全里常说的“最小暴露面”。你不需要成为一个安全专家只需要养成一个习惯装完系统第一件事不是急着装开发环境而是先把网络进出策略摆清楚。1.2 Ubuntu 安全组件全景图经常有人把防火墙和杀毒混在一起说其实它们是不同层面的东西。我们可以把一个 Ubuntu 系统的安全体系拆成四层每一层负责不同的事内核层netfilter 是 Linux 内核里的数据包处理框架所有网络数据包流过时都会经过它注册的钩子点。iptables 只是用户态的操作工具真正干活的其实是 netfilter。规则层iptables 是传统的命令行工具规则灵活但复杂。UFW 是 iptables 的前端封装语法更接近自然语言适合日常管理和服务器初配。行为层fail2ban 这类工具不直接封端口而是通过分析服务日志发现暴力破解行为后临时调用 iptables/UFW 封禁来源 IP。文件层ClamAV、rkhunter 这类杀毒和 rootkit 检测工具负责扫描文件系统里的恶意文件以及检查系统有没有被植入后门。这四层不是非此即彼的关系而是各管一段。防火墙管“网络边界”杀毒管“文件内容”fail2ban 管“行为识别”。只装其中一个就好比只装了门锁却不装猫眼或者装了猫眼却不锁门总有照顾不到的地方。2. 从 netfilter 到 iptablesLinux 防火墙的骨架2.1 netfilter 钩子点与数据包流向Firewall 这个词听起来很高大上但在 Linux 里它最终要落到 netfilter 框架上。netfilter 在内核协议栈里预设了多个钩子点任何数据包经过这些位置时都会停下来让注册的规则“过目”一遍决定是放行、丢弃、拒绝还是做其他处理。五个关键钩子点分别是钩子点时机典型用途PREROUTING数据包刚进入网络层还没做路由判断DNAT 目标地址转换、端口转发INPUT数据包目的地址是本机拦截入站流量本机防火墙的核心位置FORWARD数据包目的地址不是本机需要转发路由器、容器场景下的流量转发控制OUTPUT本机自己发出的数据包控制出站流量POSTROUTING数据包即将离开本机SNAT 源地址转换、MASQUERADE 伪装理解这几个钩子点的顺序比记命令还重要。比如你想限制外部访问本机的 SSH这条规则挂在 INPUT 链上你想把外部访问某个端口的流量转发给内网另一台机器就需要在 PREROUTING 做 DNAT再靠 FORWARD 来放行转发流量。很多人配置完端口转发发现不通往往就是只做了 PREROUTING 的 DNAT却忘了处理 FORWARD 链。2.2 iptables 的表、链与匹配顺序iptables 之所以让人觉得难不是因为命令多而是因为“表”和“链”这两个概念容易绕晕。简单说链是数据包的检查清单表是这张清单的分类标签。netfilter 框架里一共有 raw、mangle、nat、filter、security 五张表日常使用最频繁的是 nat 和 filterfilter 表负责放行、拒绝、丢弃是防火墙的本职工作所在。nat 表负责地址转换端口转发、共享上网都靠它。mangle 表修改数据包的 TOS、TTL 等标记字段属于比较进阶的玩法。raw 表用来跳过连接跟踪只在性能调优时用到。规则在链里是按顺序匹配的一旦某条规则的匹配条件成立并执行了动作比如 DROP后面的规则就不会再看了。这个“顺序敏感”特性是很多配置事故的根源。举个典型的例子如果链前面有一条iptables -A INPUT -j DROP那不管后面写了多少条 allow 规则流量都会被丢弃因为数据包在第一条就被 DROP 了。所以实际配置时放行规则通常要放在拒绝规则的前面或者用-I插入到最前面而不是-A追加到最后面。2.3 iptables 常用命令速查虽然 UFW 足够好用但了解一些 iptables 基础命令可以在排查问题时直接看底层规则不至于两眼一抹黑。以下是我在调试服务器时使用频率最高的几条# 查看 filter 表的全部规则带行号方便后续删除 sudo iptables -L -n --line-numbers # 查看 nat 表规则 sudo iptables -t nat -L -n --line-numbers # 禁止来自某个 IP 访问本机 22 端口 sudo iptables -A INPUT -s 192.0.2.10 -p tcp --dport 22 -j DROP # 删除刚才添加的规则按行号删最稳 sudo iptables -D INPUT 1这里提醒一句命令行直接执行的 iptables 规则是临时的重启后就会清空。以前我图方便直接敲 iptables 命令配置重启服务器后规则全没了还以为是系统出问题了。后来才养成了习惯要么把关键规则写成脚本并设置开机执行要么老老实实用iptables-save保存规则文件再配置对应的服务让它开机时恢复。3. UFW让 iptables 规则变得可读可维护3.1 UFW 与 iptables 的关系我刚工作那会儿配置防火墙都是直接上 iptables 命令规则一多自己看着都费劲。后来发现 Ubuntu 自带了 UFW才意识到“好工具是把复杂藏起来”这句话的含义。UFW 不改变底层机制它读入你的高层配置自动翻译成 iptables 规则并交给内核执行。它的优势是语法贴近日常表达比如“允许 SSH”“拒绝来自某 IP 的所有流量”看一眼就能懂。但 UFW 并不是 iptables 的完全替代品。对于那些需要对 nat 表、mangle 表做精细操作的高级场景UFW 默认的接口确实不够灵活。我们的处理方式通常是分层的日常端口管理走 UFW特殊需求比如自定义 FORWARD 链策略、细粒度的 NAT 规则直接编辑 UFW 提供的 before.rules 和 after.rules 文件。这两个文件分别在 UFW 核心规则之前和之后加载写在这里的 iptables 原生规则可以享受 UFW 的统一管理。3.2 UFW 的核心命令与配置套路UFW 的命令不多但要把它用明白关键在理解“状态”和“默认策略”。新手最常见的困惑是我明明ufw allow 80了为什么还是访问不了这时候建议先看下系统当前的 UFW 状态sudo ufw status verbose如果输出显示 “Status: inactive”那说明规则虽然写了但防火墙整体还没有启用。UFW 有一个容易踩坑的设计启用防火墙是单独的一步不是写完规则就自动生效。正确做法是先把必要的放行规则写好最后再执行sudo ufw enable而且要保证这条命令执行后你的 SSH 连接不会瞬间断开。以下是我个人比较推荐的服务器初始配置套路在刚装完 Ubuntu 的机器上可以直接照抄# 1. 先设置默认策略入站拒绝出站允许 sudo ufw default deny incoming sudo ufw default allow outgoing # 2. 放行 SSH这一步务必在 enable 之前做 sudo ufw allow OpenSSH # 3. 按需放行业务端口 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 4. 对 SSH 启用连接频率限制降低爆破风险 sudo ufw limit ssh # 5. 最后才启用防火墙 sudo ufw enable这套配置的逻辑是先关上门再开需要的窗。默认拒绝入站意味着所有外部主动发起的连接都会被丢弃但如果本机主动访问外部网站出站默认允许不受影响。ufw limit ssh的底层实现是对同 IP 的 SSH 新连接做速率限制超过阈值就拒绝对暴力破解有很明显的抑制效果。3.3 应用配置文件的妙用UFW 还有一个容易被忽略的功能应用配置清单。它把常见的协议和端口组合做成了“应用模板”你不需要记住 SSH 用 22、HTTP 用 80 这种映射直接按应用名放行就行。# 查看系统已知的应用配置 sudo ufw app list # 查看某个应用的具体规则 sudo ufw app info OpenSSH这些应用配置文件的真实位置在/etc/ufw/applications.d/目录下以.ini格式存储。我比较推荐的做法是自己写一个小的应用配置文件把公司内部服务或自定义端口的组合统一管理起来。比如给某个内部管理系统定义专属服务名后续只需要ufw allow 内部服务名称就能放行不用每次记端口号也不容易出错。[内部管理系统] title内部管理后台 description仅限内网访问的 web 管理界面 ports8080/tcp4. 实操在 Ubuntu 上用 UFW 搭建一套够用的安全策略4.1 我建议的安全基线每个人对“安全”的预期不一样但我给大多数普通服务器定了一个最低安全基线满足这个基线就能挡住绝大多数扫描器和脚本小子的骚扰。这套基线只做四件事默认拒绝入站、只开放必要端口、限制 SSH 来源或频率、保留足够的日志。对于云服务器我还会再加一条“修改 SSH 端口”之外的建议不要只依赖端口的隐蔽性更应该用 fail2ban 或云安全组做更严格的来源限制。把 SSH 端口改成 2222 确实能减少大量扫描噪音但它只是把门挪了个位置并没有给门上锁真正有效的是“限流”和“来源白名单”。如果你在公司或家里有固定出口 IP可以直接在安全组或 UFW 里设置只允许那个 IP 访问 SSH。对不同场景我习惯做不同取舍个人开发机重点是保护好 SSH其他服务可以按需放行但要记得把日志打开。公网业务服务器必须提供 Web 服务的机器默认拒绝全部入站只放行 80/443然后单独放行管理和运维端口。内网服务器如果完全在内网环境仍然建议维持默认拒绝入站因为内网同样可能存在横向渗透风险。4.2 一步步配置示例假设你有一台公网 Ubuntu 服务器计划部署一个网站同时需要通过 SSH 远程管理。完整的安全初始化流程大概是这样的# 更新软件包这是很多安全漏洞修复的第一步 sudo apt update sudo apt upgrade -y # 安装 UFW一般 Ubuntu 自带未安装时可以执行 sudo apt install ufw -y # 设置默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 放行 SSH并加 limit 限制爆破 sudo ufw allow OpenSSH sudo ufw limit ssh # 放行 Web 服务 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 启用防火墙 sudo ufw enable # 查看核对最终状态 sudo ufw status verbose执行完sudo ufw enable后建议等两三秒观察当前 SSH 会话是否仍然活跃。如果 SSH 没有断开并且status verbose里能看到 “Status: active” 以及你允许的端口规则这一步就算完成了。我自己的经验是在配置公网服务器时会先把当前 ssh 会话保持住再开一个新的终端窗口去测试连接确认新连接也能正常登录后才算收工。这叫“别把自己关在门外”原则。一旦发现 SSH 连不上如果提前开着会话还能趁旧连接没断开前补救否则就只能靠云控制台的 VNC 或机房管理口进去了。4.3 与 Docker 共存时的 FORWARD 陷阱如果你在宿主机上装了 Docker会发现一件奇怪的事明明 UFW 默认拒绝入站但 Docker 映射出来的端口依然能对外提供服务。这不是 UFW 失效而是 Docker 启动时会直接往 iptables 的 FORWARD 链里插入自己的规则链而 UFW 的默认策略通常只作用于 INPUT 链管不到 FORWARD 链。由于 Docker 的端口映射本质是通过 DNAT 加 FORWARD 完成的流量走到 FORWARD 链时Docker 自己插入的链会放行它于是客户端的请求就绕过 UFW 的“默认拒绝入站”策略直接打到容器里。这个行为在大多数场景下是方便的你不需要手动允许容器端口因为 Docker 已经帮你做了但从安全角度看它确实让 UFW 的边界控制打了折扣。我目前的处理方式是这样的如果宿主机是一个多容器运行环境我会把 Docker 服务和 UFW 看作一个整体来配置利用 Docker 官方预留的 DOCKER-USER 自定义链来做入站限制。比如只允许某个来源 IP 访问容器映射出的端口# 在 DOCKER-USER 链里先拒绝所有来自非指定 IP 的访问 sudo iptables -I DOCKER-USER -s 192.0.2.0/24 -j ACCEPT sudo iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP这套配置需要你对 iptables 有一定的理解如果是生产环境建议先在测试机上验证。网上的很多“一键脚本”会在安装 Docker 时擅自关闭系统的 iptables 服务这种方案短期内能解决网络问题但长期看会削弱整体的安全可见性我并不推荐。4.4 日志、审计与自动化规则配置完了不代表就一劳永逸了。防火墙是动态对抗的工具你需要看日志才能知道哪些规则真的在起作用哪些流量被错误地丢弃了。UFW 启用后默认会向syslog写入日志Ubuntu 通常把它输出到/var/log/ufw.log。# 实时查看被拦截的流量 sudo tail -f /var/log/ufw.log我在排查问题时习惯先看日志再看看当前规则顺序很重要。有一次网站的某个功能突然无法访问我第一反应是 Nginx 配置有问题折腾半天最后查 UFW 日志才发现是新的出站端口没放行被默认策略挡住了。从那以后我排查网络问题都会先看防火墙日志再查应用日志顺序反了容易浪费时间。规则清单的审计也不难sudo ufw status numbered会把当前规则按序号列出来方便你核对每条规则是否还在预期位置。我会定期检查规则清单删除那些已经不再使用的临时放行条目。一个简单的检查习惯是每次发布新服务时先记录当时的规则状态等服务下线后再对照记录清理规则。5. 杀毒软件Ubuntu 上到底装不装5.1 Linux 杀毒的现实需求很多人一听到“Linux 杀毒软件”就觉得是多余操作毕竟 Linux 生态下的病毒似乎没有那么猖獗。这个判断有一定道理但忽略了另一个场景你的 Ubuntu 机器很可能不是最终的威胁目标而是整个链路里的一个“传输节点”。比如你跑了一个网盘服务、邮件网关或者经常帮同事转发文件恶意文件可能是经由你的机器被传递的而不是直接攻击你的机器。还有一个更隐蔽的风险是 rootkit。这类恶意程序往往不直接破坏系统而是通过修改系统库、替换系统命令来隐藏自己的进程和文件。如果你有过被植入挖矿程序的经历就会明白那有多烦人CPU 占用莫名飙升系统卡顿日志被清理得干干净净。杀毒软件和 rootkit 检测工具至少能在事后帮你定位异常不至于连证据都找不到。所以我的态度是个人桌面可以不装但如果你的 Ubuntu 机器面向公网提供服务、承担文件共享角色或者运行着需要长期稳定的业务装一个 ClamAV 做定期扫描再配一个 rkhunter 做木马检查成本很低收益是实实在在的。5.2 ClamAV 安装与使用ClamAV 是 Linux 生态里最常用的开源杀毒引擎免费病毒库更新也相对及时。Ubuntu 下安装很简单sudo apt update sudo apt install clamav clamav-daemon -y装完第一件事是手动更新病毒库因为安装时自带的病毒库往往比较旧sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam更新完成后可以对某个目录做全量扫描。我一般把系统备份目录和用户上传目录作为重点扫描对象# 递归扫描 /home 目录打印被发现的可疑文件 clamscan -r /home --bell -l /var/log/clamav-scan.log如果扫描文件很多建议加--exclude-dir排除/proc、/sys、/dev这类虚拟文件系统不然扫描时间会暴涨还可能产生一些无意义的警告。第一次全盘扫描会比较慢我一般在夜深人静时用 cron 定时任务来跑把扫描结果写到日志里第二天早上看一眼就好。我踩过的坑是ClamAV 会把一些“自己人”写的脚本或商业软件的安装包误报为风险文件。遇到这种情况不要慌先看日志里标记的文件路径确认是什么东西再决定是否加入白名单。千万不要看到报警就顺手删文件有时候误删一个商业软件的授权组件比中一次毒还头疼。5.3 rkhunter 查 rootkitrkhunter 是另一个我推荐的安全工具它的定位不是杀毒而是检测系统是否被植入了 rootkit 或后门。它会检查系统关键文件的哈希是否和原始版本一致查找隐藏文件、异常的网络监听端口以及一些常见 rootkit 的指纹特征。sudo apt install rkhunter -y # 首次运行前先同步系统基线 sudo rkhunter --propupd # 执行一次全面检查 sudo rkhunter --check --skip-keypress执行完检查后重点看输出里的 “Warning” 和 “Rootkit” 部分。如果发现有 rootkit 相关告警先确认是否真的被入侵还是工具误报。系统升级、内核更新后rkhunter 的基线会过期于是它会报出一堆“文件被更改”的警告这时候如果你确认系统是自己升级的心态就能稳一点只需在系统确认干净后重新执行rkhunter --propupd更新基线就行。我个人的使用习惯是每周跑一次 rkhunter用 cron 定时任务设置成每周日凌晨跑结果自动发到邮箱。rootkit 检测的价值在于“发现”早发现一天损失小一半。5.4 fail2ban比杀毒更实用的“门禁”最后再提一个不算是杀毒软件、但比杀毒更实用的工具fail2ban。它是行为层的防护原理很简单读取 SSH、Apache、Nginx 等服务的日志统计某个来源 IP 的失败尝试次数超过阈值就调用 UFW 或 iptables 临时封禁该 IP 一段时间。它解决的是“一台公网服务器每天被脚本暴力登录几十万次”的痛点。sudo apt install fail2ban -y装完后默认配置就能保护 SSH只要你用的是默认的/etc/ssh/sshd_config配置。不过我更推荐做一些自定义比如修改封禁时间和最大尝试次数# /etc/fail2ban/jail.local [sshd] enabled true maxretry 5 bantime 3600 findtime 600这段配置的含义是10 分钟内同一个 IP 有 5 次 SSH 认证失败就封禁 1 小时。参数设置要结合你的使用习惯太敏感容易把自己封出去太宽松又起不到作用。我曾见过有人把maxretry设成 2结果自己输错一次密码后连续被封了几小时那体验确实酸爽。一般来说5 次、封 1 小时是比较均衡的选择。6. 常见问题与排查技巧实录6.1 ufw enable 后 SSH 连不上这是新手最常遇到的故障本质原因是在启用防火墙之前没有先放行 SSH。你执行了sudo ufw enable系统把所有外部入站连接全部丢弃当前 SSH 会话虽然还没断开但一旦重新连接就再也进不去了。如果你遇到这种情况而且旧会话已经断开唯一的自救手段就是通过云服务商控制台的 VNC 或机房管理口进入系统执行sudo ufw allow OpenSSH。如果你用的是本地虚拟机还可以通过宿主机上的管理控制台操作。如果是在物理机上操作的那就只能找现场了。所以我把这条当成铁律任何机器上执行ufw enable之前必须先确认自己和目标机器的远程通道是畅通的至少先写一条ufw allow规则再启用。规则顺序甚至可以反过来先ufw enable再立刻ufw allow因为启用后的默认策略是 deny incoming但你不一定会马上断线只要在旧连接存活期内补上规则还是有补救机会的。6.2 规则顺序导致放行失效iptables 规则是顺序匹配的这条我已经在前面强调过。实际配置时最常见的翻车场景是你为了“安全”先添加了一条拒绝所有入站的规则然后又在后面添加了一条放行 80 端口的规则结果 80 端口始终无法访问。原因很简单数据包在第一条就被拒绝掉了后面的规则根本没机会执行。这种情况在直接操作 iptables 时尤其容易发生因为-A是把规则追加到链尾而比较“严”的宽泛规则往往被放在前面。我的排查方法很简单先看iptables -L -n --line-numbers的规则清单按照从上到下的顺序读一遍把每条规则读成一句自然语言这样就很容易发现“前后矛盾”的地方。UFW 层面虽然已经帮你处理了很多顺序问题但如果你在 before.rules 里自行插入规则同样要小心顺序。6.3 杀毒误报与白名单管理ClamAV 和 rkhunter 都有误报问题但误报的来源不同。ClamAV 的误报主要集中在商业软件安装包、加壳程序、某些破解工具上它看到的是“行为和已知恶意样本类似”而不代表这个文件真的有害。rkhunter 的误报则主要来自系统升级内核更新后关键文件哈希变化它就会报“文件被修改”。处理误报的第一原则是先确认文件来源再决定是否信任。比如你的网站上传目录里出现一个可疑的 PHP 文件ClamAV 标记它这时候应该优先怀疑是不是被拿下后门了而不是急着加白名单。如果是你自己写的脚本被 ClamAV 标记可以先通过clamscan --remove之外的隔离方式确认确实安全后再把文件路径加入/etc/clamav/whitelist或者用rkhunter --propupd更新基线。6.4 日志刷爆与基础防护联动公网服务器还有一个常见烦恼攻击者反复扫描导致/var/log/auth.log和/var/log/ufw.log快速增长磁盘空间被日志塞满。这时候单靠防火墙还不够需要几个手段联动把 SSH 端口从默认的 22 改成一个高位端口能明显降低扫描噪音但这只是隐蔽手段不能替代防护。确保ufw limit ssh或 fail2ban 已经生效从源头上拦截高频 SSH 尝试。配置 logrotate让日志自动按大小或时间轮转避免磁盘被撑爆。日志管理的处理方式也分场景你可以在/etc/logrotate.d/里为关键日志文件设置轮转频率和保留数量。实操中我还会额外关注 UFW 日志里被拦截的来源 IP 分布如果可以观察到某些 IP 段频繁出现说明这些扫描是定向的这时候建议直接在 UFW 规则里把该 IP 段整体封禁减少无效日志写入。我个人的体会是防火墙和杀毒软件这类安全工具真正起作用的关键不在于装了多少而在于你是否理解和维护它们。规则不是配完就消失的东西它需要定期查看、持续调整还要配合日志才能判断当前的安全状态。公网机器上我的习惯一直是“先加规则、再发流量”宁可一开始保守一点把所有外部入站先挡住再根据业务需要一条条放行杀毒软件也一样装上不代表结束定时扫描和故障响应才是它发挥作用的前提。这套组合下来不敢说能让你的 Ubuntu 固若金汤但至少面对绝大多数自动化攻击和误操作能让你从“慌慌张张地救火”变成“按部就班地处理”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑