一、DERP概述DERP 服务是tailscale运行所需的核心服务，tailscale依赖derp服务器进行nat穿透，实现点对点p2p链接，当然在某些特殊的网络可能会打洞失败，derp就会作为设备之间的第三者进行转发流量。derp会优先进行转发流量，再尝试打洞，所以首次链接时，会出现延迟增大或者丢包，这时我们可能就需要自建derp服务。tailscale官方提供的derp中继服务器分布在世界各地，中国的derp服务器位于香港，大陆地区延迟较高二、自建DERP所需条件1.一台具有公网ip服务器，可以是ipv4、ipv6，当然双栈最好2.域名（网上很多博主都说域名需要备案，备案的目的就是能够正常访问80和443端口，但是derp可以完全不借助这两个端口）3.证书 (域名ssl证书)本教程使用端口说明12340 HTTPS端口3478 STUN端口三、上传SSL证书证书需自行申请cd ~ root@localhost:~# ls certs {域名}.key {域名}.crt四、使用容器搭建DERPdocker run -d \ --name derper \ --restart=always \ --network=host \ -v /root/certs/:/app/certs \ -v /var/run/tailscale/:/var/run/tailscale/ \ -e DERP_CERT_MODE=manual \ -e DERP_HTTP_PORT=-1 \ -e DERP_ADDR=:12340 \ -e DERP_DOMAIN={你的域名} \ # -e DERP_VERIFY_CLIENTS=true \ runyf/derper参数说明--network=host 容器网络设置为共享主机网络，如果使用桥接模式，ipv6将不受支持，要想成功搭建支持ipv6的derp服务，必须要原生的ipv6，中间不能有端口映射也不能有nat6-v /root/certs/:/app/certs 设置证书目录放置在/root/certs/下，证书必须严格使用 {域名}.crt和 {域名}.key-v /var/run/tailscale/:/var/run/tailscale/ 这条参数目的是为了做客户端验证，防止他人白嫖的必要设置。其实严格来说应该映射/var/run/tailscale/tailscaled.sock这个文件，但是这样设置的话此如果文件不存在，比如说没有启动tailscale，特别是系统重启之后容器可能会启动失败，我实测一定启动失败，所以只映射了文件夹-e DERP_HTTP_PORT=-1 这条参数是为了禁用derp所依赖的80端口，毕竟80端口和443端口是非常宝贵的，而且80端口也用不上，所以不如直接禁用-e DERP_VERIFY_CLIENTS=true 开启客户端验证容器管理docker logs -f derper 查看日志docker exec -it derper ./derper -version 查看当前版本五、配置ACL"derpMap": { "OmitDefaultRegions": true, "Regions": { "900": { "RegionID": 900, "RegionCode": "MyDerp", "Nodes": [ { "Name": "MyDerp-Name", "RegionID": 900, "HostName": "{你的域名}", "DERPPort": 12340, "STUNPort": 3478, "InsecureForTests": true, }, ], }, }, },客户端验证 tailscale netcheck tailscale status六、开启客户端验证（防白嫖）开启derp的客户端验证只需要安装tailscale并登录即可，还有一点重要设置，容器运行参数需要添加这一条 DERP_VERIFY_CLIENTS=true七、我的服务器没有ipv6怎么办Hurricane Electric Free IPv6 Tunnel Broker网站里面申请一个ipv6然后设置到自己的服务器上就行设置方法编辑 /etc/network/interfaces文件并追加以下内容auto he-ipv6 iface he-ipv6 inet6 v4tunnel address x:x:x:x::x netmask 64 endpoint x.x.x.x local x.x.x.x ttl 255 gateway x:x:x:x::x重启服务器[scode type="yellow"]如果你的服务器里面没有interfaces这个文件可以参考此设置方法[/scode]touch /etc/netplan/99-he-ipv6.yaml编辑这个文件vim /etc/netplan/99-he-ipv6.yamlnetwork: version: 2 tunnels: he-ipv6: mode: sit remote: x.x.x.x local: x.x.x.x addresses: - "x:x:x:x::x/x" routes: - to: default via: "x:x:x:x::x"配置权限chmod 600 99-he-ipv6.yaml安装依赖apt install openvswitch-switch -ynetplan apply最后重启服务器reboot八、安装ddns-go安装ddns-go仅限于公网地址会变化的情况，比如个人宽带拨号上网的情况，注意如果需要DERP支持ipv6，那么域名解析的ipv6地址必须是原生的，中间不能夹杂端口映射或者nat6，这个是我反复测试得出来的经验，也是一个大坑。所以ddns-go需要安装在derp这台服务器上用来动态更新DERP的ipv6地址，而ipv4的支持则可以通过端口映射来实现，当然这是在DERP处于路由器下游的情况，如果你直接把DERP安装在路由器上就当我没说。docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go使用浏览器打开服务器对应9876端口进行配置九、参考链接Custom DERP ServersDERP Servers浅探 Tailscale DERP 中转服务headscale+derp自主组虚拟网，解决阿里云VPS部署问题Tailscale玩法之内网穿透、异地组网、全隧道模式、纯IP的双栈DERP搭建Tailscale 基础教程：部署私有 DERP 中继服务器fredliang/derperjeessy/ddns-go