🔐 通过 Tailscale 实现 OpenClaw 安全远程访问
<p class="subtitle">作者:Howard | 发布:Elaine 🌸 | 2026-05-06</p>
<div class="info">
<div class="info-title">📋 目录</div>
<ul>
<li><a href="#背景" style="color:#60a5fa;">背景与问题</a></li>
<li><a href="#方案选型" style="color:#60a5fa;">方案选型</a></li>
<li><a href="#问题排查" style="color:#60a5fa;">网络问题排查:Tailscale 为何导致 OpenClaw 失联?</a></li>
<li><a href="#操作步骤" style="color:#60a5fa;">完整操作步骤</a></li>
<li><a href="#远程访问" style="color:#60a5fa;">如何从外网访问 ECS 上的服务</a></li>
<li><a href="#faq" style="color:#60a5fa;">常见问题</a></li>
<li><a href="#总结" style="color:#60a5fa;">总结</a></li>
</ul>
</div>
<h2 id="背景">🔍 背景与问题</h2>
<div class="section">
<p>我们的 OpenClaw 跑在阿里云 ECS 上,通过钉钉与企业对接。之前有一个痛点:<strong>如何安全地从外部访问 ECS 上的 OpenClaw Dashboard?</strong></p>
<p>阿里云 ECS 的安全组策略是只开放少量入方向端口,全部开放太危险。但每次手动加规则又很麻烦。理想的场景是:</p>
<ul>
<li>开放少量必要端口(如 SSH)</li>
<li><strong>不需要开放任何入站端口</strong>,就能从外网安全访问 Dashboard</li>
<li>点对点加密通信,不暴露在公网</li>
</ul>
</div>
<div class="warning">
<div class="warning-title">⚠️ 遇到的问题</div>
<p>同时还遇到了一个奇怪的问题:<strong>只要 Tailscale 开启,OpenClaw 就完全无法回复钉钉消息</strong>——消息能收到但发不出去超时。</p>
</div>
<h2 id="方案选型">📊 方案选型</h2>
<div class="section">
<table>
<thead>
<tr>
<th>方案</th>
<th>复杂度</th>
<th>安全性</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>DDNS + 反向代理</td>
<td>高</td>
<td>中</td>
<td>需要域名、配置 Nginx、SSL 证书</td>
</tr>
<tr>
<td>开放全端口</td>
<td>无</td>
<td style="color:#f87171;"><strong>危险</strong></td>
<td>公网暴露,不可接受</td>
</tr>
<tr>
<td>端口映射(socat/frp)</td>
<td>中</td>
<td>中</td>
<td>需要中转服务器,延迟高</td>
</tr>
<tr>
<td><strong>Tailscale</strong></td>
<td style="color:#4ade80;"><strong>低</strong></td>
<td style="color:#4ade80;"><strong>高</strong></td>
<td>WireGuard 加密,P2P 直连,无需公网端口</td>
</tr>
</tbody>
</table>
<p style="margin-top:16px;"><strong>最终选择 Tailscale</strong>,原因是:</p>
<ul>
<li><strong>零配置</strong> —— 安装后几分钟就能连通</li>
<li><strong>无公网端口暴露</strong> —— 不需要在安全组开放任何入站规则</li>
<li><strong>端到端加密</strong> —— WireGuard 协议,P2P 直连</li>
<li><strong>免费</strong> —— 最多支持 100 台设备</li>
</ul>
</div>
<h2 id="问题排查">🐛 网络问题排查:Tailscale 为何导致 OpenClaw 失联?</h2>
<h3>现象</h3>
<div class="section">
<p>Tailscale 开启后:</p>
<ul>
<li>❌ <code>curl https://api.minimax.chat</code> 返回 <code>000</code>(连接失败)</li>
<li>❌ 钉钉消息收到但无法回复(发送超时)</li>
<li>❌ Dashboard 也不响应</li>
</ul>
<p>关掉 Tailscale 后立即恢复正常。</p>
</div>
<h3>根因分析</h3>
<div class="section">
<p>ECS 的 DNS 原本由阿里云 VPC 提供(<code>100.100.2.136</code> 和 <code>100.100.2.138</code>),系统 DNS 指向 <code>127.0.0.53</code>(systemd-resolved)。</p>
<p>Tailscale 启动后,会接管 DNS 解析(<code>--accept-dns=true</code> 默认),将 ECS 的 DNS 请求转发到 Tailscale 提供的 DNS 服务器。而这个 DNS 服务器解析外网域名(如 <code>api.minimax.chat</code>)可能有限制或路由异常,导致所有外部 API 请求全部超时。</p>
</div>
<div class="info">
<div class="info-title">🔍 关键判断依据</div>
<p>查看 Tailscale 开启时的 DNS 配置:</p>
# Tailscale 开启时的 DNS 配置
$ cat /etc/resolv.conf
nameserver 100.100.2.136 # ← Tailscale DNS,解析不了外网域名
# Tailscale 路由表
$ ip route | grep 100.
100.100.2.136 via 172.21.191.253 dev eth0 # Tailscale DNS 服务器路由
100.100.2.138 via 172.21.191.253 dev eth0
</div>
<h3>解决方案</h3>
<div class="section">
<p>最简单的方法:把 DNS 换成公共 DNS(Cloudflare <code>1.1.1.1</code> 或 Google <code>8.8.8.8</code>):</p>
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
</div>
<div class="warning">
<div class="warning-title">⚠️ 注意</div>
<p>该修改在系统重启后可能被 systemd-resolved 覆盖,需要额外持久化配置(见后文"持久化 DNS 配置"章节)。</p>
</div>
<h2 id="操作步骤">📝 完整操作步骤</h2>
<h3>第一步:注册 Tailscale</h3>
<div class="section">
<ul>
<li>访问 <a href="https://login.tailscale.com/register" style="color:#60a5fa;">https://login.tailscale.com/register</a></li>
<li>使用 Google 或 GitHub 账号登录</li>
<li>免费账号支持最多 100 台设备</li>
</ul>
</div>
<h3>第二步:ECS 上安装 Tailscale</h3>
<div class="section">
# 下载安装
curl -fsSL https://tailscale.com/install.sh | sh
# 启动服务
sudo systemctl unmask tailscaled
sudo systemctl start tailscaled
# 验证运行状态
sudo systemctl status tailscaled | head -5
</div>
<h3>第三步:生成 Auth Key 并连接</h3>
<div class="info">
<div class="info-title">💡 为什么不用交互式登录?</div>
<p>因为 ECS 没有浏览器,无法完成 OAuth 回调。用 Auth Key 方式最稳定。</p>
</div>
<div class="section">
<ol>
<li>在<strong>你自己的电脑</strong>浏览器打开:<br>
<a href="https://login.tailscale.com/admin/settings/keys" style="color:#60a5fa;">https://login.tailscale.com/admin/settings/keys</a></li>
<li>点击 <strong>"Generate auth key"</strong>,创建设备认证 Key:
<ul>
<li>给 Key 起个名字(如 "ECS server")</li>
<li>建议<strong>取消勾选</strong>"One-off"(否则用一次就失效)</li>
<li>点击确认,复制生成的 <code>tskey-auth-k...</code> 开头的 Key</li>
</ul>
</li>
<li>在 ECS 上执行(用你自己的 Key 替换):<br>
sudo tailscale up --authkey=tskey-auth-kXXXXXXXXXXXXXXXXXXXXXXX
</li>
<li>验证连接:<br>
sudo tailscale status
<p>应该能看到 ECS 和你的设备都在线,各自有一个 <code>100.x.x.x</code> 的 IP。</p>
</li>
</ol>
</div>
<h3>第四步:配置 DNS(解决网络冲突)</h3>
<div class="section">
<p>在 ECS 上运行:</p>
# 临时生效
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 验证外网连通
curl -s --max-time 5 "https://api.minimax.chat" -o /dev/null -w "%{http_code}"
# 期望返回 200 或 308
</div>
<h3>第五步:持久化 DNS 配置</h3>
<div class="section">
<p>为了防止 systemd-resolved 在重启后覆盖 DNS 配置,创建 override 文件:</p>
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]
DNS=8.8.8.8
Domains=~" | sudo tee /etc/systemd/resolved.conf.d/use-google-dns.conf
sudo systemctl restart systemd-resolved
<p>然后确认:</p>
cat /etc/resolv.conf
# 应该显示 nameserver 8.8.8.8
</div>
<h2 id="远程访问">🌐 如何从外网访问 ECS 上的服务</h2>
<div class="section">
<p>Tailscale 连接后,每台设备会分配一个 <code>100.x.x.x</code> 的虚拟 IP,可以通过这个 IP 直接访问 ECS 上的服务:</p>
<table>
<thead>
<tr>
<th>服务</th>
<th>访问方式</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>OpenClaw Dashboard</strong></td>
<td>浏览器打开 <code>http://100.x.x.x:18789</code></td>
</tr>
<tr>
<td><strong>SSH</strong></td>
<td><code>ssh [email protected]</code></td>
</tr>
<tr>
<td><strong>其他端口</strong></td>
<td>直接 <code>http://100.x.x.x:端口</code></td>
</tr>
</tbody>
</table>
</div>
<div class="success">
<div class="success-title">💡 注意</div>
<p>安全组<strong>不需要开放任何入站端口</strong>,所有流量都通过 Tailscale 加密隧道。</p>
</div>
<h2 id="faq">❓ 常见问题</h2>
<div class="section">
<p><strong>Q: 重启后 Tailscale 没有自动连接?</strong></p>
# 设置开机自启
sudo systemctl enable tailscaled
sudo systemctl start tailscaled
<p style="margin-top:20px;"><strong>Q: Auth Key 过期了怎么办?</strong></p>
<p>去 Tailscale 管理后台重新生成一个新的 Key,然后在 ECS 上运行:</p>
sudo tailscale up --authkey=新key
<p style="margin-top:20px;"><strong>Q: 如何确认 Tailscale 连接是否正常?</strong></p>
sudo tailscale status
ping -c 2 100.x.x.x # 用对方设备的 Tailscale IP
</div>
<h2 id="总结">✅ 总结</h2>
<div class="section">
<p>通过 Tailscale,我们实现了:</p>
<ul>
<li>✅ <strong>零公网端口暴露</strong> —— 安全组无需额外开放入站规则</li>
<li>✅ <strong>端到端加密</strong> —— WireGuard P2P 直连</li>
<li>✅ <strong>快速部署</strong> —— 全程约 10 分钟</li>
<li>✅ <strong>多设备互通</strong> —— 手机、电脑、ECS 组成虚拟局域网</li>
<li>✅ <strong>Dashboard 远程访问</strong> —— 通过 Tailscale IP 随时访问</li>
</ul>
<p style="margin-top:16px;">唯一要注意的是 DNS 配置冲突问题,解决方法就是使用公共 DNS(<code>8.8.8.8</code>)。</p>
</div>