UFW 防火墙教程
前言
ufw(Uncomplicated Firewall)是一个简单易用的防火墙管理工具,它是iptables的一个接口,支持IPv4和IPv6协议。ufw可以帮助用户快速地配置和管理防火墙规则,提高系统的安全性。
本文将介绍ufw的基本概念、安装方法、常用命令和示例,希望能够对想要使用ufw的用户有所帮助。
实现原理
ufw实际上是一个Python脚本,它通过调用iptables命令来实现防火墙功能。iptables是Linux内核提供的一个强大而复杂的数据包过滤框架,它可以对网络流量进行精细地控制和处理。但是iptables的语法比较繁琐,不太适合初学者使用。因此,ufw就提供了一个更友好、更简单、更直观的方式来操作iptables。
ufw主要由以下几个部分组成:
/etc/default/ufw
:这个文件定义了ufw的默认设置,例如默认策略、日志级别、IP版本等。/etc/ufw/
:这个目录存放了ufw相关的配置文件和脚本。/etc/ufw/applications.d/
:这个目录存放了一些预定义好的应用程序配置文件,每个文件描述了一个或多个服务,并指定了相应的端口和协议。/lib/ufw/user.rules
:这个文件存放了用户自定义的IPv4规则。/lib/ufw/user6.rules
:这个文件存放了用户自定义的IPv6规则。
当用户执行ufw命令时,会根据上述文件生成相应的iptables规则,并加载到内核中生效。
安装方法
在Ubuntu系统中,ufw默认已经安装好了。如果没有安装,可以使用以下命令进行安装:
sudo apt update sudo apt install ufw
在CentOS系统中,默认没有提供ufw软件包,需要先安装EPEL源,然后再安装:
sudo yum install epel-release -y sudo yum install --enablerepo="epel" ufw -y
常用命令
启用和禁用
要启用或禁用防火墙服务,可以使用以下命令:
sudo ufw enable # 启用服务并设置开机自启动
sudo ufw disable # 禁用服务并取消开机自启动
注意,在远程连接服务器时启用防火墙之前,必须先允许SSH连接(或者其他远程连接方式),否则会导致无法再次登录服务器。
查看状态
要查看防火墙当前是否激活以及已经添加的规则列表,可以使用以下命令:
sudo ufw status # 查看简要状态信息
sudo ufw status verbose # 查看详细状态信息
sudo ufw status numbered # 查看编号状态信息(方便删除规则)
设置默认策略
默认策略是指当没有匹配到任何规则时采取的动作。通常有三种选择:allow(允许)、deny(拒绝)和reject(拒绝并返回错误信息)。ufw默认的策略是拒绝所有传入流量,允许所有传出流量。
要修改默认策略,可以使用以下命令:
sudo ufw default allow # 允许所有流量
sudo ufw default deny # 拒绝所有流量
sudo ufw default reject # 拒绝并返回错误信息
sudo ufw default allow incoming # 允许所有传入流量
sudo ufw default deny incoming # 拒绝所有传入流量
sudo ufw default reject incoming # 拒绝并返回错误信息
sudo ufw default allow outgoing # 允许所有传出流量
sudo ufw default deny outgoing # 拒绝所有传出流量
sudo ufw default reject outgoing # 拒绝并返回错误信息
一般来说,建议设置为拒绝所有传入流量,允许所有传出流量,这样可以提高服务器的安全性。然后再根据需要添加特定的规则来允许或拒绝某些端口或地址的连接。
添加和删除规则
要添加或删除防火墙规则,可以使用以下命令:
sudo ufw allow <port>/<protocol> # 允许指定端口和协议的连接,例如 sudo ufw allow 80/tcp
sudo ufw deny <port>/<protocol> # 拒绝指定端口和协议的连接,例如 sudo ufw deny 22/udp
sudo ufw reject <port>/<protocol> # 拒绝并返回错误信息给指定端口和协议的连接,例如 sudo ufw reject 25/tcp
sudo ufw allow from <address> to any port <port> proto <protocol> # 允许指定地址到指定端口和协议的连接,例如 sudo ufw allow from 192.168.1.10 to 3306/tcp
sudo ufw deny from <address> to any port <port> proto <protocol> # 拒绝指定地址到指定端口和协议的连接,例如 sudo ufw deny from 10.0.0.0/8 to any port 22
sudo ufw reject from <address> to any port <port> proto <protocol> # 拒绝并返回错误信息给指定地址到指定端口和协议的连接,例如 sudo ufw reject from any to 25/tcp
sudo ufw allow <service> # 允许指定服务的连接,例如 sudo ufw allow http
sudo ufw deny <service> # 拒绝指定服务的连接,例如 sudo ufw deny ftp
sudo ufw reject <service> # 拒绝并返回错误信息给指定服务的连接,例如 sudo ufw reject smtp
sudo ufw delete allow <port>/<protocol> # 删除允许指定端口和协议的规则,例如 sudo ufw delete allow 80/tcp
sudo ufw delete deny <port>/<protocol> # 删除拒绝指定端口和协议的规则,例如 sudo ufw delete deny 22/udp
sudo ufw delete reject <port>/<protocol>
# 删除拒绝并返回错误信息给指定端口和协议的规则,例如 sudo ufw delete reject 25/tcp
sudo ufw delete allow from <address> to any port <port> proto <protocol> # 删除允许指定地址到指定端口和协议的规则,例如 sudo ufw delete allow from 192.168.1.10 to 3306/tcp
sudo ufw delete deny from <address> to any port <port> proto <protocol> # 删除拒绝指定地址到指定端口和协议的规则,例如 sudo ufw delete deny from 10.0.0.0/8 to any port 22
sudo ufw delete reject from <address> to any port <port> proto <protocol> # 删除拒绝并返回错误信息给指定地址到指定端口和协议的规则,例如 sudo ufw delete reject from any to 25/tcp
sudo ufw delete allow <service> # 删除允许指定服务的规则,例如 sudo ufw delete allow http
sudo ufw delete deny <service> # 删除拒绝指定服务的规则,例如 sudo ufw delete deny ftp
sudo ufw delete reject <service> # 删除拒绝并返回错误信息给指定服务的规则,例如 sudo ufw delete reject smtp
sudo ufw reset # 重置防火墙配置,并删除所有自定义规则
要添加或删除防火墙规则时,还可以使用编号来操作。首先使用以下命令查看已有规则及其编号:
sudo ufw status numbered
输出类似如下:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] Nginx Full ALLOW IN Anywhere
[ 5] OpenSSH ALLOW IN Anywhere
[ 6] Apache Full ALLOW IN Anywhere
[ 7] Apache Secure ALLOW IN Anywhere
[ 8] Nginx HTTP ALLOW IN Anywhere
[ 9] Nginx HTTPS ALLOW IN Anywhere
[10] OpenSSH (v6) ALLOW IN Anywhere (v6)
[11] Nginx Full (v6) ALLOW IN Anywhere (v6)
[12] Apache Full (v6) ALLOW IN Anywhere (v6)
[13] Apache Secure (v6) ALLOW IN Anywhere (v6)
[14] Nginx HTTP (v6) ALLOW IN Anywhere (v6)
[15] Nginx HTTPS (v6) ALLOW IN Anywhere (v6)
然后使用以下命令删除对应编号的规则:
sudo ufw delete <number>
例如,要删除允许Nginx HTTPS连接的规则(编号为9),可以输入:
sudo ufw delete 9
使用示例
下面给出一些常见场景下使用ufw配置防火墙的示例。
允许SSH连接
如果你需要远程登录服务器,你必须允许SSH连接。如果你使用默认端口22,则可以输入以下命令:
sudo ufw allow ssh
或者
sudo ufw allow OpenSSH
或者
sudo ufw allow 22/tcp
如果你使用了自定义端口(假设为2222),则可以输入以下命令:
sudo ufw allow 2222/tcp
允许HTTP和HTTPS连接
如果你运行了一个Web服务器,你需要允许HTTP(端口80)和HTTPS(端口443)的连接。你可以使用以下命令:
sudo ufw allow http # 或者 sudo ufw allow 80/tcp
sudo ufw allow https # 或者 sudo ufw allow 443/tcp
或者,你也可以使用应用程序配置文件来允许这些服务,例如:
sudo ufw allow 'Nginx Full' # 如果你使用Nginx作为Web服务器
sudo ufw allow 'Apache Full' # 如果你使用Apache作为Web服务器
允许特定IP地址或子网访问特定端口
有时候,你可能想要限制某些IP地址或子网访问某些端口,例如只允许内网用户访问数据库服务。这时候,你可以使用以下命令:
sudo ufw allow from <address> to any port # 允许指定地址到指定端口的连接,例如 sudo ufw allow from 192.168.1.10 to any port 3306
sudo ufw deny from< address> to any port # 拒绝指定地址到指定端口的连接,例如 sudo ufw deny from 10.0.0.0/8 to any port 22
注意,<address>可以是单个IP地址或者带有掩码的子网地址。
在Ubuntu和Clear Linux上开启ufw
在Ubuntu和Clear Linux上开启ufw很简单,只需要执行以下命令即可:
sudo ufw enable # 启用服务并设置开机自启动
在未提供ufw包的Linux发行版上开启ufw稍微复杂一点。我们需要手动创建一个服务文件,并将其添加到multi-user.target中。具体步骤如下:
- 创建一个名为
/etc/systemd/system/ufw.service
的文件,并写入以下内容:
[Unit]
Description=Uncomplicated firewall
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/ufw --force enable
ExecStop=/usr/bin/ufw --force disable
[Install]
WantedBy=multi-user.target
- 执行以下命令来重新加载systemd并启用ufw服务:
sudo systemctl daemon-reload # 加载新创建的服务文件
sudo systemctl enable --now ufw.service # 启用并立即启动ufw服务
总结
本文介绍了ufw防火墙的基本概念、安装方法、常用命令和示例,希望能够对想要使用ufw的用户有所帮助。ufw是一个简单易用的防火墙管理工具,它可以让用户快速地配置和管理防火墙规则,提高系统的安全性。ufw还支持一些高级特性,例如允许与特定网络接口的连接、配置NAT等等,有兴趣的用户可以进一步探索和学习。