树莓派防火墙配置指南:从iptables到ufw的实战安全防护
2026/9/8 8:49:01 网站建设 项目流程

1. 项目概述:为什么树莓派需要防火墙?

如果你手头有一台树莓派,无论是用来做家庭媒体中心、个人网站服务器、智能家居网关,还是跑一些自动化脚本,它本质上已经是一台24小时在线的微型服务器。一旦它接入了网络,就和互联网上其他设备一样,面临着潜在的网络访问风险。很多人觉得树莓派性能弱、不起眼,黑客看不上,这其实是个误区。攻击者常常利用自动化脚本扫描整个网段的开放端口,你的树莓派如果恰好开着SSH(22端口)并且用了弱密码,几分钟内就可能被攻破,变成“肉鸡”去攻击别人,或者被植入挖矿程序。

防火墙,就是守护在你树莓派网络边界上的“门卫”。它根据你设定的规则,决定哪些网络流量可以进来(入站),哪些可以出去(出站),哪些连接请求可以被响应。在树莓派上管理防火墙,最核心、最常用的工具就是iptables,以及它的“现代化”前端ufw(Uncomplicated Firewall)。前者功能强大但规则复杂,后者则极大简化了日常管理。这篇指南,就是为你厘清在树莓派上开关、配置和管理防火墙的完整思路与实操细节,让你能轻松地为自己的小设备筑起一道安全防线。

2. 防火墙核心工具选型:iptables 与 ufw 的抉择

在深入配置之前,我们必须先理解手头的工具。树莓派操作系统(通常是 Raspberry Pi OS,基于 Debian)默认提供了两套防火墙方案。

2.1 iptables:强大而原始的基石

iptables是 Linux 内核中 Netfilter 框架的用户空间命令行工具,是防火墙功能的真正实现者。它通过一系列“表”(Tables)和“链”(Chains)来组织规则。

  • 常用表filter(过滤数据包,最常用)、nat(网络地址转换)、mangle(修改数据包内容)。
  • 常用链INPUT(处理进入本机的数据包)、OUTPUT(处理本机发出的数据包)、FORWARD(处理经过本机路由的数据包)。

它的强大之处在于粒度极细的控制能力,但代价是命令冗长、语法晦涩。例如,仅开放TCP 80端口(HTTP)的入站连接,命令是:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

这条命令的意思是:在INPUT链末尾(-A)追加一条规则,协议(-p)为 TCP,目标端口(--dport)为 80,对此数据包的处理动作(-j)是接受(ACCEPT)。

注意:使用iptables命令直接添加的规则是临时的,重启后会失效。要永久保存,需要借助iptables-persistent工具或将规则写入启动脚本。

2.2 ufw:为人类设计的简化前端

正因为iptables太难用,ufw应运而生。它是 Debian/Ubuntu 系发行版(包括树莓派官方系统)的默认防火墙配置工具,其核心设计哲学就是“简化”。ufw在底层依然调用iptables,但它通过更直观的命令帮你生成那些复杂的规则。

例如,实现上面同样的功能(开放80端口),ufw只需要:

sudo ufw allow 80/tcp

或者更简单的sudo ufw allow http(它知道 http 对应 80/tcp)。管理规则的状态(启用/禁用)、查看规则列表也都非常简单直观。

选型建议

  • 对于绝大多数树莓派用户:强烈推荐使用ufw。它能覆盖90%以上的日常使用场景,如开放SSH、Web服务、禁止特定IP等,学习成本极低,不易出错。
  • 仅在以下情况考虑直接使用iptables
    1. 你需要实现非常复杂的网络策略,如端口转发、深度包检测、连接跟踪等高级功能。
    2. 你正在学习 Linux 网络安全的底层机制,希望深入理解 Netfilter 框架。
    3. 你管理的系统没有ufw(如一些极简版系统)。

本指南后续将以ufw作为主要操作对象进行讲解,因为它最适合树莓派的日常防护。同时,我们也会在关键部分揭示ufw背后对应的iptables原理,帮助你理解其工作本质。

3. 实战:使用 ufw 配置和管理树莓派防火墙

