# Tailscale + 本地 MySQL 统一落地手册 ## 1. 目标 把本地 Windows 上的 MySQL 通过 Tailscale 提供给你自己的其他主机和同事主机使用,并保留一台云主机作为链路兜底。 这份文档收敛以下三类内容: 1. 本地数据库机安装与放通 2. 云主机 Tailscale relay 部署 3. 远端主机接入、验证、连库和排障 ## 2. 当前已落地环境 截至 `2026-07-02`,当前实际跑通的信息如下: - 本地数据库机主机名:`DESKTOP-9KO3IVK` - 本地数据库机 Tailscale IP:`100.100.67.109` - 本地数据库机 MySQL 监听:`0.0.0.0:3306` - 云主机节点名:`ts-relay-01` - 云主机 Tailscale IP:`100.99.117.43` - 云主机公网 IP:`124.221.105.128` - MagicDNS 后缀:`tail6e2c27.ts.net` 当前已经确认过: 1. `DESKTOP-9KO3IVK` 在线 2. `ts-relay-01` 在线 3. 本地 MySQL 正在监听 `3306` 4. `root@'%'` 已存在,可用于你自己 tailnet 内部的临时管理连接 ## 3. 链路拓扑 ```text 远端主机 | | 优先直连 v 本地数据库机 (Windows + MySQL + Tailscale) ^ | 直连失败时走 peer relay | 云主机 (CentOS 7 + Tailscale relay) ``` 说明: 1. 优先走直连 2. 直连失败时优先走你自己的云主机 relay 3. relay 也不可用时,Tailscale 会退回 DERP 4. 这套方案解决的是可达性和稳定性,不会突破本地上行带宽上限 ## 4. 方案选择 ### 4.1 你自己的另一台主机 推荐做法: 1. 直接加入同一个 tailnet 2. 如果想让另一台机器上的 Codex 自动完成接入,使用 `auth key` 3. 如果没有 `auth key`,就执行 `tailscale up`,再人工点一次网页授权 适用场景: - 这台机器属于你自己 - 你接受它算作你自己账号下的设备 ### 4.2 同事的 Windows 主机 推荐做法: 1. 在 Tailscale 后台邀请同事加入同一个 tailnet 2. 同事用自己的 Tailscale 账号登录 3. 同事机器上的 Codex 完成安装和命令执行 4. 同事本人通常只需要做一次网页授权确认 不推荐直接用你的 `auth key` 把同事机器接入,除非你明确接受: 1. 这台设备算你统一代管 2. 设备身份默认偏向生成 key 的用户或 tag ## 5. 先决条件 开始前先确认: 1. 你有可登录的 Tailscale 账号 2. 本地数据库机可安装 Tailscale 3. 云主机安全组可放行 `UDP 40000` 4. 远端机器也能安装 Tailscale 5. 客户端尽量使用 `1.86+` ## 6. Tailscale 后台准备 ### 6.1 用户组织 建议: 1. 你自己保留管理员账号 2. 同事各自使用自己的 Tailscale 账号 3. 不要多人共用一个 Tailscale 账号 ### 6.2 Access controls 在 Tailscale 后台 `Access controls` 中合并类似配置: ```json { "groups": { "group:db-users": [ "你的Tailscale登录邮箱", "同事1邮箱", "同事2邮箱", "同事3邮箱" ] }, "tagOwners": { "tag:relay": ["你的Tailscale登录邮箱"] }, "acls": [ { "action": "accept", "src": ["group:db-users"], "dst": ["100.100.67.109:3306"] } ] } ``` 说明: 1. `group:db-users` 是可访问数据库的用户组 2. `tag:relay` 用于云主机 relay 3. 这里的数据库目标地址已经写成当前真实地址 `100.100.67.109` ### 6.3 auth key 使用原则 建议: 1. 给你自己的新增主机使用 `one-off` 或可复用 `auth key` 2. 给云主机使用单独的 `auth key` 3. 不把旧的、可能已消费的 `one-off key` 当成长期文档常量 ## 7. 本地数据库机配置 以下步骤适用于 `DESKTOP-9KO3IVK`。 ### 7.1 安装并登录 Tailscale 下载安装: - Windows: 安装后登录当前 tailnet。 ### 7.2 查看本机 Tailscale IP ```powershell & "C:\Program Files\Tailscale\tailscale.exe" ip -4 ``` 当前实际值: ```text 100.100.67.109 ``` ### 7.3 检查 Tailscale 状态 ```powershell & "C:\Program Files\Tailscale\tailscale.exe" status ``` ### 7.4 检查 MySQL 监听 ```powershell Get-CimInstance Win32_Service | Where-Object { $_.Name -eq "MySQL" } | Format-List Name,State,PathName Get-NetTCPConnection -LocalPort 3306 -State Listen | Format-Table -AutoSize ``` 当前预期: 1. 服务为 `Running` 2. `3306` 正在监听 3. 当前监听为 `0.0.0.0:3306` ### 7.5 放行 Windows 防火墙 建议仅放行 Tailscale 网段: ```powershell New-NetFirewallRule -DisplayName "MySQL 3306 from Tailscale" ` -Direction Inbound -Action Allow -Protocol TCP ` -LocalPort 3306 -RemoteAddress 100.64.0.0/10 ``` 检查历史规则: ```powershell Get-NetFirewallRule | Where-Object { $_.DisplayName -match "3306|MySQL" } ``` ### 7.6 MySQL 账号策略 当前事实: 1. `root@'%'` 已放开 2. 适合你自己 tailnet 内部临时管理 长期建议: 1. 不长期用 `root` 做业务连接 2. 为同事或迁移工具单独建账号 3. 按用途分权限,默认先给只读 示例: ```sql CREATE USER 'ts_trading_u1'@'100.101.102.103' IDENTIFIED BY '请替换成强密码1'; GRANT SELECT ON trading_xuntou.* TO 'ts_trading_u1'@'100.101.102.103'; FLUSH PRIVILEGES; ``` ## 8. 云主机 relay 配置 以下步骤适用于 `124.221.105.128`。 ### 8.1 放行安全组 放行: - 协议:`UDP` - 端口:`40000` ### 8.2 安装 Tailscale ```bash curl -fsSL https://tailscale.com/install.sh | sh sudo systemctl enable --now tailscaled tailscale version systemctl status tailscaled --no-pager ``` ### 8.3 加入 tailnet ```bash sudo tailscale up \ --auth-key='请替换成新的有效auth-key' \ --hostname='ts-relay-01' \ --advertise-tags=tag:relay \ --ssh ``` ### 8.4 开启 relay ```bash sudo tailscale set --relay-server-port=40000 ``` 检查: ```bash tailscale ip -4 tailscale status ss -lunp | grep 40000 ``` 当前实际节点信息: - 节点名:`ts-relay-01` - Tailscale IP:`100.99.117.43` ## 9. 远端主机接入 ## 9.1 你自己的 Windows 主机 ### 安装 ```powershell winget install --id Tailscale.Tailscale --exact --accept-source-agreements --accept-package-agreements ``` 验证: ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts version Get-Service Tailscale | Format-List Name,Status,StartType ``` ### 用 auth key 自动加入 ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts up --auth-key='请替换成新的有效auth-key' --hostname='my-workstation' ``` ### 没有 auth key 时 ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts up --hostname='my-workstation' ``` 然后打开输出的授权链接,用你自己的 Tailscale 账号确认。 ### 接入后验证 ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts status & $ts ip -4 & $ts ping 100.100.67.109 & $ts ping 100.99.117.43 Test-NetConnection 100.100.67.109 -Port 3306 ``` ## 9.2 同事的 Windows 主机 ### 你先做的事 1. 在 Tailscale 后台邀请同事加入 tailnet 2. 告诉同事只需要在网页上登录并点确认 3. 不建议用你的 `auth key` 直接把同事机器并进来 ### 同事机器上的标准步骤 ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' if (Test-Path $ts) { & $ts version & $ts status } else { winget install --id Tailscale.Tailscale --exact --accept-source-agreements --accept-package-agreements } ``` 加入 tailnet: ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts up --hostname='coworker-win-01' ``` 如果输出授权链接,就打开浏览器让同事完成一次网页登录。 ### 接入后验证 ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts status & $ts ip -4 & $ts ping 100.100.67.109 & $ts ping 100.99.117.43 Test-NetConnection 100.100.67.109 -Port 3306 ``` ## 9.3 Linux 主机 ```bash curl -fsSL https://tailscale.com/install.sh | sh sudo systemctl enable --now tailscaled sudo tailscale up --auth-key='请替换成新的有效auth-key' --hostname='my-server-02' tailscale status tailscale ip -4 tailscale ping 100.100.67.109 tailscale ping 100.99.117.43 ``` ## 10. 数据库连接信息 当前可直接使用: - Host:`100.100.67.109` - Port:`3306` - 节点名:`DESKTOP-9KO3IVK` 如果只是先验证管理连接: - User:`root` - Host 权限:`root@'%'` 建议: 1. 先用 `Test-NetConnection` 验证网络 2. 再用 MySQL 客户端登录 3. 长期使用时改为单独业务账号 ## 11. 标准验证顺序 不要跳步骤。顺序固定: 1. `tailscale status` 2. `tailscale ping 100.100.67.109` 3. `tailscale ping 100.99.117.43` 4. `Test-NetConnection 100.100.67.109 -Port 3306` 5. 最后再测 MySQL 用户名和密码 Windows 验证命令: ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts status & $ts ping 100.100.67.109 & $ts ping 100.99.117.43 Test-NetConnection 100.100.67.109 -Port 3306 ``` Linux 验证命令: ```bash tailscale status tailscale ping 100.100.67.109 tailscale ping 100.99.117.43 nc -zv 100.100.67.109 3306 ``` ## 12. 标准排障顺序 ### 12.1 `tailscale ping` 不通 先判定为网络层问题,不要先改 MySQL。 重点检查: 1. 远端机器的 Tailscale 服务是否正常 2. 数据库机是否在线 3. 云主机 relay 是否在线 ### 12.2 `tailscale ping` 通,但 `3306` 不通 回到数据库机 `DESKTOP-9KO3IVK` 检查: ```powershell Get-NetTCPConnection -LocalPort 3306 -State Listen netstat -ano | findstr :3306 ``` 重点确认: 1. MySQL 是否监听 `0.0.0.0:3306` 2. Windows 防火墙是否允许 `3306/TCP` 3. 再之后才看 MySQL 授权 ### 12.3 一直走 DERP,不走 relay 检查: 1. 云主机是否已执行 `sudo tailscale set --relay-server-port=40000` 2. 安全组是否放行 `UDP 40000` 3. 客户端是否已经升级到较新的版本 ### 12.4 速度慢 这是预期内的边界: 1. 速度上限取决于本地数据库机的上行带宽 2. 大查询跨公网时延迟会明显放大 3. relay 解决的是连通性,不是带宽倍增 ## 13. Windows 客户端服务异常的恢复步骤 这次已经实际验证过一个高频故障: 1. MagicDNS 正常 2. 节点看起来在线 3. 但 `tailscale ping` 超时 4. 连 `ts-relay-01` 也一起超时 这种情况优先怀疑客户端自己的 Tailscale 服务卡住。 ### 13.1 先做服务重启 ```powershell Restart-Service Tailscale ``` 然后立刻复测: ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts ping 100.100.67.109 & $ts ping 100.99.117.43 Test-NetConnection 100.100.67.109 -Port 3306 ``` ### 13.2 再做进程级重拉起 ```powershell taskkill /F /IM tailscale-ipn.exe taskkill /F /IM tailscale.exe Start-Process 'C:\Program Files\Tailscale\tailscale-ipn.exe' ``` 然后再测: ```powershell $ts = 'C:\Program Files\Tailscale\tailscale.exe' & $ts status & $ts ping 100.100.67.109 & $ts ping 100.99.117.43 Test-NetConnection 100.100.67.109 -Port 3306 ``` ## 14. 给 Codex 的最短提示词 ### 14.1 给你自己另一台机器上的 Codex ```text 请把当前机器加入我现有的 Tailscale tailnet,并验证到本地 MySQL 的网络连通性。 现有节点: - DESKTOP-9KO3IVK / 100.100.67.109 - ts-relay-01 / 100.99.117.43 - MagicDNS 后缀:tail6e2c27.ts.net 要求: 1. 检查是否已安装 Tailscale 2. 未安装则安装 3. 如果我提供了 auth key,就用 auth key 加入 4. 如果我没提供 auth key,就执行 tailscale up 并把授权链接返回给我 5. 接入后执行: - tailscale status - tailscale ip -4 - tailscale ping 100.100.67.109 - tailscale ping 100.99.117.43 - Test-NetConnection 100.100.67.109 -Port 3306 6. 把最终主机名、Tailscale IP 和验证结果告诉我 ``` ### 14.2 给同事机器上的 Codex ```text 请把当前这台 Windows 机器加入我现有的 Tailscale tailnet。 现有节点: - DESKTOP-9KO3IVK / 100.100.67.109 - ts-relay-01 / 100.99.117.43 - MagicDNS 后缀:tail6e2c27.ts.net 这台机器属于我的同事,他会用自己的 Tailscale 账号登录。 要求: 1. 检查是否已安装 Tailscale 2. 未安装则安装 3. 执行 tailscale up,并把授权链接打开或返回 4. 等用户完成网页授权后,执行: - tailscale status - tailscale ip -4 - tailscale ping 100.100.67.109 - tailscale ping 100.99.117.43 - Test-NetConnection 100.100.67.109 -Port 3306 5. 把最终主机名、Tailscale IP 和验证结果告诉我 ``` ## 15. 不建议做的事 1. 不要把 `3306` 直接暴露到公网 2. 不要多人长期共用 `root` 3. 不要把一次性的 `auth key` 当成长期固定值写死 4. 不要在 `tailscale ping` 都不通时就去改 MySQL ## 16. 后续建议 如果后面这套方案会长期用,建议再做三件事: 1. 为迁移工具和同事各自建立独立 MySQL 账号 2. 把常用重查询改造成汇总表或副本查询 3. 对 `ts-relay-01` 增加简单监控,至少监控 `tailscaled` 和 `UDP 40000`