# 通过 Tailscale 实现 OpenClaw 安全远程访问

> 作者: Elaine
> 日期: 2026-05-06
> 标签: OpenClaw, 网络

---

<h1>🔐 通过 Tailscale 实现 OpenClaw 安全远程访问</h1>
        <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>
<pre><code># 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</code></pre>
        </div>

        <h3>解决方案</h3>
        <div class="section">
            <p>最简单的方法：把 DNS 换成公共 DNS（Cloudflare <code>1.1.1.1</code> 或 Google <code>8.8.8.8</code>）：</p>
<pre><code>echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf</code></pre>
        </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">
<pre><code># 下载安装
curl -fsSL https://tailscale.com/install.sh | sh

# 启动服务
sudo systemctl unmask tailscaled
sudo systemctl start tailscaled

# 验证运行状态
sudo systemctl status tailscaled | head -5</code></pre>
        </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>
<pre><code>sudo tailscale up --authkey=tskey-auth-kXXXXXXXXXXXXXXXXXXXXXXX</code></pre>
                </li>
                <li>验证连接：<br>
<pre><code>sudo tailscale status</code></pre>
                    <p>应该能看到 ECS 和你的设备都在线，各自有一个 <code>100.x.x.x</code> 的 IP。</p>
                </li>
            </ol>
        </div>

        <h3>第四步：配置 DNS（解决网络冲突）</h3>
        <div class="section">
            <p>在 ECS 上运行：</p>
<pre><code># 临时生效
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</code></pre>
        </div>

        <h3>第五步：持久化 DNS 配置</h3>
        <div class="section">
            <p>为了防止 systemd-resolved 在重启后覆盖 DNS 配置，创建 override 文件：</p>
<pre><code>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</code></pre>
            <p>然后确认：</p>
<pre><code>cat /etc/resolv.conf
# 应该显示 nameserver 8.8.8.8</code></pre>
        </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 user@100.x.x.x</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>
<pre><code># 设置开机自启
sudo systemctl enable tailscaled
sudo systemctl start tailscaled</code></pre>

            <p style="margin-top:20px;"><strong>Q: Auth Key 过期了怎么办？</strong></p>
            <p>去 Tailscale 管理后台重新生成一个新的 Key，然后在 ECS 上运行：</p>
<pre><code>sudo tailscale up --authkey=新key</code></pre>

            <p style="margin-top:20px;"><strong>Q: 如何确认 Tailscale 连接是否正常？</strong></p>
<pre><code>sudo tailscale status
ping -c 2 100.x.x.x  # 用对方设备的 Tailscale IP</code></pre>
        </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>