假设你刚安装好全新的 Raspberry Pi OS,准备开始配置防火墙。请通过 SSH 或直接连接显示器键盘登录到你的树莓派。

3.1 安装与初始状态检查

首先,确认ufw是否已安装。通常它默认是安装但未启用的。

# 检查 ufw 状态 sudo ufw status

输出很可能是Status: inactive。这意味着防火墙功能未激活,所有流量默认放行。

在启用之前,有一个至关重要的步骤:必须确保当前用来管理树莓派的 SSH 连接不会被阻断。如果你在物理显示器前操作,可以忽略。但如果你是远程 SSH 连接,一旦启用防火墙且没有放行 SSH 端口,连接会立刻断开,你将无法继续远程管理。

3.2 启用防火墙并设置默认策略

在放行 SSH 端口后,再启用防火墙并设置默认策略。

# 1. 首先,允许当前的 SSH 连接(默认端口 22) sudo ufw allow ssh # 或者如果你修改过 SSH 端口,例如 2222 # sudo ufw allow 2222/tcp # 2. 启用 ufw sudo ufw enable

执行enable时,系统会提示“命令可能会中断现有的 SSH 连接”,因为你已经放行了 SSH,所以可以放心输入y确认。

接下来,设置默认策略。这是防火墙的“兜底”行为。

# 设置默认策略:拒绝所有入站连接,允许所有出站连接 sudo ufw default deny incoming sudo ufw default allow outgoing

这是最安全也是最常用的策略组合。它意味着:

  • default deny incoming: 除非有明确允许的规则,否则所有从外部主动发起的连接请求一律拒绝。
  • default allow outgoing: 允许树莓派主动向外部发起的所有连接(例如,系统更新、访问网页、下载软件包)。这通常是我们需要的。

再次检查状态:

sudo ufw status verbose

verbose模式会显示更详细的信息,包括默认策略。你应该能看到类似这样的输出:

Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6)

3.3 管理常用规则:开放与限制服务

现在,你可以根据树莓派运行的服务来添加规则。

开放特定端口:

# 开放 HTTP (80) 和 HTTPS (443) 端口,用于 Web 服务器 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 或者使用服务名 sudo ufw allow http sudo ufw allow https # 开放 Samba 文件共享服务(通常使用 445/tcp) sudo ufw allow samba # 开放自定义端口,例如一个运行在 3000 端口的 Node.js 应用 sudo ufw allow 3000/tcp

允许来自特定 IP 或网段的访问:这在家庭或办公室内部网络管理中非常有用。

# 只允许 IP 为 192.168.1.100 的设备访问 SSH sudo ufw allow from 192.168.1.100 to any port 22 proto tcp # 允许整个子网 192.168.1.0/24 访问 Web 服务 sudo ufw allow from 192.168.1.0/24 to any port 80,443 proto tcp

拒绝特定连接:

# 拒绝某个可疑 IP 的所有访问 sudo ufw deny from 123.456.789.123 # 拒绝所有对 3306 端口(MySQL)的访问,除非来自内部网络 sudo ufw deny 3306/tcp # 然后再添加一条允许内部网络的规则 sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp

规则是有顺序的,ufw会从上到下匹配。后添加的规则默认排在后面。你可以使用sudo ufw status numbered查看带编号的规则列表,然后通过编号删除或插入规则。

3.4 规则管理与高级操作

查看规则:

# 查看简洁规则列表 sudo ufw status # 查看详细规则列表(推荐) sudo ufw status verbose # 查看带编号的规则列表,便于管理 sudo ufw status numbered

删除规则:

# 方法1:通过完整的规则描述删除 sudo ufw delete allow 80/tcp # 方法2(更安全):通过规则编号删除(先用 `status numbered` 查看编号) sudo ufw delete 2

禁用与重置防火墙:

# 暂时禁用防火墙(所有规则保留,但不起作用) sudo ufw disable # 完全重置防火墙:删除所有规则并禁用 sudo ufw reset

reset命令非常危险,它会清空所有配置。执行前务必确认。

