Ubuntu防火墙服务ufw学习笔记

防火墙是一种用于监控和过滤传入和传出网络流量的工具。它的工作原理是定义一组安全规则来确定是否允许或阻止特定流量。正确配置防火墙是整个系统安全的最重要方面之一。

Ubuntu 附带了一个名为 UFW(Uncomplicated Firewall,简单的防火墙)的防火墙配置工具。它是一个用户友好的前端,用于管理 iptables 防火墙规则。它的主要目标是让防火墙更容易管理。

安装UFW

Ubuntu 系统自带UFW。如果由于某种原因未安装UFW,你可以执行以下命令来安装该软件包:

sudo apt update

sudo apt install ufw

检查UFW状态

UFW 默认是禁用的。你可以使用以下命令检查 UFW 服务的状态:

sudo ufw status verbose

输出:

Status: inactive

表示UFW状态是“不活动”,即UFW服务不在运行。如果输出:

Status: active

表示UFW服务是在运行着的。

UFW默认政策

UFW 防火墙的默认行为是阻止所有传入和转发流量并允许所有出站流量。这意味着除非你专门打开端口,否则任何试图访问你的服务器的人都将无法连接。但在你的服务器上运行的应用程序能够访问外部世界。

默认策略在/etc/default/ufw文件中定义,可以通过手动修改文件或使用sudo ufw default <policy> <chain>命令来更改。防火墙策略是构建更复杂的用户自定义的规则的基础。

应用程序的UFW配置文件

每个应用程序都可以拥有自己的UFW配置文件,在里面定义特定于这个应用程序的防火墙规则,配置文件是 INI 格式的文本文件,位于/etc/ufw/applications.d目录里。

你可以通过输入以下命令列出服务器上可用的所有应用程序的UFW配置文件:

sudo ufw app list

根据系统上安装的软件包,输出将类似于以下内容:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

要查看特定应用程序的UFW规则,例如Nginx Full,请使用以下命令:

sudo ufw app info 'Nginx Full'

输出显示“Nginx Full”配置文件打开了80和443端口:

Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
  80,443/tcp

启动UFW

如果你从远程位置连接到 Ubuntu,那么在启用 UFW 防火墙之前,你必须明确允许传入的SSH连接。否则,你将无法再通过SSH连接到该机器。

要配置你的 UFW 防火墙以允许传入的 SSH 连接,请输入以下命令:

sudo ufw allow ssh

输出:

Rules updated

Rules updated (v6)

如果 SSH 在非标准端口(即不是22端口)上运行 ,则需要打开该端口。例如,如果你的 ssh 守护进程在7722端口上侦听,请输入以下命令以允许该端口上的进入连接:

sudo ufw allow 7722/tcp

现在UFW防火墙已配置为允许传入的 SSH 连接,你可以通过键入以下命令来启动UFW防火墙:

sudo ufw enable

输出:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

系统将警告你启用防火墙可能会中断现有的 ssh 连接,键入y并点击Enter即可。

开放端口

根据系统上运行的应用程序,你可能还需要开放其他端口。打开端口的一般语法是:

ufw allow port_number/protocol

以下是一些允许外部人员访问你的服务器的 HTTP 服务的方法。

第一个方法是使用服务名称。UFW会检查/etc/services文件中指定的服务的端口和协议:

sudo ufw allow http

第二个方法是指定端口号和协议:

sudo ufw allow 80/tcp

当没有给出协议时,UFW 会为tcp和udp都创建这个规则。

第三个方法是使用应用程序的UFW配置文件。在本例中是“Nginx HTTP”:

sudo ufw allow ‘Nginx HTTP’

UFW 还支持使用关键字proto指定协议的另一种语法:

sudo ufw allow proto tcp to any port 80

开放端口范围

UFW还允许你开放端口范围。起始端口和结束端口以冒号 (:) 分隔,并且你必须指定协议,可以是tcp或udp。

例如,如果你想开放7100到7200这个端口范围,可以运行以下命令:

sudo ufw allow 7100:7200/tcp

sudo ufw allow 7100:7200/udp

允许特定IP地址(白名单)

要允许来自特定源 IP 的所有端口上的进入连接,请使用from关键字后跟源地址。以下是将 IP 地址列入白名单的示例:

sudo ufw allow from 64.63.62.61

如果你只允许特定 IP 地址访问特定端口,请使用to any port关键字后跟端口号。例如,要允许IP地址为64.63.62.61的计算机访问22端口,执行以下命令:

sudo ufw allow from 64.63.62.61 to any port 22

允许IP地址范围(子网)

允许IP地址范围与允许单个IP地址的语法相同。唯一的区别是你需要指定网络掩码(子网掩码)。

下面是一个示例,展示如何允许IP地址范围从192.168.1.1到192.168.1.254对3360端口(MySQL服务)的访问:

sudo ufw allow from 192.168.1.0/24 to any port 3306

允许特定网络接口

要允许特定网络接口上的连接,请使用in on关键字后跟网络接口的名称:

sudo ufw allow in on eth2 to any port 3306

以上允许外部通过eth2网络接口对3306端口的访问。

拒绝连接

所有进入连接的默认策略是deny,UFW将阻止所有进入连接,除非你专门开放某个连接。

编写拒绝规则与编写允许规则相同,你只需使用deny关键字代替allow。

