当被入侵的脚本或配置错误的应用开始探测 10.x 或 192.168.x 地址时,这些流量会从你的服务器发出,往往引发网络方的滥用投诉。阻止访问私有网段的出站连接,是任何 VPS Linux Infrawire 上简单有效的防护措施。本指南演示如何用 UFW 做到这一点,同时不影响 DNS 或你自己的连接。
📋 前提条件
- 一台可通过 root SSH 访问的 VPS,系统为 Ubuntu 24.04 或 Debian 12(两者都提供 UFW)。
- 对 UFW 有基本了解。如果尚未安装:
Bashsudo apt update && sudo apt install -y ufw
- 修改防火墙时,请保持另一个 SSH 会话处于打开状态。
🧭 需要阻止哪些网段
| 网段 | 用途 |
|---|---|
10.0.0.0/8 | RFC1918 私有地址 |
172.16.0.0/12 | RFC1918 私有地址 |
192.168.0.0/16 | RFC1918 私有地址 |
100.64.0.0/10 | 运营商级 NAT(RFC6598) |
169.254.0.0/16 | IPv4 链路本地 |
192.0.0.0/24 | IETF 协议保留 |
198.18.0.0/15 | 基准测试 |
fc00::/7 | IPv6 唯一本地地址 |
不要阻止 fe80::/10:IPv6 的邻居发现以及常见的默认网关都使用链路本地地址,阻止它会让 IPv6 完全中断。
🔍 先确认 VPS 实际需要什么
如果你的网关或 DNS 解析器位于私有网段,一刀切的阻止会切断网络。添加任何规则之前,先查看你的配置:
Baship route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'
如果某个解析器或你依赖的服务使用私有地址(PRIVATE_DNS_IP),请按下文所示明确放行,并把这条规则放在最前面。如果你用到的一切都是公网地址,可以跳过这一步。
🧱 方法一:ufw deny out
先确保 SSH 保持可达,再设置默认策略。针对私有网段的出站规则不会影响对你 SSH 会话的入站应答。
Bashsudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing
如果需要例外,请插入到第 1 位,使其先于拒绝规则被匹配:
Bashsudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53
现在为每个网段添加一条拒绝规则(UFW 规则按顺序匹配,先匹配者生效):
Bashsudo 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。用以下命令查看规则顺序:
Bashsudo ufw status numbered
📄 方法二:before.rules
如果你更想用一段在用户规则之前生效的统一规则,请编辑 /etc/ufw/before.rules。先备份:
Bashsudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules
在 *filter 段中,放行回环和已建立连接的那几行之后,添加:
TEXT1# 阻止访问私有网络的出站流量 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。然后重新加载:
Bashsudo ufw reload
REJECT 会立即返回错误,应用程序会快速失败而不是等待超时。如果你希望静默丢弃,请使用 -j DROP。
✅ 验证
规则必须已加载,被阻止的目标必须失败,而公网目标应继续正常:
Bashsudo 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。数据包计数器可以确认规则命中:
Bashsudo 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 不会再意外扫描私有网络:此类滥用投诉应当停止。