中文

使用 UFW 阻止出站流量访问私有网络

1 min
VPS/VDS 主机

当被入侵的脚本或配置错误的应用开始探测 10.x 或 192.168.x 地址时,这些流量会从你的服务器发出,往往引发网络方的滥用投诉。阻止访问私有网段的出站连接,是任何 VPS Linux Infrawire 上简单有效的防护措施。本指南演示如何用 UFW 做到这一点,同时不影响 DNS 或你自己的连接。

📋 前提条件

  • 一台可通过 root SSH 访问的 VPS,系统为 Ubuntu 24.04 或 Debian 12(两者都提供 UFW)。
  • 对 UFW 有基本了解。如果尚未安装:
Bash
sudo apt update && sudo apt install -y ufw
  • 修改防火墙时,请保持另一个 SSH 会话处于打开状态。

🧭 需要阻止哪些网段

网段用途
10.0.0.0/8RFC1918 私有地址
172.16.0.0/12RFC1918 私有地址
192.168.0.0/16RFC1918 私有地址
100.64.0.0/10运营商级 NAT(RFC6598)
169.254.0.0/16IPv4 链路本地
192.0.0.0/24IETF 协议保留
198.18.0.0/15基准测试
fc00::/7IPv6 唯一本地地址

不要阻止 fe80::/10:IPv6 的邻居发现以及常见的默认网关都使用链路本地地址,阻止它会让 IPv6 完全中断。

🔍 先确认 VPS 实际需要什么

如果你的网关或 DNS 解析器位于私有网段,一刀切的阻止会切断网络。添加任何规则之前,先查看你的配置:

Bash
ip route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'

如果某个解析器或你依赖的服务使用私有地址(PRIVATE_DNS_IP),请按下文所示明确放行,并把这条规则放在最前面。如果你用到的一切都是公网地址,可以跳过这一步。

🧱 方法一:ufw deny out

先确保 SSH 保持可达,再设置默认策略。针对私有网段的出站规则不会影响对你 SSH 会话的入站应答。

Bash
sudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing

如果需要例外,请插入到第 1 位,使其先于拒绝规则被匹配:

Bash
sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53

现在为每个网段添加一条拒绝规则(UFW 规则按顺序匹配,先匹配者生效):

Bash
sudo ufw deny out to 10.0.0.0/8 sudo ufw deny out to 172.16.0.0/12 sudo ufw deny out to 192.168.0.0/16 sudo ufw deny out to 100.64.0.0/10 sudo ufw deny out to 169.254.0.0/16 sudo ufw deny out to 192.0.0.0/24 sudo ufw deny out to 198.18.0.0/15 sudo ufw deny out to fc00::/7 sudo ufw enable

ufw enable 可能会提示这会中断 SSH 连接;由于 22 端口已放行,请回答 y。用以下命令查看规则顺序:

Bash
sudo ufw status numbered

📄 方法二:before.rules

如果你更想用一段在用户规则之前生效的统一规则,请编辑 /etc/ufw/before.rules。先备份:

Bash
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules

在 *filter 段中,放行回环和已建立连接的那几行之后,添加:

TEXT
1# 阻止访问私有网络的出站流量 2-A ufw-before-output -d 10.0.0.0/8 -j REJECT 3-A ufw-before-output -d 172.16.0.0/12 -j REJECT 4-A ufw-before-output -d 192.168.0.0/16 -j REJECT 5-A ufw-before-output -d 100.64.0.0/10 -j REJECT 6-A ufw-before-output -d 169.254.0.0/16 -j REJECT

IPv6 有自己的文件 /etc/ufw/before6.rules,链名同样是 ufw-before-output:

TEXT
-A ufw-before-output -d fc00::/7 -j REJECT

如需为 PRIVATE_DNS_IP 设置例外,请在这些行的正上方添加 -A ufw-before-output -d PRIVATE_DNS_IP -j ACCEPT。然后重新加载:

Bash
sudo ufw reload

REJECT 会立即返回错误,应用程序会快速失败而不是等待超时。如果你希望静默丢弃,请使用 -j DROP。

✅ 验证

规则必须已加载,被阻止的目标必须失败,而公网目标应继续正常:

Bash
sudo ufw status verbose ping -c 1 10.0.0.1 # 必须失败 ping -c 1 192.168.1.1 # 必须失败 curl -m 5 http://10.0.0.1 # 必须失败 ping -c 2 1.1.1.1 # 必须成功 dig +short example.com # 必须能解析 curl -I https://www.debian.org

使用 ufw deny out 时,失败的 ping 通常提示 Operation not permitted。数据包计数器可以确认规则命中:

Bash
sudo iptables -L ufw-user-output -n -v sudo iptables -L ufw-before-output -n -v

🛠️ 故障排查

DNS 不工作了。 你的解析器位于私有网段。用 sudo ufw status numbered 删除或调整规则顺序,然后添加 sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53。你也可以在网络配置中改用公共解析器。

修改后 IPv6 出问题。 很可能阻止了 fe80::/10,或阻止了位于 fc00::/7 内的网关。用 sudo ufw delete deny out to fc00::/7 删除该规则,只重新添加真正需要的部分。

无法访问私有网络中的服务(VPN、内部 API)。 用 ufw insert 1 allow out to PRIVATE_IP 为该确切地址添加放行规则。如果连 SSH 本身都无法访问,请通过任意控制台方式连接服务器并运行 sudo ufw disable。


🔒 你的 VPS 不会再意外扫描私有网络:此类滥用投诉应当停止。

及时了解最新的优惠、折扣和特别促销活动。

查看促销

我们使用Cookie

我们使用分析性Cookie来改善您在我们网站上的体验。数据不会出售给第三方。了解更多请查看我们的 隐私政策.