tailscale docker部署【局域网设备免配置互访】【已避雷】

一、介绍

一键部署docker tailscale,主路由配置静态路由指向docker tailscale容器,实现局域网多设备直接访问100.x.x.x远端组网设备。

二、部署docker前准备

1、申请auth key

https://login.tailscale.com/admin/settings/keys
image

2、在宿主机:创建文件夹和文件

  • 新建文件夹
    • state
  • 新建文件
    • tailscale-start.sh
    • docker-compose.yml

image

2、新建一个命名为【tailscale-start.sh】脚本文件,后面要挂载到docker容器内

用于配置 NAT 转发规则,让容器接收主路由的数据包。复制一下命令到脚本文件,照抄即可:

#!/bin/sh
set -e

echo "🟢 /tailscale-start.sh 启动"
sleep 30

# 等待 tailscale0 接口出现
echo "🕓 等待 tailscale0 接口..."
for i in $(seq 1 30); do
    if ip link show tailscale0 >/dev/null 2>&1; then
        echo "✅ tailscale0 已就绪"
        break
    fi
    echo "⏳ tailscale0 尚未就绪,等待 $i 秒..."
    sleep 1
done

if ! ip link show tailscale0 >/dev/null 2>&1; then
    echo "❌ tailscale0 接口未检测到,退出脚本"
    exit 1
fi

# 启用 IP 转发
echo "🔹 启用 IP 转发"
sysctl -w net.ipv4.ip_forward=1 >/dev/null 2>&1 || echo "⚠️ IPv4 转发无法启用"

# 无需开启ipv6转发,没用,而且有bug
# sysctl -w net.ipv6.conf.all.forwarding=1 >/dev/null 2>&1 || echo "⚠️ IPv6 转发无法启用"

# 配置 NAT 转发规则(防重复)
echo "🔹 配置 iptables NAT"
iptables -t nat -C POSTROUTING -o tailscale0 -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE
iptables -C FORWARD -i eth0 -o tailscale0 -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i eth0 -o tailscale0 -j ACCEPT
iptables -C FORWARD -i tailscale0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i tailscale0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

echo "✅ NAT 转发规则已成功设置"
sleep 30

# 开启出口节点(路由所有流量)
echo "🔹 启用 出口节点"
tailscale set --advertise-exit-node
# tailscale up

echo "🟢 /tailscale-start.sh 执行完毕"

3、配置【docker-compose.yml】

因为我的容器挂载的网络是macvlan,而不是host,具体怎么创建macvlan网卡,自己百度。

version: "3.4"
name: tailscale

services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    # ghcr.nju.edu.cn/
    hostname: tailscale
    privileged: true                                                          # 一定要高权限运行docker,否则无法配置IP转发
    networks:
      macvlan:
        ipv4_address: 192.168.123.227                                         # 给容器分配一个局域网ip
    environment:
      - TS_AUTHKEY=tskey-auth-ksdfsdb611CNTRL-DiXeNuihasddSrEkFJrZamKeAuchHn6 # 替换你刚申请的key
      # - TS_EXTRA_ARGS=--advertise-tags=tag:container                        # 不需要标记,重启会失联
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_USERSPACE=false
      - TS_ROUTES=192.168.123.0/24                                            # 填主路由的网段,不使用子网可以#掉
    volumes:
      - ./state:/var/lib/tailscale                                            # 挂载刚刚新建的文件夹【必须】
      - ./tailscale-start.sh:/tailscale-start.sh                              # 挂载刚刚新建的sh脚本
    devices:
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
    restart: unless-stopped
    command: sh -c "sleep 10 && /tailscale-start.sh & /usr/local/bin/containerboot && wait" # 容器启动时运行sh脚本,照抄,无需修改

networks:
  macvlan:
    external:
      name: macvlan

4、主路由配置静态路由转发

image

三、启动docker

# 在宿主机运行docker-compose.yml
docker-compose up -d

四、验证访问

在局域网随便一个设备浏览器访问:http://100.100.100.100/,该地址为docker tailscale容器的网关管理页面
若出现,则大功告成!!

aee26d1d2bbd65134682918877326886

现在局域网设备随意访问100.x.x.x远端设备了。

五、最后设置

1、禁用密钥过期
image

2、如果要配置局域网设备子网,共享到外面,请设置
image

posted @ 2025-10-27 15:38  鱼翅ho  阅读(7)  评论(0)    收藏  举报