第35章:UFW 防火墙(Ubuntu)
第三十五章:UFW 防火墙(Ubuntu)
UFW(Uncomplicated Firewall)是Ubuntu默认的防火墙管理工具。它的设计目标就是一个:让复杂的iptables配置变得简单。
用过iptables的人都知道,那语法简直是天书——iptables -A INPUT -p tcp --dport 22 -j ACCEPT 这种命令,谁记得住?UFW就是来解决这个痛点的,用ufw allow 22代替上面那一长串。
本章配套视频:UFW,让防火墙配置从"天书"变成"大白话"。
35.1 UFW 简介:Uncomplicated Firewall
UFW由 Canonical 公司开发,专门为Ubuntu/Debian设计。它的底层是强大的iptables/netfilter框架,但上层提供了一个简洁的命令行界面。
35.1.1 基于 iptables
UFW并不是一个新的防火墙内核,它只是iptables的"翻译器"和"简化壳"。所有UFW的规则,最终都会被转换成iptables规则,由Linux内核的netfilter模块执行。
graph TB
A["UFW命令<br/>ufw allow 22"]
B["UFW配置生成器"]
C["iptables规则"]
D["netfilter内核模块"]
E["数据包过滤"]
A --> B --> C --> D --> E
style A fill:#ccffcc
style C fill:#ffcccc
style D fill:#ff9999
style E fill:#ff6666简单理解:UFW = iptables的GUI(命令行版)。
35.1.2 命令简化
UFW把复杂的iptables命令简化成了几个简单的单词:
| UFW命令 | 等价的iptables命令 | 说明 |
|---|
ufw allow 22 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT | 开放22端口 |
ufw deny 80 | iptables -A INPUT -p tcp --dport 80 -j DROP | 禁止80端口 |
ufw delete allow 22 | iptables -D INPUT -p tcp --dport 22 -j ACCEPT | 删除22端口规则 |
ufw status | iptables -L -n | 查看规则 |
这就是UFW的设计哲学——简单,但不是简陋。
35.2 ufw status:查看状态
安装Ubuntu Server时,UFW默认是关闭的(inactive)。配置防火墙之前,先看看它的状态。
1
2
| # 查看UFW状态(详细模式)
sudo ufw status verbose
|
1
2
3
| # 启用后查看状态
sudo ufw enable
sudo ufw status verbose
|
1
2
3
4
5
6
7
8
9
| Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
|
输出解读:
Status: active:防火墙已启用Logging: on (low):日志记录开启,级别为lowDefault: deny (incoming), allow (outgoing):默认策略是——入站拒绝、出站允许- 下面的列表显示已添加的放行规则
1
2
| # 查看规则(简洁模式,不显示注释)
sudo ufw status numbered
|
1
2
3
4
5
6
7
| Status: active
Status Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
|
35.3 ufw enable:启用防火墙
配置好规则后,用ufw enable启用防火墙。
1
2
| # 启用UFW
sudo ufw enable
|
1
2
| Command may disrupt existing ssh connections. Proceed with operation [y/n] y
Firewall is active and enabled on system startup
|
重要提醒:启用防火墙之前,务必先放行SSH端口(22),否则你会把自己锁在外面!如果SSH用的不是22端口,先用ufw allow <你的SSH端口>放行后再enable。
35.4 ufw disable:禁用防火墙
1
2
| # 禁用UFW
sudo ufw disable
|
1
| Firewall stopped and disabled on system startup
|
警告:生产环境禁用防火墙要三思。没有防火墙,你的服务器就是裸奔。
35.5 ufw allow:开放端口
ufw allow是最常用的命令,用来放行端口(允许入站连接)。
35.5.1 ufw allow 80
开放80端口(HTTP):
1
2
3
4
5
| # 开放80端口(TCP+UDP都开放)
sudo ufw allow 80
# 查看结果
sudo ufw status
|
1
2
3
| To Action From
-- ------ ----
80 ALLOW IN Anywhere
|
35.5.2 ufw allow 80/tcp
只开放TCP协议的80端口(通常这是你想要的):
1
2
3
4
5
6
7
8
| # 只开放TCP 80端口
sudo ufw allow 80/tcp
# 开放多个端口(用冒号分隔)
sudo ufw allow 8000:9000/tcp
# 开放UDP端口
sudo ufw allow 53/udp
|
1
2
3
4
| # 常见Web服务端口
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 22/tcp # SSH
|
放行之最:对于只提供Web服务的服务器,开放80和443就够了。如果你的Web服务只跑HTTPS,至少也要放行443端口。
35.6 ufw deny:禁止端口
ufw deny用于拒绝入站连接。如果默认策略是allow,可以用deny显式禁止特定端口。
1
2
3
4
5
| # 禁止80端口入站(通常配合默认allow策略使用)
sudo ufw deny 80/tcp
# 查看结果
sudo ufw status numbered
|
1
2
3
4
| Status Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp DENY IN Anywhere
|
35.7 ufw delete:删除规则
删除已添加的防火墙规则。
35.7.1 ufw delete allow 80
1
2
3
4
5
| # 删除允许80端口的规则
sudo ufw delete allow 80
# 或者用编号删除(更精确)
sudo ufw status numbered
|
1
2
3
4
| Status Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
|
1
2
3
4
5
6
| # 删除编号为2的规则
sudo ufw delete 2
# 确认删除
Proceed with operation [y/n] y
Rule deleted.
|
35.8 ufw allow ‘OpenSSH’:按服务名开放
UFW支持直接用服务名代替端口号,OpenSSH对应22端口,Nginx Full会开放80和443。
1
2
3
4
5
6
7
8
9
10
11
| # 放行SSH(按服务名)
sudo ufw allow 'OpenSSH'
# 放行Nginx Full(HTTP + HTTPS)
sudo ufw allow 'Nginx Full'
# 放行Apache Full
sudo ufw allow 'Apache Full'
# 放行CUPS(打印机服务)
sudo ufw allow 'CUPS'
|
技巧:服务名在/etc/services文件中定义。可以用grep -E "ssh|http" /etc/services查看已知服务。
35.9 ufw allow from:按 IP 开放
除了按端口,还可以按来源IP进行过滤。
1
2
3
4
5
6
7
8
| # 只允许192.168.1.100这个IP访问22端口
sudo ufw allow from 192.168.1.100 to any port 22
# 只允许192.168.1.0/24整个网段访问80端口
sudo ufw allow from 192.168.1.0/24 to any port 80
# 允许特定IP访问所有端口(IP白名单)
sudo ufw allow from 192.168.1.100
|
1
2
| # 查看结果
sudo ufw status
|
1
2
3
4
| To Action From
-- ------ ----
22 ALLOW IN 192.168.1.100
80 ALLOW IN 192.168.1.0/24
|
35.10 ufw limit:速率限制防暴力破解
ufw limit是专门用来防暴力破解的命令。它的工作原理:同一个IP在60秒内最多尝试连接6次,超过就封禁。
1
2
3
4
5
| # 对SSH端口启用速率限制
sudo ufw limit 22/tcp
# 如果SSH端口不是22
sudo ufw limit 2222/tcp
|
1
2
| # 查看结果
sudo ufw status numbered
|
1
2
3
| Status Action From
-- ------ ----
[ 1] 22/tcp LIMIT IN Anywhere
|
适用场景:ufw limit最适合SSH这种需要开放但又容易被暴力破解的服务。脚本小子用自动化工具扫描22端口,ufw limit会让他们吃闭门羹。
35.11 ufw default:默认策略
UFW的默认策略决定"没有明确规则匹配的流量"该怎么处理。
1
2
| # 查看当前默认策略
sudo ufw status verbose
|
1
| Default: deny (incoming), allow (outgoing), deny (routed)
|
deny (incoming):入站默认拒绝(白名单,推荐)allow (outgoing):出站默认允许deny (routed):路由转发默认拒绝
1
2
3
4
5
6
7
8
| # 修改默认入站策略为允许(不推荐)
sudo ufw default allow incoming
# 修改默认入站策略为拒绝(推荐)
sudo ufw default deny incoming
# 修改默认出站策略为拒绝(最安全,但可能影响正常业务)
sudo ufw default deny outgoing
|
生产环境推荐:ufw default deny incoming。只放行你明确需要的服务,其他一律拒绝。
35.12 ufw 日志:/var/log/ufw.log
UFW的日志记录了所有被允许和被拒绝的连接尝试,是排查问题和安全审计的重要依据。
1
2
3
4
5
| # 查看UFW日志(实时跟踪)
sudo tail -f /var/log/ufw.log
# 查看最近的UFW日志(最后50行)
sudo tail -50 /var/log/ufw.log
|
1
2
3
4
| # 日志示例
Mar 23 22:10:01 my-server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:0c:29:5a:6b:7c:00:1a:2b:3c:4d:5e:08:00 SRC=192.168.1.100 DST=192.168.1.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=54321 DF PROTO=TCP SPT=54321 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Mar 23 22:10:02 my-server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:0c:29:5a:6b:7c:00:1a:2b:3c:4d:5e:08:00 SRC=192.168.1.100 DST=192.168.1.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=54322 DF PROTO=TCP SPT=54322 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
|
日志字段说明:
[UFW BLOCK]:被UFW阻止(ALLOW则是被允许)IN=eth0:入站网卡SRC=192.168.1.100:源IPDST=192.168.1.10:目标IPPROTO=TCP:协议类型SPT=54321:源端口DPT=22:目标端口
设置日志级别:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 查看当前日志级别
sudo ufw status verbose
# 设置日志为low(只记录被阻止的)
sudo ufw logging low
# 设置日志为medium(记录被阻止和部分允许的)
sudo ufw logging medium
# 设置日志为high(记录所有,包括正常通过的)
sudo ufw logging high
# 关闭日志
sudo ufw logging off
|
1
2
3
4
5
| # 用grep过滤特定IP或端口的日志
sudo grep "DPT=22" /var/log/ufw.log | tail -20
# 统计被阻止SSH连接的IP
sudo grep "DPT=22.*BLOCK" /var/log/ufw.log | awk '{print $11}' | sort | uniq -c | sort -rn
|
安全运维建议:定期查看UFW日志,你会惊讶地发现,全世界有多少"好奇"的IP在扫描你的服务器端口。
本章小结
本章我们掌握了Ubuntu下UFW防火墙的配置:
- UFW简介:Uncomplicated Firewall,iptables的简化壳
- ufw status:查看防火墙状态,
verbose显示详情,numbered显示编号 - ufw enable/disable:启用/禁用防火墙,启用前先放行SSH!
- ufw allow:开放端口,
allow 80/tcp指定协议,allow 'OpenSSH'按服务名 - ufw deny:禁止端口
- ufw delete:删除规则,
delete allow 80或delete 2按编号删 - ufw allow from:按来源IP放行,支持网段
192.168.1.0/24 - ufw limit:速率限制,防暴力破解
- ufw default:设置默认策略,生产环境用
default deny incoming - 日志:
/var/log/ufw.log记录所有被允许和被拒绝的连接
UFW让Linux防火墙配置从"天书"变成"人话"。