Tailscale

第一步:获取Tailscale API Key

Tailscale的部署非常简单,第一步就是获取一个用于部署的API Key。

登录Tailscale官网:访问 https://tailscale.com/

创建API Key:登录后,导航至**“Settings”,点击左侧的“Keys”**选项。记得选Reusable,重新构建镜像的时候key不会失效

点击 “Create key”,取一个名字,然后点击创建。

第二步:在NAS上部署Tailscale

准备部署目录:在NAS的文件管理中,新建一个用于存放Compose文件的文件夹共享文件夹/docker/tailscale_tailscale-1

创建Compose项目:打开Docker,进入 项目 选项,点击 “创建”。

填写项目名称,路径选择你刚才创建的文件夹。

将以下Compose代码粘贴进来。

version: "3.8"
services:
  tailscale:
    image: tailscale/tailscale:latest
    hostname: bejsernas
    container_name: tailscale
    network_mode: host
    volumes:
    # 确保在文件夹中创建了/volume1/docker/tailscale_tailscale-1
    # 绿联的地址是 共享文件夹/docker/tailscale_tailscale-1
    # 如果是Openwrt, IstoreOS等就直接/var/lib/tailscale:/var/lib/tailscale
      - /volume1/docker/tailscale_tailscale-1:/var/lib/tailscale 
    cap_add:
      - net_admin
      - net_raw
    devices:
      - /dev/net/tun:/dev/net/tun
    restart: unless-stopped
    environment:
      - TS_USERSPACE=false
      - TS_STATE_DIR=/var/lib/tailscale
      # 替换成你在Tailscale管理后台生成的认证密钥
      - TS_AUTHKEY=<tskey-YOUR-AUTH-KEY>
      # 用于开启子网路由
      # 这里我填的是192.168.77.0/24,10.0.0.0/8 这样才能认网段为内网
      - TS_ROUTES=<SUBNETS-TO-ROUTE>
      - TS_EXTRA_ARGS=--advertise-exit-node

配置API Key:在粘贴的代码中,找到对应的变量,将你第一步复制的API Key粘贴进去。

点击确定,然后开始构建。

稍等片刻,你的NAS容器就会在Tailscale的网络中上线,并自动分配一个IP地址。

第三步:配置子路由,出口和取消密钥时限

在官网的Machine列表点击Nas那行的三个点,选择Edit route settings,把Subnet routes和Exit node的两个选项勾上;

返回再点击三个点,选择Disable key expiry

第四步:客户端连接与远程访问

现在,你的NAS已经准备好被访问了,只需在你的设备上安装Tailscale客户端。

下载并登录客户端:在你的手机、电脑或其他设备上下载并安装Tailscale应用。登录时,请使用你在官网登录的同一个账号。

选择Nas作为Exit Node。

获取NAS IP:登录后,你会看到你的NAS服务已经出现在设备列表中。点击它,可以复制它分配的IP地址。

远程访问:打开浏览器,输入这个IP地址,你就能轻松访问了!

如果你有IPv6地址,那么Tailscale会利用它实现点对点直连,速度非常理想。你可以通过SSH连接到NAS,运行指定命令来确认是否处于直连状态。

Extra:碰到的问题

  1. TS_ROUTES变量很重要,里面的网段才认为是内网可以访问;由于学校服务器都是10.开头,所以加上了10.0.0.0/8;其他校园网ip多以100.开头,但是这个和tailscale自己分配的ip太像了,就不管了
  2. 在旁路由A里跑tailscale docker的话,tailscale的容器发出去的流量走的是来自主路由的直连网络,而不是代理
iptables -t nat -L -n -v --line-numbers
iptables -t mangle -L -n -v --line-numbers

通过查看规则,发现1 42213 2602K SS_SPEC_WAN_AC tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0。这条规则明确限定了 -i eth0——也就是说,SSR Plus 的透明代理拦截规则只对"从 A 的物理网卡 eth0 进入的流量"生效。而 tailscale 转发的流量是从 tailscale0 这个虚拟接口进入 PREROUTING 的,完全不会匹配这条规则,也就直接跳过了整个 SS_SPEC_WAN_AC 代理分流逻辑。 结果就是:tailscale 转发的流量走了 POSTROUTING 里排在后面的这条兜底规则: 2 137K 19M MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0 直接从 eth0 做普通 NAT 出网,完全没经过代理,所以出去的是 A 所在网络本身的直连出口 IP

修复方法:让 tailscale0 进来的流量也走一遍代理分流逻辑 在 A 上执行(先手动测试验证):

bashiptables -t nat -I PREROUTING 2 -i tailscale0 -p tcp -j SS_SPEC_WAN_AC

这条命令会在原来那条 eth0 规则之后,插入一条几乎一样的规则,只是把匹配接口换成 tailscale0,让 tailscale 转发进来的 TCP 流量也走同一套 SS_SPEC_WAN_AC 判断逻辑(走 china ipset 判断是否直连,不是则走 REDIRECT 到 1234 端口交给 SSR Plus 代理)。 加完之后,回到 B 上重新测试出口 IP:

curl ifconfig.me

理论上这次应该显示代理节点的 IP 了。

持久化方法: 方案一:

# 编辑 /etc/rc.local,在 exit 0 之前加入
iptables -t nat -I PREROUTING 2 -i tailscale0 -p tcp -j SS_SPEC_WAN_AC 2>/dev/null

方案二:

# 检查文件是否存在,不存在就创建
cat /etc/firewall.user

# 追加这条规则(如果还没加过)
echo 'iptables -t nat -I PREROUTING 2 -i tailscale0 -p tcp -j SS_SPEC_WAN_AC 2>/dev/null' >> /etc/firewall.user
updatedupdated2026-07-092026-07-09