设定tailscale出口点的步骤

好的,我为你整理一份从零开始、以 Ubuntu 系统为主的完整文档,包含安装 Tailscale、配置 IP 转发、设置 iptables NAT、宣告为出口节点,以及在后台批准的详细步骤。同时也收录了常见问题排查与安全建议。

你可以将这份文档保存下来,后续在新服务器上按照步骤操作即可。

# Ubuntu 服务器配置 Tailscale 出口节点完整指南

## 适用场景
– 将一台 Ubuntu(20.04 / 22.04 / 24.04)服务器配置为 Tailscale 网络的出口节点(Exit Node)
– 当你在国外时,通过这台服务器访问国内网络资源(如视频订阅、网银等)
– 服务器环境可能同时运行 Docker、有默认防火墙等

## 一、准备工作

### 1. 确认服务器基本信息
登录服务器后,记录以下信息:
“`bash
# 查看默认网卡名称(通常为 eth0, ens3, enp0s3 等)
ip route show default
“`
输出示例:`default via 172.24.63.253 dev eth0` → 网卡名为 `eth0`

### 2. 确保能够通过 VNC / 管理终端连接(重要)
配置网络时可能误操作导致 SSH 断连,请提前在云服务商控制台测试 **VNC 或串行控制台** 是否可以正常登录。

## 二、安装 Tailscale

“`bash
# 添加 Tailscale 官方 GPG 密钥和软件源(Ubuntu 通用)
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list

# 更新软件包并安装
sudo apt-get update
sudo apt-get install tailscale -y
“`

### 2.1 启动并登录 Tailscale
“`bash
sudo tailscale up
“`
执行后会返回一个 URL(如 `https://login.tailscale.com/a/xxxxx`),在**本地浏览器**中打开该链接,使用你的 Tailscale 账号登录并授权设备。

## 三、配置系统以支持流量转发(出口节点核心)

### 3.1 启用 IP 转发(永久)
“`bash
# 创建 sysctl 配置文件(推荐)
echo ‘net.ipv4.ip_forward = 1’ | sudo tee /etc/sysctl.d/99-tailscale.conf
echo ‘net.ipv6.conf.all.forwarding = 1’ | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo ‘net.ipv4.conf.all.forwarding = 1’ | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo ‘net.ipv4.conf.default.forwarding = 1’ | sudo tee -a /etc/sysctl.d/99-tailscale.conf

# 立即生效
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
“`

验证是否生效:
“`bash
sysctl net.ipv4.ip_forward net.ipv4.conf.all.forwarding
“`
两项都应输出 `1`。

### 3.2 配置 iptables NAT 与转发规则

**重要**:将下面命令中的 `eth0` 替换为你实际的主网卡名称(通过 `ip route` 确认)。

“`bash
# 添加 MASQUERADE:让从 Tailscale 进来的流量伪装成主网卡的 IP 出去
sudo iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

# 允许新连接从 tailscale0 转发到 eth0
sudo iptables -I FORWARD -i tailscale0 -o eth0 -j ACCEPT

# 允许已有连接的响应数据从 eth0 返回 tailscale0
sudo iptables -I FORWARD -i eth0 -o tailscale0 -m state –state RELATED,ESTABLISHED -j ACCEPT
“`

#### 如果服务器使用 firewalld(CentOS / Rocky 常见,Ubuntu 默认不用)
“`bash
sudo firewall-cmd –permanent –add-masquerade
sudo firewall-cmd –reload
“`

### 3.3 保存 iptables 规则(重启后依然生效)
“`bash
# 安装持久化工具(如果未安装)
sudo apt-get install iptables-persistent -y

# 保存当前 IPv4 规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4
“`

## 四、宣告服务器为出口节点

“`bash
sudo tailscale set –advertise-exit-node
“`

## 五、在 Tailscale 管理后台批准出口节点

