如何在 Debian 12 上使用 UFW 设置防火墙
为什么使用 UFW?
- 易于使用:UFW 对于开发人员和系统管理员来说都易于使用。
- 安全性:UFW 是一款安全且经过数百万用户充分测试的产品。开箱即用,它设置了默认的防火墙策略,这可以很好地避免意外将服务暴露给外界。
- 灵活性:UFW 防火墙适应性很强,可以根据您的需要配置为基于各种因素(例如源和目标 IP 地址、端口号、协议等)允许或阻止流量。
- 与其他工具集成:将 ufw 与各种应用程序(如 SSH、NFS、POP3、OpenVPN 和其他应用程序配置文件)集成非常简单。还可以编写脚本,从而可以通过 shell 脚本或Ansible等自动化工具轻松配置对这些服务的防火墙访问。
教程详细信息 | |
---|---|
难度等级 | 先进的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 防火墙 |
操作系统兼容性 | Debian • Linux • Ubuntu |
预计阅读时间 | 10 分钟 |
第 1 步 - 在 Debian Linux 12 上安装 ufw
首先,更新您的 APT 存储库并安装任何待处理的更新:使用reboot 命令或shutdown 命令安装新的Linux 内核版本后,重新启动 Debian Linux 机器。例如:
接下来,使用apt 命令或apt-get 命令安装 UFW :
打印 ufw 版本:
版权所有 2008-2023 Canonical Ltd.
$ sudo apt update
$ sudo apt upgrade
$ sudo reboot
$ sudo apt install ufw
$ sudo ufw version
Outputs:
ufw 0.36.2
第 2 步 - 配置 UFW 以允许 SSH 连接
确保允许 ssh 访问。您只需输入:
$ sudo ufw allow ssh
- 如果您在 TCP 端口 2240 上运行 ssh,请输入:
$ sudo ufw allow 2240/tcp
- 一些系统管理员或开发人员在家中或办公室拥有静态 IPv4/IPv6 地址(例如 103.1.2.3)。在这种情况下,仅允许从静态 IP 地址(例如 103.1.2.3)通过 TCP 端口 22 上的 SSH 访问 Ubuntu 服务器 IP 地址 139.144.1.2:
$ sudo ufw allow proto tcp from 103.1.2.3 to 139.144.1.2 port 22
请参阅“如何使用 ufw 打开 ssh 22/TCP 端口”和“如何使用 ufw 限制 SSH(TCP 端口 22)连接”了解高级用法。
您也在运行 HTTP 和 HTTPS 服务吗?让我们打开那些 TCP 80/443 端口,这样防火墙就不会阻止它们。输入:
确认端口已打开,运行:
$ sudo ufw allow http
$ sudo ufw allow https
$ ufw show added
在 Debian 12 中启用 UFW 服务
让我们查看防火墙状态,运行:
$ sudo ufw status
它显示的内容如下:
Status: inactive
因此,启用 UFW,运行:
$ sudo ufw enable
您需要输入y来确认您需要启用防火墙:
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
查看默认策略
要打印默认防火墙策略,请使用grep 命令查询/etc/default/ufw:
$ sudo grep -i '^default_' /etc/default/ufw
以下输出表明默认情况下防火墙将阻止所有传入和转发连接选项,但它将允许来自 Debian Linux 版本 12 的传出连接:
DEFAULT_INPUT_POLICY="DROP" DEFAULT_OUTPUT_POLICY="ACCEPT" DEFAULT_FORWARD_POLICY="DROP" DEFAULT_APPLICATION_POLICY="SKIP"
您可以使用以下语法更改默认策略:
$ sudo ufw default default allow|deny|reject [incoming|outgoing|routed]
例如:
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
拒绝或拒绝默认防火墙策略
让我们找出拒绝政策和拒绝政策之间的区别。我找到了一个有用的表格,其中概述了学生之间的区别:
属性 | 拒绝政策 | 拒绝政策 |
---|---|---|
丢弃数据包 | 是的 | 是的 |
向客户端/发送者发送响应 | 不 | 是的 |
向客户/发送者提供更多信息 | 不 | 是的 |
为提高安全性而推荐的策略 | 是的 | 不 |
了解路由策略
路由策略用于不针对本地主机而是针对网络上另一台主机的流量。防火墙通常会将此流量转发到适当的目的地。例如,您可能需要将端口 80/443 上的传入流量路由到在同一主机或另一台机器上运行的 Linux 容器。
以下规则将允许 VLAN eth1 接口上来自 172.0.0.0/24 子网的所有路由流量:
$ sudo ufw route allow in on eth1 to 172.0.0.0/24
route 关键字还可用于指定允许或拒绝的特定端口:
$ sudo ufw route allow in on eth1 to 172.0.0.0/24 port 80
在此示例中,默认情况下允许通过 lxdbr0 接口传输 Debian Linux 上 LXD 容器的所有流量:
$ sudo ufw allow in on lxdbr0 comment 'lxdbr0 for LXD'
$ sudo ufw route allow in on lxdbr0 comment 'lxdbr0 for LXD'
$ sudo ufw route allow out on lxdbr0 comment 'lxdbr0 for LXD'
控制 ufw 服务
使用 systemctl 命令。语法如下,用于查看当前状态:
$ sudo systemctl status ufw.service
或者,
如果您需要在系统启动时停止防火墙并禁用,请运行:
这是我看到的:
$ sudo ufw status
$ sudo ufw status verbose
$ sudo ufw status numbered
$ sudo ufw disable
Firewall stopped and disabled on system startup
要再次启用防火墙服务,请输入:本
$ sudo ufw enable
教程的其余部分将介绍使用 ufw 阻止或允许端口、IP 地址和应用程序。
步骤 3 – 添加允许规则
可以允许对特定 IP 地址进行无限制访问。例如,系统管理员 IP 或您的 VPN IP 地址 1.2.3.4:
$ sudo ufw allow from 1.2.3.4
在此示例中,允许访问 192.168.2.0/24 CIDR(子网/网络):
将 1.2.3.4 的完全访问权限限制为 TCP 端口 80、443 和 22,如下所示,并附加以下注释:
或者
您可以声明多端口,如下所示,在一条规则中打开 TCP 端口 22、80 和 443,但仅限从 1.2.3.4 IP 打开:
您还可以声明端口范围。例如,打开 3000 到 4000 之间的 TCP 和 UDP 端口范围:
尝试此示例:
上述命令允许从172.0.0.0/24 CIDR(子网)到172.0.0.1 IP 地址的TCP 端口22上的传入 SSH 连接。eth1接口是 SSH 连接来自的网络接口。 proto关键字指定连接应为TCP连接。comment关键字指定在 CLI 中使用sudo ufw status命令列出规则时将显示的注释。
$ sudo ufw allow from 192.168.2.0/24
# OR on 'eth3' interface only #
$ sudo ufw allow in on eth3 from 192.168.2.0/24
$ ufw allow from 1.2.3.4 to any port 22 proto tcp comment 'Open TCP SSH PORT for VPN IP only'
$ sudo ufw allow from 1.2.3.4 to any port 80
$ sudo ufw allow from 1.2.3.4 to any port 443
$ sudo ufw allow proto tcp from 1.2.3.4 to any port 22,80,443
$ sudo ufw allow 3000:4000/tcp
$ sudo ufw allow 3000:4000/udp
$ sudo ufw allow in on eth1 from 172.0.0.0/24 to 172.0.0.1 port 22 proto tcp comment 'Open TCP SSH PORT for VLAN and LXD users'
步骤 4 – 拒绝或拒绝规则
现在让我们看看阻止示例。假设您要阻止攻击者的 IP 地址 1.2.3.4、CIDR 192.168.5.0/24 或 TCP/23 telnet 端口。操作方法如下:
或拒绝它(请参阅表 01了解拒绝与拒绝防火墙目标)运行sudo ufw status verbose命令
时,它看起来如下:
$ sudo ufw deny from 1.2.3.4
$ sudo ufw deny from 192.168.5.0/24
$ sudo ufw deny 23/tcp
$ sudo ufw reject from 1.2.3.4
$ sudo ufw reject from 192.168.5.0/24
$ sudo ufw reject 23/tcp
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- ... .. Anywhere DENY IN 1.2.3.4 Anywhere DENY IN 192.168.5.0/24 23/tcp DENY IN Anywhere 23/tcp (v6) DENY IN Anywhere (v6) ...
阻止端口 25:
$ sudo ufw deny 25
您可以按如下方式阻止来自 CIDR 192.168.1.0/24 的端口 25:
$ sudo ufw deny proto tcp from 192.168.1.0/24 port 25
阻止来自 CIDR 192.168.1.0/24 的所有协议:阻止
$ sudo ufw deny from 192.168.1.0/24
来自 CIDR 192.168.5.0/24 的 TCP 连接:
$ sudo ufw deny proto tcp from 192.168.5.0/24
以下是如何阻止来自 CIDR 192.168.10.0/24 的 UDP 连接:
$ sudo ufw deny proto udp from 192.168.10.0/24
想要阻止来自 CIDR 192.168.11.0/24 的所有端口?请尝试:
$ sudo ufw deny all from 192.168.11.0/24
阻止来自任何来源的所有端口(请谨慎使用以下规则):
$ sudo ufw deny all
步骤 4 – 限制规则
ufw 支持连接速率限制,这对于防止暴力登录攻击非常有用。使用限制规则时,ufw 通常会允许连接,但如果 IP 地址在 30 秒内尝试发起 6 个或更多连接,则会拒绝连接。典型用法是:
$ ufw limit ssh/tcp
或在使用 eth0 接口时限制来自 CIDR 192.168.11.0/24 的 TCP/22 ssh 连接:
$ sudo ufw limit in on eth0 proto tcp from 192.168.11.0/24 port 22
步骤 5 – 删除规则
语法如下,以编号列表格式列出所有当前规则:
$ sudo ufw status numbered
输出:
Status: active To Action From -- ------ ---- [ 1] 22/tcp LIMIT IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443 ALLOW IN Anywhere [ 4] 22,25,80,443,9000/tcp ALLOW IN Anywhere [ 5] 22,80,443/tcp ALLOW IN 1.2.3.4 [ 6] Anywhere REJECT IN 1.2.3.4 [ 7] Anywhere DENY IN 192.168.5.0/24 [ 8] 23/tcp REJECT IN Anywhere [ 9] 25 DENY IN Anywhere [10] Anywhere DENY IN 192.168.1.0/24 25/tcp [11] Anywhere DENY IN 192.168.10.0/24/udp [12] Anywhere on eth0 LIMIT IN 192.168.11.0/24/tcp [13] Anywhere on eth0 LIMIT IN 192.168.11.0/24 22/tcp [14] 22/tcp (v6) LIMIT IN Anywhere (v6) [15] 80/tcp (v6) ALLOW IN Anywhere (v6) [16] 443 (v6) ALLOW IN Anywhere (v6) [17] 22,25,80,443,9000/tcp (v6) ALLOW IN Anywhere (v6) [18] 23/tcp (v6) REJECT IN Anywhere (v6) [19] 25 (v6) DENY IN Anywhere (v6)
要删除第四条规则,请输入命令:
$ sudo ufw delete 4
验证它:有关更多信息,
$ sudo ufw status numbered
请参阅如何删除 UFW 防火墙规则教程。
步骤 6 – 在防火墙处插入规则
It’s crucial to understand the sequence of ufw rules in the system table, which includes PREROUTING, INPUT, FORWARD, OUTPUT, FORWARD, and POSTROUTING. The order of these rules determines which rule will be executed first when a packet matches. Therefore, it’s possible to add a rule at a specific location using ufw to ensure it’s applied correctly. The syntax is:
sudo ufw insert [position] [rule]
Where, the position is the position of the rule in the chain. The position can be a number, such as 1. The rule is the rule that you want to insert or delete. The rule can be a simple rule, such as allow ssh, or a more complex rule as per your needs. In this example, insert a rule that allows incoming tcp/25 connections at the top of the INPUT chain, you would use the following command:
$ sudo ufw insert 1 allow 25/tcp
Say you have six rules, and you want to insert a new rule as rule number five, use:
$ sudo ufw insert 5 deny to any port 22 from 192.168.2.5 proto tcp
Step 7 – Prepend rule at top of the firewall
A special ufw prepend command rule allows you to insert a rule before all other rules in a chain. This can be useful for adding a rule that will always be applied, regardless of the order of the other rule. For example, allow or deny access to specific IP address/CIDR can be done with ufw prepend as follows:
$ sudo ufw prepend deny from 1.2.3.4
$ sudo ufw prepend deny from 123.1.2.3/29
$ sudo ufw prepend allow from 192.168.1.0/24
Similarly, to add a rule before all other rules matching the rule’s IP type, use the prepend rule to deny access 1.2.2.2:
$ sudo ufw prepend deny from 1.2.2.2
Here is how to prepend in your custom script/shell and add Cloudflare IPv4/IPv6 address to your Debian or Ubuntu Linux server with ufw. The following shell function only allows full access to port 80/443 to Cloudflare reverse proxy:
# # Open TCP port 80/443 only to CF IPv4/IPv6 reverse proxy ranges only # update_cf_ufw_rules(){ download_cf_ipv_sets self_get_ipv4 self_get_ipv6 # always add rule at top # while read -r line do ufw prepend allow in on "$_pub_if" proto tcp from "$line" port 80 to "$_self_ipv4" comment "CF:80:$line" ufw prepend allow in on "$_pub_if" proto tcp from "$line" port 443 to "$_self_ipv4" comment "CF:443:$line" done <"$_out/ipv4.txt" while read -r line do ufw prepend allow in on "$_pub_if" proto tcp from "$line" port 80 to "$_self_ipv6" comment "CF:80:$line" ufw prepend allow in on "$_pub_if" proto tcp from "$line" port 443 to "$_self_ipv6" comment "CF:443:$line" done <"$_out/ipv6.txt" } # # Flush/remove all UFW rules that allowed/opened TCP port 80/443 for CF IPv4/IPv6 ranges # flush_cf_ufw_rules(){ read -r -t 15 -N 1 -p "This command will delete all rules for TCP ports 80/443, affecting everyone including Cloudflare. Do you want to proceed (y|N)?" answer if [ "${answer,,}" == "y" ] then ufw show added | grep -E 'CF:(80|443):.*' \ | awk '{ gsub("ufw","ufw delete",$0); system($0)}' fi } # # List rules # list_cf_ufw_rules(){ ufw status verbose | head -7 if ! ufw status verbose | grep -E '# CF:(80|443):.*' then echo "$_self: WARNING: TCP ports 80 and 443 are blocked, even for Cloudflare IPv4/IPV6 ranges. Please run '$_self --update' to open these ports for Cloudflare IP ranges." 1>&2 fi }
Step 8 – Application integration and management with ufw
To integrate applications, the ufw command can read profiles from /etc/ufw/applications.d/ directory. To view the names of known application profiles in ufw, simply use the command:
$ sudo ufw app list
Outputs:
Available applications: AIM Bonjour CIFS DNS Deluge IMAP IMAPS IPP KTorrent Kerberos Admin Kerberos Full Kerberos KDC Kerberos Password LDAP LDAPS LPD MSN MSN SSL Mail submission NFS OpenSSH POP3 POP3S PeopleNearby SMTP SSH Socks Telnet Transmission Transparent Proxy VNC WWW WWW Cache WWW Full WWW Secure XMPP Yahoo qBittorrent svnserve
Getting details about app
Details on the firewall profile for a given application can be seen with:
$ sudo ufw app info {name}
Where ‘{name}’ is one of the applications seen with the sudo ufw app list command:
$ sudo ufw app list
$ sudo ufw app info 'WWW Cache'
Outputs:
Profile: WWW Cache Title: Web Server (8080) Description: Web Server (8080) Port: 8080/tcp
How do I use the app to open port?
The sytax is:
$ sudo ufw allow {name}
Try the extended syntax too
$ sudo ufw allow from 192.168.0.0/16 to any app {name}
Let us open the NFS port using the NFS app so Linux or Unix clients can mount shared dirs using the mount command. On the NFS server type:
$ sudo ufw app info NFS
Open NFS ports:
$ sudo ufw allow NFS
OR limit NFS server access to eth1 interface and CIDR 172.0.0.0/24:
$ sudo ufw allow in on eth1 from 172.0.0.0/24 to any app NFS comment 'Open NFS for VLAN users'
Verify it:
$ sudo ufw verbose
Outputs:
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 25/tcp ALLOW IN Anywhere Anywhere DENY IN 8.0.0.0/24 ... ... 111,2049/tcp (NFS) on eth1 ALLOW IN 172.0.0.0/24 # Open NFS for VLAN users 111,2049/udp (NFS) on eth1 ALLOW IN 172.0.0.0/24 # Open NFS for VLAN users ... ..
Deleting app rule
Want to delete app rule? Try:
$ sudo ufw delete allow NFS
OR complicated syntax as used eariler:
$ sudo ufw delete allow in on eth1 from 172.0.0.0/24 to any app NFS
With the app option, adding or deleting ufw firewall rules becomes effortless, even if you have limited TCP or UDP ports knowledge. The only drawback is not all apps are supported. Hence, knowing a little bit about networking concepts helps with firewalling.
步骤 9 – 显示防火墙报告
语法如下:支持
以下{REPORT_TYPE}(报告)。每个报告都基于实时系统,除监听报告外,均采用原始 iptables 格式:
$ sudo ufw show {REPORT_TYPE}
- 生的
- 内置
- 规则之前
- 用户规则
- 后规则
- 日志记录规则
- 聆听
- 额外
示例
在 Debian Linux 12 CLI 尝试以下示例:
$ sudo ufw show raw | less
尝试将 more、bat 命令或 most 命令作为分页器:
$ sudo ufw show builtins | more
还可以尝试以下两个报告:
$ sudo ufw show listening
并且:
$ sudo ufw show added
总结
如果您是新开发人员或系统管理员,使用 ufw 可以轻松在 Debian Linux v12 上安装和配置防火墙。它是 iptables 或 nftables 的用户友好型前端,也推荐给有经验的用户。UFW 是确保系统安全且易于使用的绝佳选择。我建议使用 man 命令/help 命令在线或离线阅读以下 UFW文档:
$ man ufw
$ ufw --help
Debian 12 上的 UFW 是 IPtables 或 nftables 的前端吗?
它是 nftables 的前端,nftables 是 IPtables 的下一个版本。您可以使用以下 type 命令或 command 命令或 readlink 命令来验证这一点:
为了保持与 iptables 的向后兼容性,/usr/sbin/xtables-nft-multi 将执行所有 /usr/sbin/iptables 命令。您可以通过键入以下两个命令来验证,这两个命令会将所有规则转储到屏幕上:
$ type -a iptables
$ readlink -f /usr/sbin/iptables
$ ls -l /usr/sbin/xtables-nft-multi
$ ls -l /usr/sbin/iptables
$ sudo iptables -S
$ sudo nft list ruleset
我可以在 Debian Linux 12 上使用 Firewalld 吗?
是的,你可以安装并使用它。如果你想查看 Firewalld 教程,请在下面评论。