在服务器安全领域,防火墙是守护网络安全的坚实盾牌。UFW(Uncomplicated Firewall),即“不复杂的防火墙”,是一个运行在iptables
之上的防火墙配置工具,它为Ubuntu系统默认提供了一个简洁的命令行界面,用于配置常见的防火墙使用场景。
本文将带你快速掌握UFW的常用规则和命令,包括如何通过端口、网络接口和源IP地址来允许或阻止服务。
快速上手指南
- 本文采用速查表格式,包含独立的命令行代码片段。
- 可以直接从目录跳转到你想要查看的相关的部分。
- 本篇博客中部分地方,需要替换为你自己的实际网络中的IP地址。
使用sudo ufw status
或sudo ufw status verbose
可以检查你当前的UFW规则集。
注意:
在尝试使用本篇博客的 UFW 命令前记得先备份你的云服务器的重要数据,建议可以为服务器创建一个快照,学习完 UFW 命令后恢复快照即可。
服务器准备(可选)
学习UFW防火墙规则,建议可以自己准备一台服务器,毕竟孰能生巧嘛。
- 有公网 IP 的 Linux 服务器,可以选择腾讯云,阿里云, 雨云等,自己有本地服务器也可以。
- 本篇博客以 雨云 为例 https://www.rainyun.com/NTEzMTM1_?s=blog。
- 我会教大家如何创建一台属于自己的云服务器
创建云服务器
点击如图位置:
区域选择
带宽以及配置自行选择。
我这里选择 Ubuntu 22.04 版本。
等待机器部署完毕,选择刚刚确定好的服务器,进入管理面板,找到远程连接相关信息。
使用 PowerShell 进行远程连接。
输入 ssh root@您的服务器IP
例如 ssh root@154.9.227.239
回车后,首次需要输入 yes
,再次回车后即可登录服务器。
到此为止,我们的云服务器就创建好了,接下来就可以在终端运行下面教程中的命令。
基础命令
检查UFW状态
要检查ufw
是否已启用,运行以下命令:
sudo ufw status
如果输出显示Status: inactive
,则表示你的防火墙尚未激活。
启用UFW
如果你在运行ufw status
后输出了Status: inactive
的消息,这表示系统上的防火墙并未启用。你需要运行一个命令来启用它。
默认情况下,启用UFW会阻止服务器上所有端口的外部访问。实际上,如果你在通过SSH连接到服务器并启用ufw
之前没有允许通过SSH端口访问,你将会被断开连接。因此,如果你的情况是这样,请确保按照本指南中的部分先启用SSH访问,然后再启用防火墙。
要在你的系统上启用UFW,运行:
sudo ufw enable
你会看到如下输出:
Firewall is active and enabled on system startup
要查看当前被阻止或允许的内容,你可以在运行ufw status
时使用verbose
参数:
sudo ufw status verbose
禁用UFW
如果你出于某种原因需要禁用UFW,可以使用以下命令:
sudo ufw disable
请注意,此命令将完全禁用你系统上的防火墙服务。
阻止IP地址
要阻止来自特定IP地址的所有网络连接,请运行以下命令,将高亮的IP地址替换为你想要阻止的IP地址:
sudo ufw deny from 203.0.113.100
如果你现在运行sudo ufw status
,你会看到指定的IP地址被列为被拒绝:
Status: active
To Action From
-- ------ ----
Anywhere DENY 203.0.113.100
对于指定的IP地址,所有传入和传出的连接都被阻止。
阻止子网
如果你需要阻止整个子网,你可以使用子网地址作为from
参数在ufw deny
命令中。这将阻止示例子网203.0.113.0/24
中的所有IP地址:
sudo ufw deny from 203.0.113.0/24
阻止特定网络接口的传入连接
要阻止来自特定IP地址到特定网络接口的传入连接,请运行以下命令,将高亮的IP地址替换为你想要阻止的IP地址:
sudo ufw deny in on eth0 from 203.0.113.100
in
参数告诉ufw
仅对传入连接应用此规则,而on eth0
参数指定此规则仅适用于eth0
接口。如果你的系统有多个网络接口(包括虚拟的),并且你需要阻止对某些接口的外部访问,而不是全部,这可能会很有用。
允许IP地址
要允许来自特定IP地址的所有网络连接,请运行以下命令,将高亮的IP地址替换为你想要允许访问的IP地址:
sudo ufw allow from 203.0.113.101
如果你现在运行sudo ufw status
,你会看到输出类似于这样,显示你刚刚添加的IP地址旁边的ALLOW
字样。
Status: active
To Action From
-- ------ ----
...
Anywhere ALLOW 203.0.113.101
你也可以通过提供相应的子网掩码来允许整个子网的连接,例如203.0.113.0/24
。
允许特定网络接口的传入连接
要允许来自特定IP地址到特定网络接口的传入连接,请运行以下命令,将高亮的IP地址替换为你想要允许的IP地址:
sudo ufw allow in on eth0 from 203.0.113.102
如果你现在运行sudo ufw status
,你会看到输出类似于这样:
Status: active
To Action From
-- ------ ----
...
Anywhere on eth0 ALLOW 203.0.113.102
删除UFW规则
要删除你之前在UFW中设置的规则,使用ufw delete
后跟规则(allow
或deny
)和目标规格。以下示例将删除之前设置的允许所有来自IP地址203.0.113.101
的连接的规则:
sudo ufw delete allow from 203.0.113.101
另一种指定你想要删除的规则的方法是通过提供规则ID。这些信息可以通过以下命令获得:
sudo ufw status numbered
从输出中,你可以看到有两个活动规则。第一个规则,带有高亮值,阻止了来自IP地址203.0.113.100
的所有连接。第二个规则允许来自IP地址203.0.113.102
的连接在eth0
接口上。由于默认情况下UFW已经阻止了所有外部访问,除非明确允许,所以第一个规则是多余的,因此你可以删除它。要按ID删除规则,请运行:
sudo ufw delete 1
你将被提示确认操作,并确保你提供的ID指的是你想要删除的正确规则。
列出可用的应用配置文件
安装后,依赖于网络通信的应用程序通常会设置一个UFW配置文件,你可以使用它来允许来自外部地址的连接。这通常与运行ufw allow from
相同,优点是提供了一个快捷方式,抽象了服务使用的具体端口号,并提供了用户友好的术语来引用服务。
要列出当前可用的配置文件,请运行以下命令:
sudo ufw app list
如果你安装了一个服务,如Web服务器或其他依赖网络的软件,而UFW中没有提供配置文件,首先确保服务已启用。对于远程服务器,你通常会有OpenSSH可用:
启用应用配置文件
要启用UFW应用配置文件,请运行ufw allow
后跟你想要启用的应用配置文件的名称,你可以通过sudo ufw app list
命令获得。以下示例中,我们启用了OpenSSH配置文件,这将允许所有传入的SSH连接在服务器的默认SSH端口上:
sudo ufw allow "OpenSSH"
记住,如果配置文件名称由多个单词组成,如Nginx HTTPS
,则需要引用配置文件名称。
禁用应用配置文件
要禁用你之前在UFW中设置的应用配置文件,你需要移除其对应的规则。例如,考虑以下来自sudo ufw status
的输出:
sudo ufw status
这表明Nginx Full
应用配置文件当前已启用,允许任何和所有连接到Web服务器,无论是通过HTTP还是HTTPS。如果你想只允许HTTPS请求从和到你的Web服务器,你首先需要启用最限制性的规则,在这种情况下将是Nginx HTTPS
,然后禁用当前活动的Nginx Full
规则:
sudo ufw allow "Nginx HTTPS"
sudo ufw delete allow "Nginx Full"
记住你可以使用sudo ufw app list
列出所有可用的应用配置文件。
允许SSH
在处理远程服务器时,你需要确保SSH端口是开放的,以便能够远程登录到你的服务器。
以下命令将启用OpenSSH UFW应用配置文件,并允许所有连接到服务器默认SSH端口:
sudo ufw allow OpenSSH
虽然不太用户友好,另一种语法是指定SSH服务的确切端口号,默认设置为22
:
sudo ufw allow 22
允许特定IP地址或子网的传入SSH
要允许来自特定IP地址或子网的传入连接,你将包括一个from
指令来定义连接的来源。这将要求你还需要使用to
参数指定目标地址。要将此规则锁定到SSH仅,你将限制proto
(协议)为tcp
,然后使用port
参数并将其设置为22
,SSH的默认端口。
以下命令将仅允许来自IP地址203.0.113.103
的SSH连接:
sudo ufw allow from 203.0.113.103 proto tcp to any port 22
你也可以使用子网地址作为from
参数,以允许来自整个网络的SSH连接:
sudo ufw allow from 203.0.113.0/24 proto tcp to any port 22
允许特定IP地址或子网的传入Rsync
Rsync程序在端口873
上运行,可用于从一台计算机传输文件到另一台计算机。
要允许来自特定IP地址或子网的传入rsync
连接,请使用from
参数指定源IP地址,并使用port
参数将目标端口设置为873
。
以下命令将仅允许来自IP地址203.0.113.103
的Rsync连接:
sudo ufw allow from 203.0.113.103 to any port 873
要允许整个203.0.113.0/24
子网能够rsync
到你的服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 873
允许Nginx HTTP/HTTPS
安装后,Nginx Web服务器在服务器上设置了几种不同的UFW配置文件。一旦你安装并启用了Nginx服务,运行以下命令以识别可用的配置文件:
sudo ufw app list | grep Nginx
要允许HTTP和HTTPS流量,选择Nginx Full
。否则,选择Nginx HTTP
仅允许HTTP或Nginx HTTPS
仅允许HTTPS。
以下命令将允许服务器上的HTTP和HTTPS流量(端口80
和443
):
sudo ufw allow "Nginx Full"
允许Apache HTTP/HTTPS
安装后,Apache Web服务器在服务器上设置了几种不同的UFW配置文件。一旦你安装并启用了Apache服务,运行以下命令以识别可用的配置文件:
sudo ufw app list | grep Apache
要允许HTTP和HTTPS流量,选择Apache Full
。否则,选择Apache
用于HTTP或Apache Secure
用于HTTPS。
以下命令将允许服务器上的HTTP和HTTPS流量(端口80
和443
):
sudo ufw allow "Apache Full"
允许所有传入HTTP(端口80
)
Web服务器,如Apache和Nginx,通常在端口80
上监听HTTP请求。如果你的默认策略是丢弃或拒绝传入流量,你需要创建一个UFW规则以允许外部访问端口80
。你可以使用端口号或服务名称(http
)作为此命令的参数。
要允许所有传入HTTP(端口80
)连接,请运行:
sudo ufw allow http
另一种语法是指定HTTP服务的端口号:
sudo ufw allow 80
允许所有传入HTTPS(端口443
)
HTTPS通常在端口443
上运行。如果你的默认策略是丢弃或拒绝传入流量,你需要创建一个UFW规则以允许外部访问端口443
。你可以使用端口号或服务名称(https
)作为此命令的参数。
要允许所有传入HTTPS(端口443
)连接,请运行:
sudo ufw allow https
另一种语法是指定HTTPS服务的端口号:
sudo ufw allow 443
允许所有传入HTTP和HTTPS
如果你想允许HTTP和HTTPS流量,你可以创建一个单一规则以允许两个端口。这需要你定义协议为tcp
。
要允许所有传入HTTP和HTTPS(端口80
和443
)连接,请运行:
sudo ufw allow proto tcp from any to any port 80,443
允许特定IP地址或子网的MySQL连接
MySQL在端口3306
上监听客户端连接。如果你的MySQL数据库服务器被远程服务器上的客户端使用,你需要创建一个UFW规则以允许该访问。
要允许来自特定IP地址或子网的MySQL连接,请使用from
参数指定源IP地址,并使用port
参数将目标端口设置为3306
。
以下命令将允许IP地址203.0.113.103
连接到服务器的MySQL端口:
sudo ufw allow from 203.0.113.103 to any port 3306
要允许整个203.0.113.0/24
子网能够连接到你的MySQL服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 3306
允许特定IP地址或子网的PostgreSQL连接
PostgreSQL在端口5432
上监听客户端连接。如果你的PostgreSQL数据库服务器被远程服务器上的客户端使用,你需要确保允许该流量。
要允许来自特定IP地址或子网的PostgreSQL连接,请指定源为from
参数,并将端口设置为5432
:
sudo ufw allow from 203.0.113.103 to any port 5432
要允许整个203.0.113.0/24
子网能够连接到你的PostgreSQL服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 5432
阻止出站SMTP邮件
邮件服务器,如Sendmail和Postfix,通常使用端口25
进行SMTP流量。如果你的服务器不应该发送出站邮件,你可能想要阻止这种流量。要阻止出站SMTP连接,请运行:
sudo ufw deny out 25
这将配置你的防火墙丢弃所有在端口25
上的出站流量。如果你需要在不同的端口号上拒绝出站连接,你可以重复此命令并将25
替换为你想要阻止的端口号。
UFW高级配置技巧
定制默认策略
UFW允许你设置默认的入站和出站策略。例如,如果你想要拒绝所有传入连接,只允许出站连接,你可以使用以下命令:
sudo ufw default deny incoming
sudo ufw default allow outgoing
基于接口的规则
你可以为特定的网络接口设置规则。例如,如果你想要允许所有通过eth1
接口的流量,可以使用:
sudo ufw allow in on eth1
限制速率的规则
为了防止DoS攻击,你可以限制特定IP或服务的连接速率。例如,限制来自IP地址203.0.113.100
的SSH连接速率:
sudo ufw limit from 203.0.113.100 to any port 22 proto tcp
基于时间的规则
UFW允许你根据时间来设置规则。例如,你只希望在工作时间内允许SSH访问:
sudo ufw allow from any to any port 22 proto tcp time 9:00-17:00 mon-fri
规则排序
UFW会按照规则在文件中的顺序来处理它们。默认情况下,UFW会先处理允许的规则,然后是拒绝的规则。如果你有特定的顺序需求,可以通过insert
命令来插入规则到特定位置:
sudo ufw insert 1 allow from 203.0.113.100 to any
这将在UFW规则列表的第一位插入一条允许规则。
复用规则
如果你有多个规则非常相似,可以使用--src-range
和--dst-range
来指定一系列IP地址:
sudo ufw allow from 203.0.113.100:203.0.113.200 to any
这将允许从203.0.113.100
到203.0.113.200
的IP地址范围的流量。
禁用UFW的IPv6支持
如果你的网络环境中不需要IPv6,可以通过以下命令禁用UFW的IPv6支持:
echo "IPV6=no" | sudo tee -a /etc/default/ufw
sudo ufw disable
sudo ufw enable
日志记录
UFW提供了基本的日志记录功能,可以帮助你监控防火墙的活动。你可以启用日志记录,并设置日志级别:
sudo ufw logging on
sudo ufw logging low
导出和导入规则
如果你需要在多个服务器之间同步UFW规则,可以导出当前的规则集,并在其他服务器上导入它们:
sudo ufw status > myfirewallrules.txt
# 在另一台服务器上
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw restore < myfirewallrules.txt
与NAT一起使用
UFW还支持网络地址转换(NAT),这在设置端口转发时非常有用:
sudo ufw allow proto tcp from any to 192.168.1.100 port 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
定期备份和审查UFW规则
定期备份和审查UFW规则是维护服务器安全的好习惯。以下是如何进行这些操作的步骤:
定期备份UFW规则
导出当前UFW规则:
你可以使用ufw
命令导出当前的防火墙规则到一个文件中。打开终端并运行以下命令:
sudo ufw status > ufw-rules.txt
或者,如果你想要更详细的规则信息,可以使用:
sudo ufw status verbose > ufw-rules-verbose.txt
自动化备份:
为了定期备份,你可以将上述命令添加到cron
作业中。编辑当前用户的crontab
文件:
crontab -e
添加以下行以每天自动备份UFW规则到/home/yourusername/backup/ufw-rules-$(date +%Y%m%d).txt
:
0 2 * * * /usr/sbin/ufw status > /home/yourusername/backup/ufw-rules-$(date +\\%Y\\%m\\%d).txt
确保替换yourusername
为你的实际用户名,并创建相应的备份目录。
审查UFW规则
审查规则合理性:
定期手动检查UFW规则文件,确认没有不必要的开放端口,以及所有规则是否都符合安全策略。
使用脚本自动化审查:
你可以编写一个简单的脚本来自动化审查过程,比如检查是否有未授权的开放端口:
#!/bin/bash
allowed_ports=$(cat /path/to/allowed_ports.txt)
current_rules=$(sudo ufw status verbose | grep ALLOW)
for rule in $current_rules; do
if ! echo "$allowed_ports" | grep -q $(echo $rule | awk '{print $NF}'); then
echo "Unapproved open port found: $rule"
fi
done
确保/path/to/allowed_ports.txt
文件包含所有授权开放的端口,然后运行这个脚本。