在Debian系统上,使用UFW(Uncomplicated Firewall)实现"默认拒绝所有入站流量、只开放特定服务端口"是最基础也最关键的安全加固手段。具体做法就是三步:先启用UFW,再设置默认策略为拒绝入站和允许出站,最后按需开放你真正需要的端口比如SSH的22、HTTP的80、HTTPS的443。这套操作下来,你的服务器就像装了一扇只有你知道密码的门,其他所有敲门的都会被挡在外面。

很多人装完Debian就直接把服务跑起来,防火墙要么没开要么开了但规则乱七八糟。UFW是Debian自带的防火墙管理工具,它基于iptables和nftables工作,但把复杂的规则简化成了人人都能看懂的命令。下面我会从安装、配置、规则管理、常见场景到进阶技巧,一次性给你讲透。

一、UFW是什么以及为什么选它

UFW全称Uncomplicated Firewall,翻译过来就是"不复杂的防火墙"。它是Debian和Ubuntu系列发行版默认预装的防火墙前端工具。相比直接写iptables规则,UFW的语法更接近自然语言,比如"ufw allow 22/tcp"一看就知道是允许22端口的TCP流量。对于不想深入研究内核网络栈的用户来说,UFW是最务实的选择。

UFW底层仍然调用的是Linux内核的netfilter框架,所以它不是什么玩具,安全性完全有保障。它支持IPv4和IPv6双栈,支持按端口、按服务名、按IP段、按协议类型来设定规则,还支持状态检测(stateful),也就是说你允许了出站连接,对应的回包会自动被放行,不需要额外写规则。

二、检查UFW是否已安装并启用

Debian 10及以上版本一般默认就装了UFW,但不一定默认启用。先检查状态:

sudo ufw status

如果显示"Status: inactive",说明UFW装了但没开。如果显示"command not found",说明压根没装,需要先安装:

sudo apt update
sudo apt install ufw

装完之后再查一次状态,确认是inactive状态就可以开始配置了。注意,在你设置好规则之前,千万不要直接启用UFW,否则默认策略会把你自己锁在外面,尤其是远程SSH连接的情况下,一旦锁了就只能去机房或者用控制台才能救回来。

三、设置默认策略:拒绝入站、允许出站

这是整个配置的核心。UFW的默认策略有四个方向:入站(incoming)、出站(outgoing)、转发(forward)、路由后(routed)。对于绝大多数服务器场景,我们要做的是:

sudo ufw default deny incoming
sudo ufw default allow outgoing

第一条命令的意思是:所有主动连进来的流量,默认全部拒绝。第二条的意思是:本机主动发出去的流量,默认全部允许。这样配置之后,你的服务器可以正常访问外网、下载更新、连接数据库,但外部无法主动连接你的任何端口,除非你显式地开放。

如果你的服务器还需要做端口转发或者NAT(比如做网关、做Docker容器网络),还需要设置转发策略:

sudo ufw default deny forward

不过大多数单台Web服务器不需要改这个,保持默认就行。

四、开放特定服务端口的具体操作

默认拒绝设好之后,接下来就是按需开洞。以下是最常见的几种场景和对应命令。

场景1:开放SSH(22端口)——远程管理必备

如果你是远程管理服务器,SSH端口必须先开,否则启用UFW后你就连不上了。建议同时限制只允许特定IP访问SSH,比开放给全世界安全得多:

sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

如果你不限制IP,想对所有人开放(不推荐但有时候没办法):

sudo ufw allow 22/tcp

或者直接用服务名:

sudo ufw allow ssh

场景2:开放HTTP(80端口)和HTTPS(443端口)——Web服务器

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

或者用服务名:

sudo ufw allow http
sudo ufw allow https

场景3:开放数据库端口(如MySQL 3306、PostgreSQL 5432)

数据库端口强烈建议不要对公网开放,只允许本地或内网IP访问:

sudo ufw allow from 10.0.0.0/8 to any port 3306 proto tcp
sudo ufw allow from 127.0.0.1 to any port 5432 proto tcp

场景4:开放自定义端口(如应用服务跑在8080、3000等)

sudo ufw allow 8080/tcp
sudo ufw allow 3000/tcp

如果是UDP协议(比如某些游戏服务器、DNS、QUIC协议),要明确指定:

sudo ufw allow 53/udp
sudo ufw allow 8080/udp
五、规则管理:查看、删除、调整顺序

规则加多了之后,你需要查看和管理。查看所有规则:

sudo ufw status numbered

