Debian系统ufw防火墙生产配置
生产环境里的 Debian 服务器如果没配好防火墙,相当于把家门敞开在公网上。
本文要解决的就是这个问题:如何用 ufw 这套工具,在不影响业务的前提下只开放必要端口,把风险面压到最小。
配置完成后,你能清楚看到哪些端口在监听、哪些端口对外关闭,也能应对常见的规则冲突和误封问题。
下面直接按实际运维流程来走。
动手前先确认环境
开始操作前,确认下面几项,避免配置到一半发现自己环境不对:
- 系统是 Debian 10/11/12 或基于 Debian 的发行版,用
cat /etc/debian_version查看。 - 当前登录用户有 root 权限,或者能通过
sudo -i切换到 root。 - 知道服务器上跑的业务需要哪些端口,例如 SSH 通常是 22,Nginx 是 80/443,MySQL 如果不对外可以不开。
- 如果服务器在云平台(比如阿里云、腾讯云、泽御云等),先登录云控制台确认安全组规则,避免云安全组和系统内防火墙互相拦截。
这里特别提醒:千万不要在没保留远程连接通道的情况下执行防火墙默认拒绝规则,否则你可能把自己锁在服务器外面。
建议先放行 SSH 端口再操作。
安装并启用 ufw,先定默认拒绝策略
Debian 系统不一定预装 ufw,先安装:
apt update && apt install -y ufw
安装后先设置默认策略:入站默认拒绝,出站默认允许。
这是生产配置的核心思路:只放行明确允许的端口,其余一律丢弃。
ufw default deny incoming
ufw default allow outgoing
注意顺序:一定先放行 SSH,再启用 ufw。
如果 SSH 端口不是默认 22,改成你自己的端口:
ufw allow 22/tcp comment 'SSH'
然后启用防火墙:
ufw enable
启用过程会提示可能中断现有连接,输入 y 确认。
启用后立刻检查 SSH 是否还能通,如果卡住,等几秒没反应,就用云控制台的 VNC 或救援模式回滚。
按业务清单只开放必要端口
生产环境里“必要端口”是指业务真正需要对外提供服务的端口,不是所有服务端口。
先看看哪些端口在监听:
ss -tlnp
输出里 Local Address:Port 列就是当前监听端口。
根据业务类型,放行规则参考如下:
| 业务 | 端口 | 命令 |
| --- | --- | --- |
| SSH | 22(或自定义) | ufw allow 22/tcp |
| HTTP | 80 | ufw allow 80/tcp |
| HTTPS | 443 | ufw allow 443/tcp |
| DNS 对外 | 53 | ufw allow 53 |
| 邮件发送 | 25 | ufw allow 25/tcp |
如果数据库(如 MySQL 3306)只需要本机或内网访问,不要向公网放行,直接用下面命令删除默认规则:
ufw delete allow 3306/tcp
需要限制来源 IP 时,用来源地址限定:
ufw allow from 192.168.1.0/24 to any port 3306 proto tcp
这条只允许内网网段访问 3306,公网 IP 会被拒绝,比单纯开放更安全。
常见误配置和避坑点
生产环境最容易踩的坑集中在下面几处:
- 先启用再放行 SSH:这会导致当前连接立刻断开。正确顺序是先
ufw allow 22/tcp,再ufw enable。 - 端口协议写错:只写
ufw allow 80会同时放行 tcp 和 udp,但某些服务只需要 tcp。建议明确80/tcp或80/udp,减少不必要的暴露。 - 放行规则重复叠加:多次执行同一放行命令会生成多条规则,查看时用
ufw status numbered检查,同名规则可以删除多余项。 - 修改端口后忘记更新规则:如果改了 SSH 端口,旧 22 规则还在放行,新端口没放行,等于白改。改端口前先加入新规则再删除旧规则。
- 云安全组和 ufw 冲突:云控制台安全组和系统 ufw 是两层过滤,任何一层拒绝都会断连。排查时先分别查看两层规则,再测试连通性。
验证规则是否生效,并保持长期可维护
配置完成后要验证,不能只看规则列表。
查看当前规则:
ufw status verbose
能看到每一条规则、默认策略和状态。
如果端口不对,用 ufw delete 删除指定规则。
测试端口连通性,可以在本机用 curl 检测 HTTP:
curl -I http://127.0.0.1
外网测试可以用另一台机器的 nc 或在线端口扫描工具(注意只扫自家服务器,别碰别人的)。
更细的验证:检查防火墙日志,确认有没有异常丢弃:
journalctl -u ufw --since today | grep "BLOCK"
如果发现有效业务被拦截,用 ufw allow 补规则,或者检查规则顺序。
需要永久生效的话,ufw 默认规则会写入系统配置,重启后仍然保留。
最后建议把规则做成脚本或文档放进服务器配置目录,例如 /etc/ufw/applications.d/,后续变更能追溯。
这样即使哪天换人维护,也不会因为不知道放行了哪些端口而酿成事故。
如果你正在处理 Debian 系统的 ufw 防火墙生产配置,只开放必要端口这一需求,建议先按本文顺序走完,再根据实际业务调整端口。
遇到连不上、规则不生效、端口被墙这类问题,优先回看避坑部分,并对照云平台安全组一起排查。
维护好端口清单,就是维护好服务器的第一道门。