0%

🚀 完美解决:阿里云服务器部署 Tailscale 导致的 OSS / 内网服务连接超时

🚀 完美解决:阿里云服务器部署 Tailscale 导致的 OSS / 内网服务连接超时

适用环境:

  • 操作系统: 主流 Linux 发行版(Ubuntu 20.04+, Debian 10+, CentOS 7+ 等)
  • Tailscale 版本: v1.x 及以上
  • 症状: 安装 Tailscale 后,阿里云内部服务(如 OSS 内网备份、元数据服务、云助手等)出现 i/o timeout 报错。

🔍 问题背景

Tailscale 默认使用保留的 CGNAT 网段 100.64.0.0/10 分配节点 IP。启动时,它会通过高优先级策略路由(ip rule 表 52)接管该网段的所有流量。

冲突点: 阿里云的大量核心内网服务(DNS、NTP、OSS 内网 Endpoint)恰恰也使用的是 100.100.x.x100.115.x.x。这导致发往阿里云内网的数据包被错误地路由到了 Tailscale 的虚拟网卡(tailscale0),变成了“网络黑洞”,从而引发超时。

💡 解决思路

利用优先级更高的策略路由(Priority 5200),抢在 Tailscale 拦截之前,将目标为阿里云内网网段的流量强行“拨回”给服务器的真实物理网卡和默认网关。


🛠️ 修复步骤 (保姆级)

第一步:获取本机的真实网络信息

在动手之前,你需要查清楚服务器的内网网关和本机内网 IP。

在终端执行:

1
ip route show default

示例输出:
default via 192.168.1.253 dev eth0 proto dhcp src 192.168.1.10 ...

请记录下这两个关键 IP:

  1. 网关 IP (via 后面的地址,例:192.168.1.253)
  2. 本机 IP (src 后面的地址,例:192.168.1.10)

第二步:创建自动化修复脚本

我们将通过 /etc/rc.local 确保规则在每次重启后自动生效。脚本具备幂等性设计,多次执行不会产生冲突。

使用编辑器(如 vimnano)编辑 /etc/rc.local,或直接运行以下命令块(⚠️ 务必将前两行替换为你刚才查到的 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
30
31
32
33
34
35
cat << 'EOF' | sudo tee /etc/rc.local
#!/bin/bash
# --- 阿里云 & Tailscale 共存专用配置 ---

# 1. 变量设置 (❗请替换为你自己的内网IP和网关)
GW_IP="<YOUR_VPC_GATEWAY_IP>" # 例如: 192.168.1.253
ETH_IP="<YOUR_SERVER_PRIVATE_IP>" # 例如: 192.168.1.10

# -------------------------------------------------------
# 规则组 1:放行阿里云核心内网 (DNS/元数据/云助手)
# -------------------------------------------------------
# 添加高优先级 (5200) 策略路由插队
ip rule del to 100.100.0.0/16 lookup main priority 5200 2>/dev/null
ip rule add to 100.100.0.0/16 lookup main priority 5200

# 路由指路 (replace 指令强制走物理网卡)
ip route replace 100.100.0.0/16 via \$GW_IP dev eth0 src \$ETH_IP

# -------------------------------------------------------
# 规则组 2:放行阿里云 OSS 内网 Endpoint (以广州地域为例)
# -------------------------------------------------------
ip rule del to 100.115.33.0/24 lookup main priority 5200 2>/dev/null
ip rule add to 100.115.33.0/24 lookup main priority 5200
ip route replace 100.115.33.0/24 via \$GW_IP dev eth0 src \$ETH_IP

# -------------------------------------------------------
# 防火墙设置 (避免多次运行导致规则堆叠)
# -------------------------------------------------------
iptables -t filter -C OUTPUT -d 100.0.0.0/8 -j ACCEPT 2>/dev/null || iptables -t filter -I OUTPUT 1 -d 100.0.0.0/8 -j ACCEPT
iptables -t filter -C INPUT -s 100.0.0.0/8 -j ACCEPT 2>/dev/null || iptables -t filter -I INPUT 1 -s 100.0.0.0/8 -j ACCEPT
iptables -t nat -C POSTROUTING -d 100.0.0.0/8 -j ACCEPT 2>/dev/null || iptables -t nat -I POSTROUTING 1 -d 100.0.0.0/8 -j ACCEPT
iptables -t mangle -C OUTPUT -d 100.0.0.0/8 -j ACCEPT 2>/dev/null || iptables -t mangle -I OUTPUT 1 -d 100.0.0.0/8 -j ACCEPT

exit 0
EOF

第三步:赋予执行权限并使规则生效

依次执行以下命令:

1
2
3
4
5
6
7
8
# 赋予脚本执行权限
sudo chmod +x /etc/rc.local

# 重启 rc-local 服务应用规则
sudo systemctl restart rc-local

# 检查服务状态(确认没有报错)
sudo systemctl status rc-local

第四步:最终验证

配置完成后,通过以下方式验证流量是否已成功绕过 Tailscale:

  1. 查询路由走向:

    1
    ip route get 100.115.33.43

    预期输出应包含 via <YOUR_VPC_GATEWAY_IP> dev eth0

  2. 端口连通性实测:

    1
    telnet 100.115.33.43 443

    如果显示 Connected to ...,表示网络冲突已彻底解决!