介绍
UFW,或不复杂的防火墙,是iptables
的界面,旨在简化配置防火墙的过程.虽然iptables
是一个坚实和灵活的工具,但初学者可能很难学习如何正确地配置防火墙。
本教程将向您展示如何在Ubuntu 18.04上设置防火墙。
前提条件
要遵循本教程,您将需要:
- 一个 Ubuntu 18.04 服务器与一个
sudo
非根用户,您可以通过遵循 Ubuntu 18.04 初始服务器设置教程中的步骤 1–3 来设置。
UFW是默认安装在Ubuntu上. 如果它因某种原因被卸载,你可以用sudo apt install ufw
安装它。
步骤1:确保 IPv6 已启用
在最近的Ubuntu版本中,IPv6是默认启用的。在实践中,这意味着大多数向服务器添加的防火墙规则将包括一个IPv4和一个IPv6版本,后者在UFW状态命令的输出中被标识为v6
。为了确保IPv6是启用的,您可以检查您的UFW配置文件在/etc/default/ufw
。
1sudo nano /etc/default/ufw
然后确保IPV6
的值设置为是
。
1[label /etc/default/ufw excerpt]
2IPV6=yes
如果您正在使用nano
,您可以通过键入CTRL+X
,然后Y
和ENTER
来确认。
当 UFW 在本指南的后一步中启用时,它将配置为写入 IPv4 和 IPv6 防火墙规则。
步骤 2 – 设置默认策略
如果你刚刚开始使用 UFW,一个很好的第一步是检查你的默认防火墙策略. 这些规则控制如何处理不明确匹配任何其他规则的流量。
默认情况下,UFW 设置为拒绝所有传入连接,并允许所有传出连接,这意味着任何试图访问您的服务器的人都无法连接,而服务器中的任何应用程序都可以访问外部世界。
为了确保您能够跟随本教程的其余部分,您现在将为输入和输出流量设置您的UFW默认策略。
要将默认的 UFW 输入策略设置为否定
,运行:
1sudo ufw default deny incoming
1[secondary_label Output]
2Default incoming policy changed to 'deny'
3(be sure to update your rules accordingly)
要将默认的 UFW 输出策略设置为允许
,运行:
1sudo ufw default allow outgoing
1[secondary_label Output]
2Default outgoing policy changed to 'allow'
3(be sure to update your rules accordingly)
这些命令设置了默认值,以拒绝接入并允许输出连接. 这些默认值单独对个人计算机来说可能足够,但服务器通常需要响应来自外部用户的接入请求。
步骤 3 – 允许 SSH 连接
如果您现在启用 UFW 防火墙,它将拒绝所有接入连接,这意味着您需要创建明确允许合法的接入连接的规则 - 例如 SSH 或 HTTP 连接 - 如果您希望您的服务器响应这些类型的请求。
允许OpenSSH UFW应用程序配置文件
安装后,大多数依赖网络连接的应用程序将在 UFW 中注册应用程序配置文件,这使用户能够快速允许或拒绝对服务的外部访问。
1sudo ufw app list
1[secondary_label Output]
2Available applications:
3 OpenSSH
要启用 OpenSSH 应用程序配置文件,运行:
1sudo ufw allow OpenSSH
1[secondary_label Output]
2Rule added
3Rule added (v6)
这将创建防火墙规则,允许所有连接在22
端口上,这是SSH大门默认上倾听的端口。
允许使用服务名称的 SSH
将 UFW 配置为允许接入 SSH 连接的另一种方法是通过引用其服务名称: ssh
。
1sudo ufw allow ssh
1[secondary_label Output]
2Rule added
3Rule added (v6)
UFW 知道服务根据 /etc/services
文件使用哪些端口和协议。
允许 SSH 通过端口号码
或者,您可以通过指定端口而不是应用程序配置文件或服务名称来编写等效规则,例如,此命令与以前的示例相同:
1sudo ufw allow 22
1[secondary_label Output]
2Rule added
3Rule added (v6)
例如,如果您的 SSH 服务器正在听到端口 2222
,您可以使用此命令允许该端口上的连接:
1sudo ufw allow 2222
1[secondary_label Output]
2Rule added
3Rule added (v6)
现在您的防火墙已配置为允许接入的 SSH 连接,您可以启用它。
步骤 4 – 允许 UFW
您的防火墙现在应该配置为允许 SSH 连接. 要验证到目前为止添加了哪些规则,即使防火墙仍然禁用,您可以使用:
1sudo ufw show added
1[secondary_label Output]
2Added user rules (see 'ufw status' for running firewall):
3ufw allow OpenSSH
确认有允许接入 SSH 连接的规则后,您可以通过:
1sudo ufw enable
1[secondary_label Output]
2Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
3Firewall is active and enabled on system startup
您将收到一个警告,称该命令可能会干扰现有 SSH 连接. 您已经设置了一个允许 SSH 连接的防火墙规则,所以应该保持正常。
防火墙现在是活跃的。运行sudo ufw status verbose
命令,查看设置的规则。本教程的其余部分涵盖了如何更详细地使用UFW,例如允许或拒绝不同类型的连接。
步骤 5 – 允许其他连接
在此时,您应该允许服务器需要响应的所有其他连接. 您应该允许的连接取决于您的具体需求. 您已经知道如何编写基于应用程序配置文件、服务名称或端口的连接的规则; 您已经在端口 `22’上为 SSH 做了这些操作。
- HTTP 在端口 80,这是未加密的网页服务器使用的,使用
sudo ufw允许 http
或sudo ufw允许 80
- HTTPS 在端口 443,这是加密的网页服务器使用的,使用
sudo ufw允许 https
或sudo ufw允许 443
- Apache与HTTP和HTTPS,使用
sudo ufw允许
Apache Full` - Nginx与HTTP和HTTPS,使用
sudo ufw允许
Nginx Full`
不要忘了检查哪些应用程序配置文件可供您的服务器使用sudo ufw应用程序列表
。
除了指定端口或已知服务名称之外,还有几种其他方式允许连接。
具体港口范围
您可以使用 UFW 指定端口范围,有些应用程序使用多个端口,而不是单个端口。
例如,若要允许使用6000
至6007
端口的 X11 连接,请使用以下命令:
1sudo ufw allow 6000:6007/tcp
2sudo ufw allow 6000:6007/udp
在使用 UFW 指定端口范围时,您必须指定该规则应适用于的协议(‘tcp’或 ‘udp’)。
具体的IP地址
例如,如果您想要允许从特定 IP 地址(例如工作或家庭 IP 地址)的连接,您需要使用从
参数,然后提供您想要允许的 IP 地址:
1sudo ufw allow from 203.0.113.4
1[secondary_label Output]
2Rule added
您也可以通过添加到任何端口
,然后添加端口号来指定 IP 地址可以连接的端口,例如,如果您想要允许203.0.113.4
连接到端口22
(SSH),请使用以下命令:
1sudo ufw allow from 203.0.113.4 to any port 22
1[secondary_label Output]
2Rule added
子网
如果您想要允许 IP 地址的子网,您可以使用 CIDR 标注来指定一个 netmask. 例如,如果您想要允许从203.0.113.1
到203.0.113.254
的所有 IP 地址,您可以使用以下命令:
1sudo ufw allow from 203.0.113.0/24
1[secondary_label Output]
2Rule added
同样,您还可以指定203.0.113.0/24
子网允许连接的目标端口。
1sudo ufw allow from 203.0.113.0/24 to any port 22
1[secondary_label Output]
2Rule added
连接到特定网络接口
如果您想要创建一个仅适用于特定网络接口的防火墙规则,则可以通过指定允许启用
,然后是网络接口的名称。
您可能想在继续之前搜索您的网络接口,请使用以下命令:
1ip addr
1[secondary_label Output Excerpt]
22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
3. . .
43: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
5. . .
突出的输出表示网络接口的名称,它们通常被命名为eth0
或enp3s2
。
因此,如果您的服务器有一个名为eth0
的公共网络接口,您可以使用这个命令允许HTTP流量(端口80
)到它:
1sudo ufw allow in on eth0 to any port 80
1[secondary_label Output]
2Rule added
3Rule added (v6)
这样做将允许您的服务器从公共互联网接收HTTP请求。
或者,如果您希望您的 MySQL 数据库服务器(端口 3306
)在私人网络接口 eth1
上听取连接,例如,您可以使用以下命令:
1sudo ufw allow in on eth1 to any port 3306
1[secondary_label Output]
2Rule added
3Rule added (v6)
这将允许您私人网络上的其他服务器连接到您的MySQL数据库。
步骤6:拒绝连接
如果您尚未更改入口连接的默认策略,则 UFW 将被配置为拒绝所有入口连接,这通常简化了创建安全防火墙策略的过程,要求您创建明确允许特定端口和 IP 地址通过的规则。
但是,有时你会想要基于源 IP 地址或子网拒绝特定连接,也许是因为你知道你的服务器在那里受到攻击。
要编写 ** deny** 规则,您可以使用先前描述的命令,用 ** deny** 代替 allow。
例如,要拒绝 HTTP 连接,您可以使用以下命令:
1sudo ufw deny http
1[secondary_label Output]
2Rule added
3Rule added (v6)
或者,如果你想拒绝从203.0.113.4
的所有连接,你可以使用这个命令:
1sudo ufw deny from 203.0.113.4
1[secondary_label Output]
2Rule added
在某些情况下,您可能还想阻止来自服务器的出发连接. 若要阻止所有用户在服务器上使用端口,例如 SMTP 流量的端口 25 ’,您可以使用
拒绝`,然后是端口号:
1sudo ufw deny out 25
1[secondary_label Output]
2Rule added
3Rule added (v6)
这将阻止服务器上的所有 SMTP 流量。
第7步:删除规则
知道如何删除防火墙规则与知道如何创建它们一样重要. 指定要删除的规则有两种不同的方式:通过规则号码或其可人读的名称(类似于规则创建时所指定的方式)。
通过数字删除 UFW 规则
若要根據其數字刪除 UFW 規則,您首先需要取得所有防火牆規則的號碼列表. UFW 狀態指令有選項顯示每個規則旁邊的數字,如下所示:
1sudo ufw status numbered
1[secondary_label Numbered Output:]
2Status: active
3
4 To Action From
5 -- ------ ----
6[ 1] 22 ALLOW IN 15.15.15.0/24
7[ 2] 80 ALLOW IN Anywhere
如果您决定要删除规则号 2,允许端口80(HTTP)连接的规则号,您可以用 UFW 删除命令这样指定它:
1sudo ufw delete 2
1[secondary_label Output]
2Deleting:
3 allow 80
4Proceed with operation (y|n)? y
5Rule deleted
这将提示确认,然后删除规则2,允许HTTP连接。 请注意,如果您已启用IPv6,您也希望删除相应的IPv6规则。
通过名称删除 UFW 规则
而不是使用规则号码,您还可以根据规则类型(通常是允许
或拒绝
)和该规则的目标服务名称或端口号或应用程序配置文件名称来参考其可读名称,例如,如果您想要删除以前启用的名为Apache Full
的应用程序配置文件的允许
规则,则可以使用:
1sudo ufw delete allow "Apache Full"
1[secondary_label Output]
2Rule deleted
3Rule deleted (v6)
例如,如果您之前设置了一个规则以允许具有sudo ufw allow http
的HTTP连接,那么以下是您可以删除该规则的方式:
1sudo ufw delete allow http
1[secondary_label Output]
2Rule deleted
3Rule deleted (v6)
由于在指定规则时,服务名称可以与端口号交换,所以您也可以参考相同的规则为允许80
,而不是允许HTTP
:
1sudo ufw delete allow 80
1[secondary_label Output]
2Rule deleted
3Rule deleted (v6)
当通过名称删除 UFW 规则时,IPv4 和 IPv6 规则都将被删除,如果它们存在。
步骤 8 – 检查 UFW 状态和规则
您可以随时使用此命令检查 UFW 的状态:
1sudo ufw status verbose
如果 UFW 被禁用,这是默认的,你会看到这样的东西:
1[secondary_label Output]
2Status: inactive
如果 UFW 是活跃的,如果您遵循步骤 3,输出将表示它是活跃的,并将列出设置的任何规则,例如,如果防火墙设置为允许 SSH (端口 22
) 连接从任何地方,输出可能会看起来像这样:
1[secondary_label Output]
2Status: active
3Logging: on (low)
4Default: deny (incoming), allow (outgoing), disabled (routed)
5New profiles: skip
6
7To Action From
8-- ------ ----
922/tcp ALLOW IN Anywhere
使用状态
命令来检查 UFW 如何配置防火墙。
步骤 9 – 禁用或重置 UFW (可选)
如果您决定不希望使用 UFW,您可以使用此命令禁用它:
1sudo ufw disable
1[secondary_label Output]
2Firewall stopped and disabled on system startup
您使用 UFW 创建的任何规则将不再活跃,如果需要稍后激活,您可以随时运行sudo ufw 启用
。
如果您已经配置了 UFW 规则,但决定要重新开始,则可以使用重置命令:
1sudo ufw reset
1[secondary_label Output]
2Resetting all rules to installed defaults. This may disrupt existing ssh
3connections. Proceed with operation (y|n)? y
4Backing up 'user.rules' to '/etc/ufw/user.rules.20210729_170353'
5Backing up 'before.rules' to '/etc/ufw/before.rules.20210729_170353'
6Backing up 'after.rules' to '/etc/ufw/after.rules.20210729_170353'
7Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210729_170353'
8Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210729_170353'
9Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210729_170353'
这将禁用 UFW 并删除以前定义的任何规则. 这应该为您提供新的开始 UFW. 请记住,默认策略不会改变原始设置,如果您在任何时候修改它们。
结论
您的防火墙现在已配置为允许(至少)SSH连接,请确保允许您的服务器需要的任何其他接入连接,同时限制任何不必要的连接,以便您的服务器功能和安全。
若要了解更多常见的 UFW 配置,请参阅 UFW Essentials: Common Firewall Rules and Commands 教程。