菜鸟一个,折腾了很久才搞好,记录一下,免得下次忘记。如有错误请指正。
一、先在服务器上安装好tailscale并连上tailscale网络
二、安装 docker-compose
以debian为例
apt install docker-compose
三、安装derp
Dockerfile文件:
文件来源 https://github.com/expoli/tailscale-derper
FROM golang:alpine AS builder# 切换模块源为中国Go模块代理服务器# RUN go env -w GOPROXY=https://goproxy.cn,direct# 拉取代码RUN go env -w CGO_ENABLED=0 && \ go install tailscale.com/cmd/derper@latest# 去除域名验证(使用 sed 查找然后直接删除域名验证三行代码)RUN sed -i '/if hi.ServerName != m.hostname && !m.noHostname {/,+2d' /go/pkg/mod/tailscale.com@*/cmd/derper/cert.go# 编译RUN derper_dir=$(find /go/pkg/mod/tailscale.com@*/cmd/derper -type d) && \ echo $derper_dir && \ cd $derper_dir && \ go build -o /etc/derp/derper# 生成最终镜像FROM alpine:latestWORKDIR /appsCOPY --from=builder /etc/derp/derper .RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezoneENV LANG C.UTF-8# 创建软链接 解决二进制无法执行问题 Amd架构必须执行,Arm不需要执行RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2# 添加源# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories# 安装opensslRUN apk add openssl && mkdir /ssl# 生成自签10年证书# 不知道每个derp节点的域名是否可以相同RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /ssl/derp1.43420024420.vip.key -out /ssl/derp1.43420024420.vip.crt -subj "/CN=derp1.43420024420.vip" -addext "subjectAltName=DNS:derp1.43420024420.vip"CMD ./derper -hostname derp1.43420024420.vip -a :443 -certmode manual -certdir /ssl --verify-clients
如果你有多个derp,请将里面的域名 derp1.43420024420.vip 改成一个与众不同的域名,不需要是真实域名。我不知道多个derp能否使用同一个域名,有人知道的话请告诉我。
docker-compose.yml文件:
version: '3.8'services: tailscale-derp: container_name: tailscale-derp build: context: . dockerfile: Dockerfile ports: - "443:443/tcp" - "3478:3478/udp" volumes: - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock # 映射本地 tailscale 客户端验证连接,用来验证是否被偷 restart: always
如果你服务器的443端口已被占用,或者是NAT机器不能使用这些端口,可以修改配置文件里的443和3478端口。
运行命令:
# cd 到 上面两个文件所在目录docker-compose up -d
四、tailscale后台的"Access controls"设置:
"derpMap": { // 只使用自建的节点 "OmitDefaultRegions": false, "Regions": { "930": { "RegionID": 930, "RegionCode": "nodeseek", "Nodes": [ { "Name": "nodeseek1", "RegionID": 930, "HostName": "你的服务器ip", "InsecureForTests": true, "DERPPort": 443, "STUNPort": 3478, }, ], "RegionName": "nodeseek", }, }, },
五、禁止p2p打洞直连,强制走derp中转
tailscale的策略是能直连成功就尽量直连,有时候直连网络很差,还不如中转好。
假设你本地电脑是debian,想禁止与ip为6.6.6.6的服务器直连,可以在本地电脑上设置ufw防火墙:
ufw deny out to 6.6.6.6 proto udpufw deny in from 6.6.6.6 proto udp
设置防火墙后如果不生效,可以重启一下两边的机器。