headscale 内建 DERP服务, 在配置里启用即可
但是为了更好地中继, 可以在其他节点建立DERP中继服务
0. 先安装一个 Tailscale 客户端并注册到 Headscale
这样做的目的是让搭建的 DERP Server 开启客户端认证
1. 安装DERP
# 安装 DERP Server go install tailscale.com/cmd/derper@main
2. 验证
# derper --hostname=your-hostname.com --verify-clients
2022/11/25 10:19:35 no config path specified; using /var/lib/derper/derper.key
2022/11/25 10:19:35 derper: serving on :443 with TLS
2022/11/25 10:19:35 running STUN server on [::]:3478
derper –hostname=域名 -c $HOME/derper.conf -http-port -1 -a :81 –verify-clients=true –stun
解释
如果不指定 -a 参数, 则默认监听 :443
如果监听 :443 并且未指定 –certmode=manual 选项,就会 自动强制使用 –hostname 指定的域名进行 ACME 申请证书
指定了 -a 为非 :443 端口, 且没有指定 –certmode=manual 则只监听 HTTP
2.
# 复制到系统可执行目录 mv ${GOPATH}/bin/derper /usr/local/bin setcap cap_net_bind_service=+ep /usr/local/bin/derper # 创建用户和运行目录 useradd \ --create-home \ --home-dir /var/lib/derper/ \ --system \ --user-group \ --shell /usr/sbin/nologin \ derper
3. systemd配置
/lib/systemd/system/derper.service
或者 /etc/systemd/system/derper.service
[Unit] Description=tailscale derper server After=syslog.target After=network.target [Service] Type=simple User=derper Group=derper ExecStart=/usr/local/bin/derper -c=/var/lib/derper/derper.key -a=:8989 -stun-port=3456 -verify-clients Restart=always RestartSec=5 # Optional security enhancements NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=yes ReadWritePaths=/var/lib/derper /var/run/derper AmbientCapabilities=CAP_NET_BIND_SERVICE RuntimeDirectory=derper [Install] WantedBy=multi-user.target
4. 启动
systemctl enable derper --now
5. 在headscale服务器上修改配置,以启用这个DERP
/etc/headscale/derper.yaml
内容为
regions: 901: regionid: 901 regioncode: cn regionname: "CUCC LTE" nodes: - name: cucc-derper regionid: 901 # 自行更改为自己的域名 hostname: derper.xxxxx.com # Derper 节点的 IP # ipv4: 123.123.123.123 可以不社会自 # Derper 设置的 STUN 端口 stunport: 3456 stunonly: false ###表示除了使用 STUN 服务,还可以使用 DERP 服务 derpport: 23456 ## 默认是443
https://derp.XXXX.ccom:23456 应该能看到一个页面
6. 修改 /etc/headscale/config.yaml 的内容
derp: server: # 这里关闭 Headscale 内置的 Derper Server enabled: false # urls 留空, 保证不加载官方的默认 Derper urls: [] # 这里填写 Derper 节点信息配置的绝对路径 paths: - /etc/headscale/derper.yaml # If enabled, a worker will be set up to periodically # refresh the given sources and update the derpmap # will be set up. auto_update_enabled: true # How often should we check for DERP updates? update_frequency: 24h
重启headscale服务
重启客户端, 在客户端运行
tailscale netcheck
应该可以看到添加的DERP中继服务
参考资料:
https://mritd.com/2022/10/19/use-headscale-to-build-a-p2p-network/
参数
-a string
server HTTPS listen address, in form “:port”, “ip:port”, or for IPv6 “[ip]:port”. If the IP is omitted, it defaults to all interfaces. (default “:443”)
-c string
config file path
-certdir string
directory to store LetsEncrypt certs, if addr’s port is :443 (default “/root/.cache/tailscale/derper-certs”)
-certmode string
mode for getting a cert. possible options: manual, letsencrypt (default “letsencrypt”)
-hostname string
LetsEncrypt host name, if addr’s port is :443 (default “derp.tailscale.com”)
-http-port int
The port on which to serve HTTP. Set to -1 to disable. The listener is bound to the same IP (if any) as specified in the -a flag. (default 80)
-stun
whether to run a STUN server. It will bind to the same IP (if any) as the –addr flag value. (default true)
-stun-port int
The UDP port on which to serve STUN. The listener is bound to the same IP (if any) as specified in the -a flag. (default 3478)
从代码看,如果不指定config, 且以root执行, /var/lib/derper/derper.key 就是配置文件
keyname := unsafeHostnameCharacters.ReplaceAllString(hostname, “”)
crtPath := filepath.Join(certdir, keyname+”.crt”)
keyPath := filepath.Join(certdir, keyname+”.key”)