在使用国外VPS建站或搭建服务时,最让人头疼的问题之一就是IP突然被墙。你明明没有做任何违规操作,服务器昨天还正常访问,今天就完全连不上了。更诡异的是,有时候电信用户能访问、联通用户能访问、唯独移动用户打不开——或者反过来。这种情况往往不是VPS本身的问题,而是IP被GFW(防火长城)针对性阻断了。
本文将系统讲解VPS IP被墙的检测方法、TCP阻断与UDP封锁的诊断技巧,以及从换IP到CDN兜底的完整恢复方案。无论你是用Oracle Cloud免费实例、Hetzner低价独服,还是日本/新加坡节点的VPS,这套排查流程都能帮你快速定位问题并恢复服务。

一、IP被墙的常见类型与表现
IP被墙并不是一个笼统的概念,根据阻断方式的不同,表现症状也有很大差异。准确识别阻断类型是制定恢复方案的前提。
1. TCP阻断(最常见)
TCP阻断是GFW最常用的封锁手段。具体表现是:用TCP协议连接目标IP的任何端口(SSH的22端口、HTTP的80端口、HTTPS的443端口等)都无法建立连接,但ping该IP却能正常收到回包。这是因为GFW只阻断了TCP握手包(SYN/SYN-ACK),没有干扰ICMP协议。
典型症状:
- ping IP正常,延迟正常
- SSH连接超时(Connection timed out)
- 浏览器访问网站超时(ERR_CONNECTION_TIMED_OUT)
- telnet/iperf3等TCP工具全部超时
2. UDP阻断
UDP阻断相对少见,但近年来逐渐增多。表现是TCP协议正常工作(SSH能连、网站能访问),但所有基于UDP的协议都无法通信,包括DNS查询(UDP 53)、WireGuard VPN、QUIC/HTTP3等。
典型症状:
- SSH和HTTPS正常
- WireGuard无法握手或频繁断线
- DNS over UDP解析超时(但DNS over TCP正常)
- HTTP/3(QUIC)无法建立连接,浏览器自动降级到HTTP/2
3. 全协议阻断(完全封锁)
这是最严重的封锁方式,IP的所有协议(TCP、UDP、ICMP)全部被丢弃。ping不通、SSH连不上、任何工具都无法通信。这种情况下,VPS基本上完全失联,只能通过服务商的控制台(VNC/串口)登录。
4. 间歇性丢包(部分封锁)
这是一种”软封锁”,不是完全阻断,而是对特定IP的流量进行高比例丢包(比如丢包率50%-80%)。表现是连接时好时坏,速度极慢,SSH经常卡顿断线,网站加载极慢或时开时不开。这种封锁最难诊断,因为偶尔能连通,容易误判为网络质量问题。
| 封锁类型 | ICMP(ping) | TCP连接 | UDP通信 | 诊断难度 |
|---|---|---|---|---|
| TCP阻断 | 正常 | 全部超时 | 正常 | 低 |
| UDP阻断 | 正常 | 正常 | 全部超时 | 中 |
| 全协议阻断 | 超时 | 超时 | 超时 | 低 |
| 间歇性丢包 | 偶尔丢包 | 时通时断 | 时通时断 | 高 |
二、IP被墙检测工具与诊断方法
检测IP是否被墙,需要从多个角度交叉验证。下面介绍几种最实用的检测工具和操作方法。
1. 使用ping和tcping对比测试
最基础的检测方法是对比ICMP和TCP的连通性。如果ping通但tcping不通,基本可以确认是TCP阻断。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # 先测试ICMP连通性
ping -c 10 your_vps_ip
# 再测试TCP端口连通性(需要安装tcping)
# CentOS/RHEL
yum install -y tcping
# Debian/Ubuntu
apt install -y tcping
# 测试SSH端口(22)的TCP连通性
tcping your_vps_ip 22
# 测试HTTP端口(80)的TCP连通性
tcping your_vps_ip 80
# 测试HTTPS端口(443)的TCP连通性
tcping your_vps_ip 443
如果ping正常返回延迟,但tcping全部显示”Connection timed out”或”Connection refused”,说明TCP被阻断了。注意区分”timed out”(被墙)和”refused”(端口未开放),前者是网络层丢包,后者是服务端主动拒绝。
2. 使用itdog.cc在线测试全国连通性
itdog(https://www.itdog.cn/ping/)是国内最常用的VPS线路测试工具之一。它提供了全国各省、各运营商(电信/联通/移动)的ping和tcping测试节点,能快速判断IP是否被特定运营商屏蔽。
1
2
3
4
5 # 使用方法:
# 1. 访问 https://www.itdog.cn/tcping/
# 2. 输入你的VPS IP和端口(如 1.2.3.4:443)
# 3. 选择"全国"测试范围
# 4. 查看各省份/运营商的测试结果
如果测试结果显示:电信节点全部超时、联通节点全部超时、但移动节点全部正常——说明你的IP被电信和联通的出口屏蔽了(这种情况比较少见,通常移动更容易被封)。关于移动网络打不开VPS的问题,之前也有过专题讨论,核心原因往往是三网出口路由策略不同。反之亦然。
3. 使用mtr/traceroute分析路由路径
mtr(My Traceroute)结合了traceroute和ping的功能,能实时显示到目标IP的每一跳路由和丢包情况。通过分析路由路径,可以判断是在哪一跳开始被丢包的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # 安装mtr
# CentOS/RHEL
yum install -y mtr
# Debian/Ubuntu
apt install -y mtr
# 从本地测试到VPS的路由
mtr -n -c 30 your_vps_ip
# 从VPS测试回程路由(在VPS上执行)
mtr -n -c 30 your_local_ip
# 使用TCP模式测试(默认是ICMP,GFW可能只封TCP)
mtr -n -T -P 443 -c 30 your_vps_ip
# 使用UDP模式测试
mtr -n -u -P 443 -c 30 your_vps_ip
关键分析点:如果路由在前几跳正常,但到达某一级国际出口网关后突然100%丢包,且后续所有跳都显示”???”,那么很可能是在该出口节点被GFW拦截了。

4. 使用curl测试HTTP/HTTPS连通性
有时候Web服务能正常访问,但SSH被封了。或者反过来。用curl可以精确测试HTTP层面的连通性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 # 测试HTTP连接(带详细日志)
curl -v --connect-timeout 10 -o /dev/null http://your_vps_ip/
# 测试HTTPS连接(跳过证书验证)
curl -v --connect-timeout 10 -k -o /dev/null https://your_vps_ip/
# 测试指定端口
curl -v --connect-timeout 10 -o /dev/null http://your_vps_ip:8080/
# 强制使用IPv4
curl -4 -v --connect-timeout 10 -o /dev/null https://your_vps_ip/
# 使用nslookup检查DNS是否被污染
nslookup your_domain.com 8.8.8.8
nslookup your_domain.com 114.114.114.114
如果nslookup返回的IP和实际VPS IP不一致,说明DNS被污染了(这和IP被墙是两个不同的问题,但经常同时发生)。
三、TCP阻断与UDP封锁的精确诊断
当基础检测确认IP存在连通性问题时,需要进一步精确诊断是TCP阻断还是UDP封锁,这决定了后续的恢复策略。
1. TCP阻断验证流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # 步骤1:确认ICMP正常
ping -c 5 your_vps_ip
# 预期:正常返回延迟
# 步骤2:测试多个TCP端口
for port in 22 80 443 8080 8443; do
echo -n "Port $port: "
timeout 5 bash -c "echo >/dev/tcp/your_vps_ip/$port" 2>&1 && echo "OPEN" || echo "BLOCKED"
done
# 步骤3:从VPS反向测试(通过服务商VNC登录VPS后执行)
# 在VPS上安装nc
apt install -y ncat # 或 nmap-ncat
# VPS端监听
nc -l 9999
# 本地连接测试
nc your_vps_ip 9999
# 步骤4:使用不同协议端口交叉验证
# 如果所有TCP端口都超时,但ICMP和UDP正常 → 确认TCP阻断
2. UDP阻断验证流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # 步骤1:确认TCP正常
tcping your_vps_ip 443
# 预期:正常连接
# 步骤2:测试UDP DNS解析
dig @your_vps_ip google.com
# 如果超时,可能是UDP 53被封
# 步骤3:测试WireGuard UDP端口
# 在VPS上启动WireGuard,本地尝试连接
wg-quick up wg0 # VPS端
wg-quick up wg0 # 本地端
wg show # 查看握手状态
# 步骤4:使用iperf3测试UDP带宽
# VPS端
iperf3 -s
# 本地端(UDP模式)
iperf3 -c your_vps_ip -u -b 10M -t 10
# 步骤5:使用nc测试UDP
# VPS端
nc -u -l 9999
# 本地端
nc -u your_vps_ip 9999
# 输入文字,看对方是否收到
如果TCP全部正常,但所有UDP测试都超时,则确认是UDP阻断。这种情况下,你的Web服务不受影响,但WireGuard、OpenVPN(UDP模式)等VPN工具会完全失效。
3. 间歇性丢包的检测方法
间歇性丢包是最难诊断的情况。需要长时间持续测试才能确认:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 # 长时间ping测试,统计丢包率
ping -c 100 your_vps_ip | tail -5
# 关注 packet loss 字段
# 使用mtr持续监测
mtr -n -T -P 443 -c 100 --report your_vps_ip
# 使用smokeping持续监控(适合长期监测)
# 安装smokeping
apt install -y smokeping
# 配置 Targets 文件
cat >> /etc/smokeping/config.d/Targets << 'EOF'
+ VPS
menu = VPS Monitoring
title = VPS IP Monitoring
++ MyVPS
menu = My VPS
title = My VPS IP
host = your_vps_ip
EOF
# 重启smokeping
systemctl restart smokeping
如果丢包率稳定在40%-80%之间,且持续时间超过24小时,基本可以确认是GFW的软封锁。这种封锁通常不会自动解除,需要更换IP。
四、IP被墙后的恢复方案
确认IP被墙后,需要根据封锁类型和业务需求选择合适的恢复方案。以下方案按推荐优先级排列。
方案1:更换IP(最直接有效)
换IP是最彻底的解决方案。不同服务商的换IP方式和成本不同:
| 服务商 | 换IP方式 | 费用 | 耗时 |
|---|---|---|---|
| Vultr | 删除实例重建(保留快照) | 免费 | 5分钟 |
| Hetzner | 重新分配IP(需工单) | €1/月 | 1-3天 |
| Oracle Cloud | 删除实例重建 | 免费 | 10分钟 |
| AWS | 释放EIP重新分配 | 免费 | 即时 |
| DigitalOcean | 删除重建或工单申请 | 免费 | 5分钟 |
| BandwagonHost | 后台一键换IP | $8.79/次 | 即时 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # Vultr换IP操作流程:
# 1. 创建快照
vultr-cli snapshot create --instance-id INSTANCE_ID --description "backup-before-ip-change"
# 2. 等待快照完成
vultr-cli snapshot list
# 3. 删除旧实例(释放旧IP)
vultr-cli instance delete INSTANCE_ID
# 4. 从快照创建新实例(自动分配新IP)
vultr-cli instance create --snapshot-id SNAP_ID --region SEA --plan vc2-1c-1gb
# 5. 验证新IP连通性
ping -c 5 NEW_IP
tcping NEW_IP 22
# Oracle Cloud换IP流程:
# 1. 通过Web Console终止实例
# 2. 重新创建实例(Always Free配额会释放)
# 3. 获取新公网IP
# 注意:Oracle Always Free实例重建后IP会变化
方案2:使用Cloudflare CDN兜底(不换IP)
如果不想换IP(比如IP绑定了很多DNS记录),可以使用Cloudflare CDN来”隐藏”被墙的IP。CDN节点的IP是干净的,用户通过CDN访问网站,不再直接连接VPS的原始IP。如果你还需要更高级的内网穿透方案,可以参考Cloudflare Tunnel内网穿透完整方案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 # Cloudflare CDN配置步骤:
# 1. 在Cloudflare添加域名
# 2. 将DNS解析指向VPS IP,开启代理(橙色云朵)
# 3. 确保VPS的443端口对Cloudflare IP段开放
# 获取Cloudflare IP段并配置防火墙白名单
# 下载Cloudflare官方IP列表
curl -s https://www.cloudflare.com/ips-v4 -o cf_ipv4.txt
curl -s https://www.cloudflare.com/ips-v6 -o cf_ipv6.txt
# 配置iptables只允许Cloudflare访问443端口
# 清理旧规则
iptables -F INPUT
# 允许SSH(确保不会把自己锁在外面)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许Cloudflare IP访问443端口
while read ip; do
iptables -A INPUT -p tcp --dport 443 -s "$ip" -j ACCEPT
done < cf_ipv4.txt
# 拒绝其他所有443访问
iptables -A INPUT -p tcp --dport 443 -j DROP
# 允许ICMP
iptables -A INPUT -p icmp -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
重要提醒:开启Cloudflare代理后,确保在SSL/TLS设置中选择”Full (Strict)”模式,并安装Origin Certificate。如果原始IP已经暴露过(曾经直接解析过),建议同时更换IP,因为GFW可能已经记录了域名与IP的关联。
方案3:通过中转/隧道恢复SSH访问
如果IP被墙导致SSH无法连接,但Web服务通过CDN恢复了,你还需要解决SSH管理问题。可以通过一个未被墙的中转服务器建立隧道。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 # 方案A:使用未被墙的VPS做SSH跳板
# 在中转VPS上配置SSH隧道
ssh -L 2222:被墙VPS_IP:22 user@中转VPS_IP
# 然后通过本地连接
ssh -p 2222 user@127.0.0.1
# 方案B:使用Cloudflare Tunnel(推荐,免费)
# 在被墙VPS上通过VNC/控制台安装cloudflared
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64
mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
# 登录(需要浏览器授权)
cloudflared tunnel login
# 创建隧道
cloudflared tunnel create ssh-tunnel
# 配置隧道路由
cloudflared tunnel route dns ssh-tunnel ssh.yourdomain.com
# 配置cloudflared
cat > ~/.cloudflared/config.yml << EOF
tunnel: ssh-tunnel
credentials-file: /root/.cloudflared/ssh-tunnel.json
ingress:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
- service: http_status:404
EOF
# 启动隧道
cloudflared tunnel run ssh-tunnel
# 本地通过Cloudflare访问SSH
# 需要本地也安装cloudflared
cloudflared access ssh --hostname ssh.yourdomain.com
# 方案C:使用WireGuard over TCP
# 在中转VPS上部署WireGuard(TCP模式,因为UDP可能也被封)
# 安装udp2raw将UDP转TCP
apt install -y udp2raw
# VPS端(被墙)
udp2raw -s -l 0.0.0.0:4096 -r 127.0.0.1:51820 --cipher aes128cbc --auth md5 -k "your_password" --raw-mode faketcp
# 中转VPS端
udp2raw -c -l 0.0.0.0:51820 -r 被墙VPS_IP:4096 --cipher aes128cbc --auth md5 -k "your_password" --raw-mode faketcp
# 然后本地WireGuard连接中转VPS的51820端口

五、UDP被墙的特殊恢复方案
如果只是UDP被封(TCP正常),Web服务不受影响,但WireGuard等VPN工具会失效。这种情况有几种针对性的解决方案。
1. WireGuard切换到TCP模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # 使用wstunnel将WireGuard的UDP流量封装在WebSocket(TCP)中
# VPS端安装wstunnel
wget https://github.com/erebe/wstunnel/releases/latest/download/wstunnel-linux-amd64
chmod +x wstunnel-linux-amd64
mv wstunnel-linux-amd64 /usr/local/bin/wstunnel
# VPS端启动wstunnel服务端(监听443端口)
wstunnel server wss://0.0.0.0:443
# 本地端启动wstunnel客户端
wstunnel client -L 51820:127.0.0.1:51820 wss://your_vps_domain:443
# 修改WireGuard配置,连接本地wstunnel
# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = your_private_key
Address = 10.0.0.2/24
[Peer]
PublicKey = your_server_public_key
Endpoint = 127.0.0.1:51820 # 连接本地wstunnel
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
2. DNS over HTTPS/TCP替代UDP DNS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 # 如果UDP 53被墙,DNS解析会出问题
# 解决方案:使用DNS over TCP或DNS over HTTPS
# 修改systemd-resolved配置
cat > /etc/systemd/resolved.conf << 'EOF'
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4 1.0.0.1
DNSOverTLS=opportunistic
DNSOverTLS=yes
# 使用TCP进行DNS查询
DNS=8.8.8.8:53
EOF
# 重启resolved服务
systemctl restart systemd-resolved
# 或者直接使用dnscrypt-proxy
apt install -y dnscrypt-proxy
# 配置使用DoH
cat > /etc/dnscrypt-proxy/dnscrypt-proxy.toml << 'EOF'
server_names = ['cloudflare', 'google']
listen_addresses = ['127.0.0.1:53']
doh_servers = true
require_dnssec = true
EOF
systemctl restart dnscrypt-proxy
六、IP被墙的预防措施
预防胜于治疗。以下措施可以大幅降低IP被墙的概率。
1. 域名始终走CDN,不暴露原始IP
这是最重要的一条预防措施。从建站第一天起,就将域名通过Cloudflare代理,DNS解析只返回CDN节点IP,永远不暴露VPS原始IP。
1
2
3
4
5
6
7
8
9
10
11
12
13 # 检查域名是否正确隐藏了原始IP
# 应返回Cloudflare的IP,而不是VPS真实IP
dig +short yourdomain.com
nslookup yourdomain.com
# 检查是否有历史DNS记录泄露IP
# 访问 https://search.censys.io 搜索你的域名
# 访问 https://securitytrails.com 查看DNS历史记录
# 如果IP已泄露,需要:
# 1. 更换VPS IP
# 2. 清理所有直接解析到旧IP的DNS记录
# 3. 确保所有子域名都开启Cloudflare代理
2. SSH端口改为非标准端口并限制来源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # 修改SSH端口
sed -i 's/^#Port 22/Port 58923/' /etc/ssh/sshd_config
systemctl restart sshd
# 配置防火墙限制SSH来源
# 只允许特定IP访问SSH
iptables -A INPUT -p tcp --dport 58923 -s YOUR_HOME_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 58923 -j DROP
# 或者使用SSH密钥+禁用密码登录
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
# 使用fail2ban防止SSH爆破
apt install -y fail2ban
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 58923
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
systemctl restart fail2ban
3. 避免在VPS上运行敏感服务
某些服务容易触发GFW的封锁机制,建议避免在用于建站的VPS上同时运行这些服务:
- 代理/VPN服务(SS、V2Ray、Trojan等)——这是IP被墙的头号原因
- BT/PT下载——大量UDP流量可能触发封锁
- 爬虫服务——高频请求可能被目标网站举报
- 电报机器人代理——部分Telegram MTProto代理协议容易被识别
最佳实践是将建站VPS和代理VPS分开部署。建站VPS只运行Web服务和必要的SSH管理,保持IP干净。代理服务部署在另一台VPS上,即使被封也不影响网站。
4. 定期监控IP连通性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 # 创建IP连通性监控脚本
cat > /root/ip_monitor.sh << 'SCRIPT'
#!/bin/bash
IP=$(curl -s ifconfig.me)
LOG="/var/log/ip_monitor.log"
echo "[$(date)] Checking IP: $IP" >> $LOG
# 测试TCP 443连通性(从外部测试需要另一台机器)
# 这里测试本地服务是否正常
if curl -s --connect-timeout 5 -o /dev/null -w "%{http_code}" http://localhost:80 | grep -q "200\|301\|302"; then
echo "[$(date)] Local HTTP: OK" >> $LOG
else
echo "[$(date)] Local HTTP: FAIL" >> $LOG
fi
# 通过外部API检测IP是否被墙
RESULT=$(curl -s --connect-timeout 10 "https://ip.ping0.cc/ip/$IP")
echo "[$(date)] External check: $RESULT" >> $LOG
SCRIPT
chmod +x /root/ip_monitor.sh
# 添加定时任务,每小时检测一次
(crontab -l 2>/dev/null; echo "0 * * * * /root/ip_monitor.sh") | crontab -
# 推荐使用UptimeRobot(https://uptimerobot.com)免费监控
# 设置HTTP监控,5分钟检测一次
# 设置后如果IP被墙会立即收到邮件通知
七、总结与快速排查清单
VPS IP被墙是一个常见但可以系统化应对的问题。核心排查流程总结如下:
- 确认现象:ping通但SSH/Web超时 → 疑似TCP阻断
- 交叉验证:用itdog.cc测试全国三网连通性,确认是否运营商选择性屏蔽
- 路由分析:用mtr -T模式追踪TCP路由,定位丢包节点
- 选择方案:换IP(最彻底)/ CDN兜底(不换IP)/ 隧道中转(恢复SSH)
- 预防复发:域名走CDN、SSH改端口+密钥、建站与代理分开部署
记住一个关键原则:建站VPS的IP是你最宝贵的资产之一。一旦IP被墙,不仅要承受服务中断的损失,恢复过程也耗时费力。从第一天起就做好IP保护(CDN代理+不暴露真实IP),比事后修复要容易得多。
如果你正在寻找稳定的VPS线路,建议优先考虑支持免费换IP的服务商(如Vultr、Oracle Cloud),同时做好Cloudflare CDN兜底。这样即使IP不幸被墙,也能在最短时间内恢复服务。
汤不热吧