假设你开放了端口80和443,并且你的服务器受到23.24.25.0/24网络攻击。要拒绝来自它们的所有连接,可以运行以下命令:

sudo ufw deny from 23.24.25.0/24

下面是仅拒绝它们访问80端口和443端口的示例:

sudo ufw deny proto tcp from 23.24.25.0/24 to any port 80,443

删除UFW规则

有两种不同的方法,可以通过规则编号或指定实际规则来删除 UFW 规则。

按规则编号删除规则比较容易,尤其是当您你刚接触 UFW 时。要按规则编号删除规则,首先需要找到要删除的规则的编号。要获取编号规则的列表,请使用以下命令:

sudo ufw status numbered

输出类似于:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 8080/tcp                   ALLOW IN    Anywhere

要删除编号为3的允许连接到8080端口的规则,请执行以下命令:

sudo ufw delete 3

第二种方法是通过指定实际规则来删除规则。例如,如果你添加了一条开放端口8069的规则,则可以用以下命令删除它:

sudo ufw delete allow 8069

禁用UFW

如果你想要停止UFW并停用所有规则,你可以执行:

sudo ufw disable

稍后如果你想重启UFW并激活所有规则,只需执行:

sudo ufw enable

重置UFW

重置UFW将禁用UFW并删除所有规则。如果你想重新开始配置UFW的话,请执行以下命令:

sudo ufw reset

IP伪装

IP 伪装是 Linux 内核中 NAT(网络地址转换)的一种变体,它通过重写源和目标 IP 地址和端口来转换网络流量。使用 IP 伪装,你可以允许私有网络中的一台或多台计算机使用其中一台充当网关与互联网通信。

使用 UFW 配置 IP 伪装涉及几个步骤。

首先,你需要启用 IP 转发。为此,请打开文件/etc/ufw/sysctl.conf文件:

sudo vim /etc/ufw/sysctl.conf

找到并取消注释以下行net.ipv4.ip_forward = 1:

net/ipv4/ip_forward=1

接下来,你需要配置 UFW 以允许转发数据包。打开 UFW 配置文件:

sudo vim /etc/default/ufw

找到该DEFAULT_FORWARD_POLICY键,并将值从DROP更改为ACCEPT

DEFAULT_FORWARD_POLICY="ACCEPT"

现在你需要设置nat表中POSTROUTING链的默认策略和伪装规则。为此,请打开/etc/ufw/before.rules文件:

sudo nano /etc/ufw/before.rules

添加以下几行:

#NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to public network interface
-A POSTROUTING -s 10.8.0.0/16 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

不要忘记替换-A POSTROUTING行中的eth0为你的公共网络接口的名称。

完成后,保存并关闭文件。最后,通过禁用并重新启用UFW来重新加载UFW规则:

sudo ufw disable

sudo ufw enable

限速

ufw limit命令可以进行限速,默认的限速规则是20秒内不得超过6次访问。例如:

ufw limit ssh

即可防止ssh被疯狂猜测账号密码暴力登录。

ufw命令详解

ufw有个全局选项--dry-run,如果加了这个参数,那么不会真的执行,而是会输出将会怎样执行,类比为MySQL的explain。例如:

$ sudo ufw --dry-run allow http

查看ufw命令的帮助:

$ ufw --help
Usage: ufw COMMAND

Commands:
 enable                          enables the firewall
 disable                         disables the firewall
 default ARG                     set default policy
 logging LEVEL                   set logging to LEVEL
 allow ARGS                      add allow rule
 deny ARGS                       add deny rule
 reject ARGS                     add reject rule
 limit ARGS                      add limit rule
 delete RULE|NUM                 delete RULE
 insert NUM RULE                 insert RULE at NUM
 route RULE                      add route RULE
 route delete RULE|NUM           delete route RULE
 route insert NUM RULE           insert route RULE at NUM
 reload                          reload firewall
 reset                           reset firewall
 status                          show firewall status
 status numbered                 show firewall status as numbered list of RULES
 status verbose                  show verbose firewall status
 show ARG                        show firewall report
 version                         display version information

Application profile commands:
 app list                        list application profiles
 app info PROFILE                show information on PROFILE
 app update PROFILE              update PROFILE
 app default ARG                 set default application policy

ufw status输出UFW的状态

可以不加参数,也可以使用 numbered 或者 verbose 两个参数,分别是输出编号和详细输出:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
syncthing                  ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
Anywhere                   ALLOW       192.168.0.0/16             
syncthing (v6)             ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] syncthing                  ALLOW IN    Anywhere                  
[ 2] 22                         ALLOW IN    Anywhere                  
[ 3] Anywhere                   ALLOW IN    192.168.0.0/16             
[ 4] syncthing (v6)             ALLOW IN    Anywhere (v6)             
[ 5] 22 (v6)                    ALLOW IN    Anywhere (v6)             
删除规则的时候,就可以指定编号来删除,例如ufw delete 2。

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22000/tcp (syncthing)      ALLOW IN    Anywhere                  
21027/udp (syncthing)      ALLOW IN    Anywhere                  
22                         ALLOW IN    Anywhere                  
Anywhere                   ALLOW IN    192.168.0.0/16             
22000/tcp (syncthing (v6)) ALLOW IN    Anywhere (v6)             
21027/udp (syncthing (v6)) ALLOW IN    Anywhere (v6)             
22 (v6)                    ALLOW IN    Anywhere (v6)

参考

ufw简明教程