启用日志:防火墙日志对于排查网络问题或发现攻击迹象至关重要。

# 设置日志级别,可选 low, medium, high, full sudo ufw logging medium

日志通常位于/var/log/ufw.log或通过journalctl -u ufw查看。medium级别会记录被阻止的连接尝试,对于监控很有帮助。

4. 深入原理:ufw 规则如何转化为 iptables

理解ufw如何与iptables交互,能让你在遇到复杂问题时不至于抓瞎。当你执行sudo ufw allow ssh时,ufw实际上帮你生成了类似以下的iptables规则(可以通过sudo iptables -L查看):

Chain ufw-user-input (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

这条规则被添加到了ufw自己创建的ufw-user-input链中。而ufw通过预设的链结构,将INPUT链的流量跳转(-j)到ufw-user-input链进行匹配。

一个关键的心得:如果你同时混用ufw和手动iptables命令,可能会造成规则冲突或管理混乱。ufw在启用时,会清空并重写它管理的链(通常是ufw-*开头的链)。因此,最佳实践是:一旦决定使用ufw,就完全通过ufw命令来管理防火墙规则,避免直接操作iptables。如果必须使用iptables实现ufw不支持的复杂功能,可以考虑将自定义的iptables规则写入/etc/ufw/before.rules/etc/ufw/after.rules文件,让ufw在启动或重载时自动加载它们。

5. 常见场景配置示例与避坑指南

5.1 场景一:将树莓派作为 Web 服务器

目标:允许公网访问 HTTP/HTTPS,但仅允许本地网络(如 192.168.1.0/24)访问 SSH 和管理后台。

# 设置默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许公网访问 Web 端口 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 仅允许内网访问 SSH sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp # 如果还有另一个管理后台在 8080 端口,同样限制内网访问 sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcp # 启用防火墙 sudo ufw enable

避坑点:确保你添加内网规则时,IP 段写正确。错误的子网掩码(如错写成/32)会导致自己也无法访问。

5.2 场景二:树莓派运行 P2P 下载服务(如 Transmission)

P2P 服务需要监听随机端口供外部连接,比较麻烦。一种方法是开放一个端口范围。

# 允许 51413 端口(Transmission 默认端口)的 TCP 和 UDP sudo ufw allow 51413/tcp sudo ufw allow 51413/udp

更好的做法是在客户端(如 Transmission)的设置中,指定一个固定的端口,然后在ufw中开放这个固定端口。如果必须开放范围,可以:

sudo ufw allow 60000:61000/tcp sudo ufw allow 60000:61000/udp

重要警告:开放大范围的端口会显著增加安全风险,请仅在可信的网络环境中(如纯内网使用)或确有必要时这样做,并尽量缩小范围。

5.3 场景三:防火墙规则不生效或导致服务异常的排查

  1. 规则添加了,但服务还是连不上?

    • 检查1:规则是否真的添加成功?运行sudo ufw status verbose仔细核对端口、协议(tcp/udp)、IP 范围是否正确。
    • 检查2:服务是否在监听?在树莓派上运行sudo netstat -tulpn | grep :端口号,查看服务进程是否真的在监听你开放的端口。防火墙只能管理网络流量,如果服务本身没起来,防火墙规则是无效的。
    • 检查3:是否绑定了错误接口?有些服务默认只监听127.0.0.1(本地回环),这样外部网络是无法访问的。需要检查服务配置,将其绑定到0.0.0.0或树莓派的具体局域网 IP。
  2. 启用 ufw 后,树莓派无法上网(ping 不通外网)?

    • 这通常是因为错误地设置了default deny outgoing策略。出站连接默认应该是允许的。检查默认策略:sudo ufw status verbose | grep Default。如果outgoingdeny,你需要改为allowsudo ufw default allow outgoing
    • 某些特殊情况下,DNS 查询(使用 UDP 53 端口)可能被阻。可以尝试明确放行 DNS:sudo ufw allow out 53/udp
  3. ufw 和 Docker 冲突这是一个经典问题。Docker 容器运行时,会直接操作iptables创建自己的网络规则,这可能会绕过ufw的规则,导致你通过ufw设置的端口限制对 Docker 容器无效。

    • 解决方案:这不是ufw的 bug,而是设计如此。社区有各种方案,相对稳妥的一种是修改 Docker 的启动配置,让它不要自动管理iptables,但这可能影响容器网络功能。对于树莓派上的轻度 Docker 使用,更简单的做法是:通过 Docker 命令的-p参数控制端口映射时,只映射到本地回环地址。例如:
      # 将容器的 80 端口只映射到树莓派的 127.0.0.1:8080,这样外部无法直接访问 docker run -p 127.0.0.1:8080:80 some-web-app # 然后,如果你需要从外部访问,再利用树莓派上的一个反向代理(如 Nginx)监听公网IP的80端口,并代理到 127.0.0.1:8080。这个反向代理的端口是受 ufw 管理的。
    • 实操心得:对于树莓派上的 Docker,我个人的建议是,如果容器服务需要对外提供,优先考虑使用宿主机的反向代理来“暴露”服务,而不是让 Docker 直接映射到宿主机的所有接口。这样防火墙管理更清晰、更安全。

6. 防火墙的监控、维护与自动化

配置好防火墙并非一劳永逸。定期检查和维护同样重要。

监控被拒绝的连接:

# 查看 ufw 日志的最后20行 sudo tail -20 /var/log/ufw.log # 或者动态查看 sudo tail -f /var/log/ufw.log

观察日志中大量的、高频的针对某个端口的[UFW BLOCK]记录,这可能意味着扫描或攻击尝试。如果来自同一个 IP,可以考虑将其永久加入拒绝规则。

定期更新规则:随着服务的增减,记得更新防火墙规则。养成一个习惯:在树莓派上安装或启用一个新服务后,立刻思考“它需要开放哪些端口?”,并相应更新ufw规则。

规则备份与恢复:你的防火墙规则是系统配置的一部分,应该被备份。

# 备份规则 sudo ufw status verbose > ~/ufw-backup-$(date +%Y%m%d).txt # 更彻底的备份是备份整个 ufw 的配置目录 sudo cp -r /etc/ufw ~/ufw-config-backup/

在新系统或重置后,你可以根据备份文件重新添加规则。

自动化脚本:如果你有多台树莓派需要配置相似的防火墙规则,可以编写一个 Shell 脚本。

#!/bin/bash # firewall-setup.sh set -e # 遇到错误即退出 echo “正在配置防火墙...” sudo ufw --force reset # 警告:这会清空现有规则 sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 添加更多规则... sudo ufw --force enable echo “防火墙配置完成。” sudo ufw status verbose

使用前务必在测试环境中验证脚本,并注意--force reset会清除所有规则。

7. 超越基础:安全增强思路

配置好基础的端口防火墙只是网络安全的第一个层面。对于有更高安全需求的树莓派应用(例如暴露在公网的服务器),可以考虑:

  1. 更改 SSH 端口:将 SSH 从默认的 22 端口改到一个高位端口(如 22222),可以显著减少自动化脚本的暴力破解尝试。记得在ufw中开放新端口。
  2. 使用密钥认证禁用 SSH 密码登录:这是比改端口更根本的安全措施。在sshd_config中设置PasswordAuthentication no
  3. 启用 fail2ban:这是一个入侵防御软件,它可以监控系统日志(包括/var/log/ufw.log),当发现某个 IP 在短时间内多次尝试失败登录(如 SSH 密码错误),就会自动调用ufwiptables将该 IP 临时封禁一段时间。这对于防御暴力破解非常有效。
  4. 定期更新系统sudo apt update && sudo apt upgrade,保持系统和所有软件包处于最新状态,修补已知的安全漏洞。

防火墙是你树莓派安全体系的“大门”,而强密码、密钥认证、服务更新则是门内的“锁”和“警报器”。只有多层措施结合,才能构建起相对稳固的防御。从启用ufw、设置默认拒绝入站开始,你已经迈出了至关重要且正确的一步。剩下的,就是在实践中根据你的具体服务,不断细化和完善这条安全边界。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询