菜鸟一个,折腾了很久才搞好,记录一下,免得下次忘记。如有错误请指正。

一、先在服务器上安装好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

设置防火墙后如果不生效,可以重启一下两边的机器。