一、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 查看日志
      屏幕截图 2024-06-05 002721.png
    • docker exec -it derper ./derper -version 查看当前版本

五、配置ACL

runyf_20240604204213.jpg

"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

runyf_20240605005112.jpg

六、开启客户端验证(防白嫖)

开启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端口进行配置

九、参考链接

最后修改:2024 年 06 月 25 日
如果觉得我的文章对你有用,请随意赞赏