为Tailscale添加derp中转服务器(免80)

发布于 2024-03-08  107 次阅读


简介

Tailscale很好用,很容易部署,但是有一个很大的问题,自带的中继服务器在国内带宽很低,所以就寻思着自建一个Custom DERP Server。

官方的文档在这里:https://tailscale.com/kb/1118/custom-derp-servers,其中有这么一段话:

Each DERP node must run an HTTP server, an HTTPS server, and a STUN server. The ports for those three services need to be open for traffic from the internet so users in your tailnet can access them from places such as their home or coffee shops.
You must use port TCP 80 for HTTP. By default, HTTPS runs on port 443, and STUN runs on 3478. To use other port numbers for HTTPS and STUN, set DERPNode.DERPPort or DERPNode.STUNPort, respectively.

官方文档要求必须使用80端口,这样的要求对于一个同时开有其他网页服务的服务器来说太苛刻了,而在https://pkg.go.dev/tailscale.com/tailcfg#CanPort80中又有布尔值的CanPort80选项,说明这个需求不一定是必须的。

经过几天的不断折腾,我成功的使我的Tailscale走了自己的服务器,流畅的看内网的番剧,并且有设备访问的限制。

基本的需求

目前测试的情况为域名+证书,使用Nginx进行反向代理并使用443端口,在Nginx配置证书并忽略反向代理的SSL证书,并开放3478 UDP端口,未进行测试没有证书和域名的情况,但依照https://blog.xuanhen.cn/tailscale-derp/所提到的,直接使用443端口似乎可以直接使用。

相关的配置

配置使用到Docker,你可以先参考这篇文章来安装Docker,并安装docker-compose。

新建一个文件夹,将下列新建下列文件在里面

docker-compose.yml

version: '3'

services:
   tailscale-derp:
       container_name: myderp
       image: myderp
       hostname: 你服务器使用的域名
       volumes:
         - /lib/modules:/lib/modules:ro
         - $PWD/config:/var/lib/tailscale
        cap_add:
         - NET_ADMIN
         - NET_RAW

       ports:
         - 127.0.0.1:22079:22079/tcp
         - 3478:3478/udp
       # restart: unless-stopped
       devices:
         - /dev/net/tun:/dev/net/tun

Dockerfile

FROM alpine:latest
#Add a goproxy
ENV GOPROXY "https://goproxy.cn"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
#Install Tailscale and requirements
RUN apk add curl iptables

#Install GO and Tailscale DERPER
RUN curl -fsSL "https://dl.google.com/go/go1.21.3.linux-amd64.tar.gz" -o go.tar.gz \
    && tar -C /usr/local -xzf go.tar.gz \
    && rm go.tar.gz
ENV PATH="/usr/local/go/bin:$PATH"
# https://tailscale.com/kb/1118/custom-derp-servers/
RUN go install tailscale.com/cmd/derper@main

RUN mkdir /app/
RUN mkdir /app/certs


RUN apk add tailscale

#Copy init script
COPY init.sh /init.sh
RUN chmod +x /init.sh


#Derper Web Ports
#EXPOSE 22078/tcp
EXPOSE 22079/tcp
#STUN
EXPOSE 3478/udp

ENTRYPOINT /init.sh

init.sh

#!/usr/bin/env sh

#Start tailscaled and connect to tailnet
/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state &> /var/lib/tailscale/tailscaled_initial.log &
/usr/bin/tailscale up --accept-routes=true --accept-dns=true --auth-key tskey-auth-"你的key" &> /var/lib/tailscale/tailscale_onboard.log &

#Start Tailscale derp server
/root/go/bin/derper --hostname=你服务器使用的域名 \
  --certdir=/app/certs \
  --a=:22079 \
  --stun-port=3478 \
  --http-port=22078 \
  --verify-clients=true

之后前往 https://login.tailscale.com/admin/settings/keys 生成一个Key,填好备注直接生成就好。然后用其替换 init.sh 中的tskey-auth-"你的key",并修改两处 你服务器使用的域名,然后

docker build . -t derpinchina:latest && docker-compose up -d

依照https://github.com/S4kur4/Derp-China

#你可以使用
curl http://127.0.0.1:22079
#来检测是否可以连接
#当出现问题时,你可以使用
docker exec -it myderp /bin/sh
#进入Docker进行调试

如果测试无误,你可以设置反向代理http://127.0.0.1:22079 ,并在防火墙和服务提供商(如果有的话)同时开启反向代理的TCP端口以及3478的UDP端口。在配置反向代理时,你可能需要将协议改为https,并且在反向代理的配置中加上 proxy_ssl_verify off;

之后前往 https://login.tailscale.com/admin/acls/file

	"derpMap": {
		"Regions": {
			"900": {
				"RegionID":   900,
				"RegionCode": "服务器名字",
				"RegionName": "Shanghai",
				"Nodes": [
					{
						"Name":      "900",
						"RegionID":  900,
						"CanPort80": false,
						// "DERPPort":  443,
						"HostName": "你服务器域名",
					},
				],
			},
		},
	},

添加在

前即可。

在添加后,如果不开放未修改过的80端口,使用tailscale ping多半是no matching peer,而使用tailscale status也只是显示已经上线的设备,如果你想要查看是否连接上,请输入:

tailscale netcheck

至此,流畅的享受令人愉快的大内网体验吧!

文献参考

Tailscale:Custom DERP Servers:https://tailscale.com/kb/1118/custom-derp-servers
Tailscale:Documentation: https://pkg.go.dev/tailscale.com/tailcfg
S4kur4/Derp-China: https://github.com/S4kur4/Derp-China
tijjjy/Tailscale-DERP-docker: https://github.com/tijjjy/Tailscale-DERP-docker