输出会带编号,类似这样:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    192.168.1.100
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 3306/tcp                   ALLOW IN    10.0.0.0/8

删除某条规则就用编号:

sudo ufw delete 3

如果想重置所有规则回到初始状态:

sudo ufw reset

这会清除所有规则并恢复默认策略为"全部拒绝",所以执行前一定确认你记得要重新加哪些规则。

关于规则顺序:UFW是按添加顺序从上到下匹配的,第一条匹配到的规则就生效。所以如果你既有"允许192.168.1.100访问22端口"又有"拒绝所有访问22端口",那么允许规则必须放在拒绝规则前面,否则后面的拒绝会覆盖前面的允许。不过通常我们不需要手动写拒绝规则,因为默认策略已经是deny incoming了。

六、启用UFW:最后一步也是最关键的一步

所有规则都配好之后,执行:

sudo ufw enable

系统会提示你"Command may disrupt existing ssh connections. Proceed with operation (y|n)?",输入y确认。如果你之前已经开放了SSH端口,这一步不会断你的连接。但如果你忘了开SSH就直接enable,那就真的把自己锁外面了。

启用之后再确认一次状态:

sudo ufw status verbose

verbose模式会显示更多细节,包括默认策略和每条规则的详细信息。

七、进阶技巧和注意事项

1. 使用应用配置文件而非手动开端口

UFW支持通过/etc/ufw/applications.d/目录下的配置文件来管理服务。比如你可以查看已有的应用配置:

ls /etc/ufw/applications.d/

你会看到OpenSSH、Apache、Nginx等常见服务的配置。如果你装了Nginx,直接用:

sudo ufw allow 'Nginx Full'

这会同时开放80和443端口,比你手动写两条命令更规范。

2. 限制连接速率防止暴力破解

UFW本身不直接支持限速,但可以通过底层iptables实现。比如限制SSH每分钟最多3次新连接:

sudo ufw limit 22/tcp

这个limit命令会自动添加防爆破规则,超过频率的连接会被丢弃。对SSH这种高频被扫描的端口非常有用。

3. 日志记录和监控

UFW的日志默认记录在/var/log/ufw.log,你可以用以下命令实时查看:

sudo tail -f /var/log/ufw.log

也可以在/etc/ufw/ufw.conf中把LOGGING设为"full"来记录更详细的信息。定期检查日志能帮你发现异常扫描和攻击行为。

4. IPv6的处理

如果你的服务器有IPv6地址,UFW默认也会管理IPv6规则。用以下命令查看IPv6状态:

sudo ufw status verbose | grep -i ipv6

开放IPv6端口的语法和IPv4一样,只需要加个"6"后缀或者不加(UFW会自动判断)。但很多人的IPv6其实没在用,如果你确定不需要,可以在/etc/default/ufw中把IPV6=yes改成IPV6=no,减少攻击面。

5. 配合fail2ban使用效果更佳

UFW负责"哪些端口能访问",fail2ban负责"谁在暴力破解"。两者配合是Debian服务器安全的黄金组合。fail2ban会监控日志文件,发现多次失败登录后自动在UFW里添加临时封禁规则。安装和配置fail2ban也很简单:

sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

默认配置就已经能保护SSH了,不需要太多调整。

八、常见错误和排查

错误1:启用UFW后SSH连不上

原因:忘了在enable之前开放SSH端口。解决:如果你有服务器控制台或者VNC,登录进去执行ufw allow 22/tcp然后ufw reload。如果什么都没有,那就只能找机房运维了。

错误2:开放了端口但服务还是访问不了

原因:可能是服务本身没启动,或者监听的地址不对(比如只监听了127.0.0.1)。用以下命令检查:

sudo ss -tlnp | grep 80

确认服务确实在监听0.0.0.0或者你期望的地址。

错误3:规则添加了但没生效

原因:可能忘了执行ufw enable或者ufw reload。添加规则后如果UFW已经是active状态,需要reload才能让新规则生效:

sudo ufw reload
九、总结:最小权限原则是核心思想

UFW配置的本质就是"最小权限原则"——只开放你必须用的端口,其他全部关掉。不要因为图省事就把所有端口都开放,也不要因为怕麻烦就不开防火墙。Debian系统本身是非常安全的发行版,但安全不是自动的,需要你主动去配置。UFW给了你一个低门槛的工具,花十分钟配好,就能挡住绝大多数自动化扫描和初级攻击。把这篇文章里的步骤走一遍,你的Debian服务器安全性就能上一个台阶。