一、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
四、使用容器搭建DERP
docker 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
重启服务器
interfaces
这个文件可以参考此设置方法
touch /etc/netplan/99-he-ipv6.yaml
编辑这个文件vim /etc/netplan/99-he-ipv6.yaml
network:
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 -y
netplan 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端口进行配置