Tailscale DERP Docker版教程(国内 无需域名 IP+Port)

网上教程太复杂,又是域名 又是装golang,而且还没有Docker版本

国内机器没有备案无法解析域名,也就没办法使用官方直接搭建,需要下载源码去除证书验证重新编译才可以

偷懒

用我直接打包好的镜像即可,支持Amd64和Arm64,甲骨文Arm服务器也可直接使用

docker run -d --name tailscale-derp -p 36666:36666 -p 3478:3478/udp --restart=always javaow/tailscale-derp

教程

授人以鱼不如授人以渔,多阶段dockerfile构建,编译打包一体

1.打开一个dockerfile文件

vi dockerfile

2.把如下内容复制到dockerfile

注意1:最好使用国外服务器,国内github和docker连通性不是很好
注意2:此版本是Amd架构,如果要在Arm架构打包需要把 RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 这一行注释或者删除(此行为了解决Amd架构下alpine镜像无法执行二进制问题)
注意3:随着版本更新,cert.go文件中的代码行数可能发生变化,当前版本是注释91~93行这3行即可,编译前最好去官方仓库看下,否则编译不通过

# 编译
FROM golang:alpine AS builder

# 切换模块源为中国Go模块代理服务器
# RUN go env -w GOPROXY=https://goproxy.cn,direct

# 拉取代码
RUN go install tailscale.com/cmd/derper@latest

# 去除域名验证(删除cmd/derper/cert.go文件的91~93行)
RUN find /go/pkg/mod/tailscale.com@*/cmd/derper/cert.go -type f -exec sed -i '91,93d' {} +

# 编译
RUN derper_dir=$(find /go/pkg/mod/tailscale.com@*/cmd/derper -type d) && \
	cd $derper_dir && \
    go build -o /etc/derp/derper

# 生成最终镜像
FROM alpine:latest

WORKDIR /apps

COPY --from=builder /etc/derp/derper .

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

ENV 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

# 安装openssl
RUN apk add openssl && mkdir /ssl

# 生成自签10年证书
RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /ssl/derp.javaow.com.key -out /ssl/derp.javaow.com.crt -subj "/CN=derp.javaow.com" -addext "subjectAltName=DNS:derp.javaow.com"


CMD ./derper -hostname derp.javaow.com -a :36666 -certmode manual -certdir /ssl

3.编译镜像

 docker build -f dockerfile -t tailscale-derp

编译完成后即可查看本地生成的镜像

docker images

启动

docker run -d --name tailscale-derp -p 36666:36666 -p 3478:3478/udp --restart=always tailscale-derp

测试访问(提示不安全访问是正常现象 因为证书是自签)

https://IP:36666

显示如下即可成功
image

4.添加节点

进入官方后台,替换如下,HostName填写IP,DERPPort填写端口

"derpMap": {
		"OmitDefaultRegions": false,
		"Regions": {
			"910": {
				"RegionID":   910,
				"RegionCode": "自建节点",
				"Nodes": [
					{
						"Name":             "910",
						"RegionID":         910,
						"HostName":         "xx.xx.xx.xx",
						"InsecureForTests": 	true,
						"DERPPort":         36666,
					},
				],
				"RegionName": "自建节点",
			},
		},
	},

5.后话

自己打包镜像后可以上传到DockerHub上,让其他机器直接拉取使用,不用再重新编译了

主要注意点就是,随着版本更新cert.go文件中的代码行数可能发生变化,这时就需要修改dockerfile中的91,93d删除行数,只要保证把下面红框里的3行代码删除即可,这三行就是证书验证代码

69 个赞

谢谢分享,学习了

1 个赞

谢谢分享:pray:t2::pray:t2:

2 个赞

这个确实牛, 感谢分享

1 个赞

教程不错,收藏备用了

这下可不得不:racehorse:

借楼问一下,我有一台小主机装了win11,上面用hyperv跑了个debian,都装了tailscale。然后我在公司连接,跑了一下tailscale status,小主机走不了直连,debian可以,有什么检查思路吗?

感谢大佬的教程。

1 个赞

docker很早就有的吧,我都用好久了yangchuansheng/derper,不过你这个直接用ip+端口的还不错!

3 个赞

这必须点赞啊,牛

1 个赞

感谢分享,又学到了。

哈哈 辛苦佬友一人,幸福L站大家,大善人。

hugging face能行么

家庭宽带只有ipv6,配合ddns是否可以实现部署?如果想配合cf的域名解析,还需要哪些操作呢

1 个赞

教程不错,感谢分享

一般都是国内机器搭建derp多,打洞和转发延迟都低,但是其他的docker镜像都必须用ssl证书,国内不备案很难解析域名,所以IP+Port在国内很方便

1 个赞

Tailscale打洞前是一定要先走一次derp的,经过derp协商后才能打洞成功,如果用ipv6搭建derp那么你的其他机器也要有ipv6,没有ipv6就走不了derp

这是什么?没听过啊

非常详细的教程tieba13

2 个赞

就算你开启云朵应该也不行,Tailscale中转derp应该是走tcp的,cf的cdn大概率不支持协议