1. 打开浏览器访问 [Tailscale Admin Console](https://login.tailscale.com/admin/machines)
2. 找到你的服务器设备(通常显示主机名或 IP)
3. 点击设备右侧的 `…` → **Edit route settings**
4. 勾选 **`Use as exit node`**
5. 点击 **Save**

等待约 1 分钟,后台设备列表中该设备会显示绿色的 `Exit Node` 标记,不再有警告图标。

## 六、从客户端使用出口节点

### 6.1 获取服务器的 Tailscale IP
在服务器上执行:
“`bash
tailscale ip -4
“`
输出类似 `100.88.88.100`,记下该地址。

### 6.2 在客户端设备上(你的笔记本、手机等)设置出口节点

**macOS / Linux 客户端:**
“`bash
sudo tailscale set –exit-node=100.88.88.100 –exit-node-allow-lan-access=true
“`
参数 `–exit-node-allow-lan-access` 表示允许在通过出口节点上网的同时访问本地局域网设备(如打印机)。

**Windows 客户端:**
在 Tailscale 托盘图标 → 右键 → **Exit node** → 选择你的服务器。

### 6.3 验证是否生效
访问 `cip.cc` 或 `ifconfig.me`,显示的 IP 地址应为你服务器的公网 IP。

### 6.4 停止使用出口节点(恢复直连)
“`bash
sudo tailscale set –exit-node=
“`

## 七、常见问题与排错

### 7.1 后台显示“IP forwarding disabled”警告,尽管 sysctl 已设置
**原因**:Tailscale 守护进程没有重新检测到变化。
**解决**:
“`bash
sudo systemctl restart tailscaled
sudo tailscale set –advertise-exit-node
“`
然后再到后台重新批准(取消勾选 → 保存 → 再勾选 → 保存)。

### 7.2 客户端无法连接出口节点或没有流量
– 检查服务器的 iptables 规则是否存在:
`sudo iptables -t nat -L POSTROUTING -v -n | grep MASQUERADE`
– 检查 `tailscale0` 虚拟网卡是否存在:`ip addr show tailscale0`
– 检查服务器是否可以访问外网:`curl cip.cc`

### 7.3 服务器同时运行 Docker,导致容器网络异常
上述配置使用 `-I` 插入规则在 Docker 规则之前,一般不会影响容器。如果容器网络出问题,可以执行回滚:
“`bash
sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -D FORWARD -i tailscale0 -o eth0 -j ACCEPT
sudo iptables -D FORWARD -i eth0 -o tailscale0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
“`

### 7.4 服务器重启后出口节点失效
确保:
– IP 转发通过 `/etc/sysctl.d/99-tailscale.conf` 持久化
– iptables 规则通过 `iptables-persistent` 保存(步骤 3.3)
– Tailscale 服务开机自启:`sudo systemctl enable tailscaled`

### 7.5 如何卸载出口节点功能
“`bash
sudo tailscale set –advertise-exit-node=false
# 删除 iptables 规则(同上 7.3 的回滚命令)
“`

## 八、安全建议

1. **限制出口节点的使用范围**:通过 Tailscale 的 ACL(访问控制列表)指定只有你的特定设备才能使用该出口节点。
2. **定期更新系统与 Tailscale**:`sudo apt update && sudo apt upgrade tailscale`
3. **使用云服务商的安全组**:仅允许 SSH 从你的 Tailscale IP(或特定来源 IP)访问,避免暴露在公网。

## 九、附录:一键初始化脚本(供熟悉者使用)

将以下内容保存为 `setup_exitnode.sh`,然后 `chmod +x setup_exitnode.sh && sudo ./setup_exitnode.sh`
“`bash
#!/bin/bash
# 设置网卡名,请根据实际情况修改
NIC=”eth0″

# 启用 IP 转发
cat > /etc/sysctl.d/99-tailscale.conf < 文档基于 Ubuntu 20.04/22.04 测试,其他 Debian 系发行版基本通用。如果在执行中遇到任何错误,欢迎提供命令输出以便进一步分析。

Hermes & openclaw fallback

# Hermes / OpenClaw 模型 Provider 最小配置片段(可直接拷贝)

## Hermes(~/.hermes/config.yaml)

只保留:minimax(主力)+ mac(oMLX) 三模型(兜底)。

把下面两段直接替换到你的 `config.yaml` 对应位置即可:

“`yaml
custom_providers:
– name: mac
base_url: http://100.88.88.88:8000/v1
api_key: ${LOCAL_OMLX_API_KEY}
models:
– Qwen3.5-9B-OpusRsnDistV2-mlx-4bit
– Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4
– qwen35-9b-mlx-turboquant-tq3

fallback_providers:
– provider: minimax-cn
model: MiniMax-M2.7
– provider: mac
model: Qwen3.5-9B-OpusRsnDistV2-mlx-4bit
– provider: mac
model: Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4
– provider: mac
model: qwen35-9b-mlx-turboquant-tq3
“`

环境变量建议:

“`bash
export LOCAL_OMLX_API_KEY=’ollama-key’
export MINIMAX_CN_API_KEY=’sk-…’
“`

验证:
– oMLX:`GET http://100.88.88.88:8000/v1/models`(Bearer `${LOCAL_OMLX_API_KEY}`)能看到这 3 个 id。

## OpenClaw(~/.openclaw/openclaw.json)

只保留:minimax-portal(主力)+ mac(oMLX) 三模型(兜底)。

“`json
{
“auth”: {
“profiles”: {
“minimax-portal:default”: {
“provider”: “minimax-portal”,
“mode”: “oauth”
}
}
},
“models”: {
“providers”: {
“mac”: {
“baseUrl”: “http://100.88.88.88:8000/v1”,
“apiKey”: “${LOCAL_OMLX_API_KEY}”,
“api”: “openai-completions”,
“models”: [
{ “id”: “Qwen3.5-9B-OpusRsnDistV2-mlx-4bit”, “name”: “Opus (Top1)” },
{ “id”: “Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4”, “name”: “Hauhau (Top2)” },
{ “id”: “qwen35-9b-mlx-turboquant-tq3”, “name”: “TurboQuant (Top3)” }
]
},
“minimax-portal”: {
“baseUrl”: “https://api.minimaxi.com/anthropic”,
“apiKey”: “minimax-oauth”,
“api”: “anthropic-messages”,
“models”: [
{ “id”: “MiniMax-M2.7”, “name”: “MiniMax-M2.7 (Portal)” }
]
}
}
},
“agents”: {
“defaults”: {
“model”: {
“primary”: “minimax-portal/MiniMax-M2.7”,
“fallbacks”: [
“minimax-portal/MiniMax-M2.7”,
“mac/Qwen3.5-9B-OpusRsnDistV2-mlx-4bit”,
“mac/Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4”,
“mac/qwen35-9b-mlx-turboquant-tq3”
]
},
“models”: {
“minimax-portal/MiniMax-M2.7”: { “alias”: “m2.7” },
“mac/Qwen3.5-9B-OpusRsnDistV2-mlx-4bit”: { “alias”: “top1” },
“mac/Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4”: { “alias”: “top2” },
“mac/qwen35-9b-mlx-turboquant-tq3”: { “alias”: “top3” }
}
}
}
}
“`

使用:
– 切换:`/model m2.7` 或 `/model top1` `/model top2` `/model top3`

本地模型调优

**参考配置说明(只涵盖两类核心 provider:minimax-portal + mac(oMLX) 三模型)**

– **适用范围**
– 用于你后续批量改多个 OpenClaw 实例,以及 Hermes(只要 Hermes 也是走 OpenAI 兼容 `baseUrl + model id` 的方式即可复用 mac(oMLX) 部分)。

**1) Provider:minimax-portal(主力模型)**
– **认证方式**
– OpenClaw:使用 `auth.profiles` 的 OAuth(portal 登录态),provider 固定为 `minimax-portal`。
– 参考位置:[openclaw.json](file:///home/joehuang/.openclaw/openclaw.json#L18-L28)
– **模型引用格式**
– `minimax-portal/`
– 例:`minimax-portal/MiniMax-M2.7`
– **建议用法**
– 作为 `primary`(主模型)
– 作为 fallback 链条的第一个(保证 portal token 可用时优先走主力)

**2) Provider:mac(oMLX,本地三模型兜底)**
– **服务端要求(最关键)**
– oMLX 对外暴露的 `model id` = `GET /v1/models` 返回的 `data[].id`,它通常来自模型文件夹名。
– TG 点选要求:id 必须足够短(否则会因为 Telegram `callback_data` 64 bytes 限制导致“看得到但点不了”)。
– **OpenAI 兼容 endpoint**
– `baseUrl`: `http://100.88.88.88:8000/v1`
– `apiKey`: `ollama-key`(oMLX 这边用于鉴权)
– **三模型固定清单(按你当前 oMLX 实际存在的 id)**
– Top1:`Qwen3.5-9B-OpusRsnDistV2-mlx-4bit`
– Top2:`Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4`
– Top3:`qwen35-9b-mlx-turboquant-tq3`
– **OpenClaw 配置位置(两处都要一致)**
– 全局 config:`models.providers.mac`
参考:[openclaw.json](file:///home/joehuang/.openclaw/openclaw.json#L30-L87)
– 主 agent 模型库:`agents/main/agent/models.json` 的 `mac` provider
参考:[models.json](file:///home/joehuang/.openclaw/agents/main/agent/models.json#L124-L177)
– **建议用法**
– 只作为 fallback 链条尾部兜底(推荐顺序 Top1 → Top2 → Top3)。
– 给别名便于所有实例统一操作:`top1/top2/top3`(可选但强烈建议)
参考:[openclaw.json](file:///home/joehuang/.openclaw/openclaw.json#L300-L327)

**3) 最小 fallback 链条模板(只保留两类 provider)**
– **推荐默认结构**
– `primary`: `minimax-portal/MiniMax-M2.7`(或你各实例实际主力模型)
– `fallbacks`(从高到低):
– `minimax-portal/MiniMax-M2.7`
– `mac/Qwen3.5-9B-OpusRsnDistV2-mlx-4bit`(top1)
– `mac/Qwen3.5-9B-HauhauCS-Aggro-mlx-mxfp4`(top2)
– `mac/qwen35-9b-mlx-turboquant-tq3`(top3)
– 参考你当前默认链条位置(已包含 mac 兜底):[openclaw.json](file:///home/joehuang/.openclaw/openclaw.json#L287-L299)

**4) 快速验收(用于每个实例改完后 10 秒确认)**
– oMLX 侧:
– `GET http://100.88.88.88:8000/v1/models`(带 Bearer `ollama-key`)应包含上述 3 个 id
– OpenClaw 侧:
– `openclaw models list –plain` 至少能看到:`minimax-portal/MiniMax-M2.7` + 3 个 `mac/…`
– `openclaw models status` 里 `Fallbacks` 的末尾应是 3 个 `mac/…`(按 top1/top2/top3 顺序)

如果你把 Hermes 的模型配置文件路径/格式贴出来(通常是 `providers` + `fallbacks` 或类似结构),我可以把上面的模板直接翻译成 Hermes 版本的“可复制配置段”。