UFW 最佳实践指南

在配置服务器时,防火墙是安全防护的重要一环。这篇文章分享了UFW(Uncomplicated Firewall)的最佳实践配置方法,包括基础配置、IP白名单设置,以及如何解决UFW和Docker配合使用时的端口访问问题。

UFW 初始配置

在开始之前的小提醒:配置防火墙是一件需要格外小心的事情,一不小心可能就把自己锁在门外了, 所以在修改 SSH 端口的防火墙规则时,请务必保持当前的 SSH 连接不要断开,同时开一个新的终端测试新配置是否能正常连接。

先来看看初始配置的步骤:

# 启用 UFW 并设置开机自启动
sudo ufw enable

# 查看当前防火墙状态
sudo ufw status

# 设置默认策略:拒绝所有进入的连接
sudo ufw default deny incoming

# 允许所有出去的连接
sudo ufw default allow outgoing

# 开放 SSH 端口
sudo ufw allow 22/tcp

这些配置完成后,你的服务器就有了基本的安全防护。默认情况下会拒绝所有进入的连接,只有明确允许的端口才能访问。

IP 白名单配置

允许特定 IP 访问所有端口

如果你有固定的办公 IP,可以将其添加到白名单中,这样这个 IP 就能访问服务器上的所有服务:

sudo ufw allow from <trusted_ip> to any

配置转发规则

有时候我们需要设置转发规则,比如使用 Nginx 做反向代理、或是在使用下文将要介绍的 ufw-docker 时。这些场景都涉及到网络流量的转发,所以需要在 UFW 中配置相应的规则:

# 允许特定 IP 的 TCP 转发
sudo ufw route allow proto tcp from <trusted_ip> to any

# 允许特定 IP 的 UDP 转发
sudo ufw route allow proto udp from <trusted_ip> to any

# 允许特定 IP 的所有协议转发
sudo ufw route allow from <trusted_ip> to any

Docker 与 UFW 的配合使用

如果你同时使用 Docker 和 UFW,可能会遇到一个让人困惑的问题:明明在 UFW 中禁用了某个端口,但 Docker 容器映射的端口仍然可以从外部访问。这是因为 Docker 会直接修改 iptables 规则,绕过了 UFW 的设置。

要解决这个问题,我们可以使用 ufw-docker 这个工具。

安装 ufw-docker

# 下载脚本并设置执行权限
sudo wget -O /usr/local/bin/ufw-docker \
  https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker

# 安装 UFW 规则
sudo ufw-docker install

安装过程会自动完成以下操作:

  1. 备份原有的 /etc/ufw/after.rules 文件
  2. after.rules 末尾添加 Docker 相关的规则

安装完成后,需要重启 UFW 使规则生效:

sudo systemctl restart ufw

现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。可能由于某些未知原因,重启 UFW 之后规则也无法生效,请重启服务器。

允许访问 Docker 容器的某个端口

安装完 ufw-docker 后,默认情况下外部将无法访问任何 Docker 容器的端口。如果需要开放特定端口,可以使用以下命令:

# 允许外部访问容器的 3306 端口(以 MySQL 为例)
sudo ufw route allow proto tcp from any to any port 3306

需要特别注意的是,这里的端口号是指容器内部的端口,而不是映射到宿主机的端口。

Comment