Wireguard

相关概念

Wireguard在内核层面处理路由, 使用系统内核的加密模块对数据进行加密, 速度快效率高, 使用UDP协议传输数据
Wireguard使用中继节点充当各位于NAT后客户端的中继服务器, 具体规则转发交予iptables执行

Peer

所有节点都叫Peer, 也可称为Node或Device

BounceServer

中继节点, 即具有公网ip的节点, 并开启了内核级别ip转发, 能够转发流量, 负责接受所有客户端的数据, 并进行转发

Subnet

子网, 私有局域网网段

10.0.0.0/8-10.255.255.255/8
172.16.0.0/12-172.31.255.255/12
192.168.0.0/16-192.168.255.255/16

Wireguard安装与配置

# 安装wireguard
apt install wireguard

# 中继节点开启ip转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

命令行安装配置

密钥

每个Peer都需要私钥和公钥, 私钥自行保管, 公钥给予其他Peer

# 生成私钥
wg genkey > wg_private.key
# 生成公钥
we pubkey < wg_private.key > wg_public.key

配置模板

一般配置文件位于/etc/wireguard/下, 命名规范保持*.conf即可

# 假设配置文件为/etc/wireguard/wg0.conf
[Interface] # 当前Peer的配置
# 当前Peer在wireguard中的ip地址, 需要自行考虑分配
# /32表示wireguard只处理10.100.1.1这个ip的报文, 一般客户端用
# /24表示wireguard处理10.100.1.0这个子网的报文, 一般中继端用
Address = 10.100.1.1/32 
PrivateKey = PrivateKey # 该Peer的私钥
DNS = 1.1.1.1,8.8.8.8 # DNS必填
ListenPort = 51820 # 如果该Peer为中继节点则需填写监听端口

Table = 12345 # VPN子网的路由表, off禁止创建路由, auto加入系统默认table中
MTU = 1500    # 最大数据帧长度, 默认1500, 不用管
PreUp  = /bin/example arg1 arg2 %i # up命令前执行的命令
PostUp = /bin/example arg1 arg2 %i # up命令后执行的命令
PreDown  = /bin/example arg1 arg2 %i # down命令前执行的命令
PostDown = /bin/example arg1 arg2 %i # down命令后执行的命令

[Peer] # 某个节点的配置, 如果有多个节点则写多个
# 该节点在wireguard子网的ip地址
# 若该节点为中继服务器. 则后面写/24代表将该子网相关流量转发至中继
# 若该节点为客户端, 则后面改为/32, 代表将特定流量转发至该节点
AllowedIPs = 10.100.1.1/24
PublicKey = PublicKey # 该节点的公钥
Endpoint = public_ip:ListenPort # 若该节点为客户端, 则填写服务端的公网地址与监听端口
PersistentKeepalive = 25 # 保持连接的时间
PostUp

常用配置
在启动wireguard时添加的规则

# 从文件或某个命令中读取配置值
PostUp = wg set %i private-key /etc/wireguard/wg0.key <(some command here)
# 添加日志到文件中
PostUp = echo "$(date +%s) WireGuard Started" >> /var/log/wireguard.log
# 调用WebHook
PostUp = curl https://events.example.dev/wireguard/started/?key=abcdefg
# 添加路由
PostUp = ip rule add ipproto tcp dport 22 table 1234
# 添加iptables规则, 启动数据包转发
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 强制wireguard重新解析对端域名的ip地址
PostUp = resolvectl domain %i "~."; resolvectl dns %i 192.0.2.1; resolvectl dnssec %i yes
PostDwon

常用配置
在关闭wireguard时删除的规则

# 添加日志到文件
PostDown = echo "$(date +%s) WireGuard Going Down" >> /var/log/wireguard.log
# 调用WebHook
PostDown = curl https://events.example.dev/wireguard/stopping/?key=abcdefg
# 删除iptables规则, 关闭数据包转发
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

docker可视化面板

wireguard-gen-web

本质上还是使用物理的wireguard配置与接口, 容器仅为了web界面查看修改wireguard配置
所以需要先安装wireguard
需要先在服务端安装上docker与wireguard

配置镜像及文件
# 拉取两个要用的镜像
sudo docker pull james/wg-api:latest
sudo docker pull vx3r/wg-gen-web:latest

编写docker-compose.yaml文件, 启动容器

version: '3.6'
services:
  wg-gen-web:
    image: vx3r/wg-gen-web:latest
    container_name: wg-gen-web
    restart: always
    expose:
      - "8080/tcp"
    ports:
      - 50000:8080 # 将容器的8080映射到服务器的50000端口
    environment:
      - WG_CONF_DIR=/data # wireguard配置文件存放位置
      - WG_INTERFACE_NAME=wg0.conf # 创建的网卡名称
      - OAUTH2_PROVIDER_NAME=fake
      - WG_STATS_API=http://172.17.0.1:8182
    volumes:
      - /etc/wireguard:/data # 将本机的wireguard映射到docker的配置中
    network_mode: bridge
  wg-json-api:
    image: james/wg-api:latest
    container_name: wg-json-api
    restart: always
    cap_add:
      - NET_ADMIN # 给予容器添加虚拟网卡的权限
    network_mode: "host"
    command: wg-api --device wg0 --listen 172.17.0.1:8182
# 启动容器
sudo docker-compose -d
自动更新配置文件

编写服务监听配置文件变化, 如果有变则直接重新加载Wireguard

# /etc/systemd/system/wg-gen-web.service
[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl reload wg-quick@wg0.service

[Install]
WantedBy=multi-user.target
# /etc/systemd/system/wg-gen-web.path
[Unit]
Description=Watch /etc/wireguard for changes

[Path]
PathModified=/etc/wireguard

[Install]
WantedBy=multi-user.target
# 开启报文转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
# 启动配置
sudo sysctl -p /etc/sysctl.conf
# 开机自启
sudo systemctl enable wg-quick@wg0 wg-gen-web.service wg-gen-web.path --now
服务端配置

浏览器登陆ip:50000页面

SERVER页面, 填写

itemvalue
Listen port50001
Server interface address10.58.40.1/24
Public endpoint for clients to connect toip:50001
DNS servers for clients
Default Allowed IPs for clients10.58.40.0/24
RreUpecho "WireGuard PreUp"
PostUpiptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.58.41.0/24 -o eth0 -j MASQUERADE
PreDownecho "WireGuard PreDown"
PostDowniptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.58.41.0/24 -o eth0 -j MASQUERADE

上述配置含义为:

  • wireguard监听物理机的50001端口
  • 其他客户端会向ip:50001发起连接请求
  • 所有客户端默认转发ip范围为10.58.40.0/24, 即该wireguard的子网范围
  • 在Up前打印"WireGuard PreUp"
  • 在Up后添加iptables的规则
  • 在Down前打印"WireGuard PreDown"
  • 在Down后删除先前加入的规则
Wireguard搭建
Wireguard服务端面板配置

参考:

启动停止

# 查看所有wireguard运行中配置
wg
# 启动
wg-quick up   conf_path
# 关闭
wg-quick down conf_path

样例

阿里转发ssh请求至腾讯云

在Aliyun上安装wireguard, 其配置文件为

[Interface]
# 阿里云子网ip为10.100.1.1, 转发10.100.1.0/24的所有报文
Address = 10.100.1.1/24 
DNS = 114.114.114.114 # DNS随便配个114
# 在up后向filter链FOREWARD表中添加接受所有wg网卡流入报文
# 在nat链POSTROUTING表中添加规则, 将所有10.100.1.0/24的报文转发至eth0网卡, 并进行动态NAT
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE
# 在down后删除先前加入的规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE

ListenPort = 50000 # 服务器监听端口为50000, 需打开服务器50000的UDP
PrivateKey = 阿里云服务器私钥

# Kali
[Peer]
PublicKey = 客户端的私钥
AllowedIPs = 10.100.1.2/32 # 设置客户端的ip为10.100.1.2
PersistentKeepalive = 120 # 保持连接

在客户端安装wireguard, 其配置文件为

[Interface]
Address = 10.100.1.2/32 # 客户端在wireguard子网的ip地址
PrivateKey = 客户端私钥
DNS = 114.114.114.114

# Aliyun
[Peer]
PublicKey = 中继端的公钥
AllowedIPs = 124.220.94.103/32 # 转发的ip范围
Endpoint = 101.132.180.2:50000 # 中继端的监听ip
PersistentKeepalive = 120 # 保持连接

腾讯云监听

2024/12/28 01:21:04.470450 101.132.180.2:38432
2024/12/28 01:21:22.763806 101.132.180.2:38432 SSH-2.0-OpenSSH_9.6p1 Debian-2 root HelloThisIsWireguardTest
2024/12/28 01:49:34.200115 101.132.180.2:42338
2024/12/28 01:49:45.992104 101.132.180.2:42338 SSH-2.0-OpenSSH_9.6p1 Debian-2 root This is a test two!

多节点动态互联

Aliyun中继节点的配置文件为

[Interface]
# 阿里云子网ip为10.100.1.1, 转发10.100.1.0/24的所有报文
Address = 10.100.1.1/24 
DNS = 114.114.114.114 # DNS随便配个114
# 在up后向filter链FOREWARD表中添加接受所有wg网卡流入报文
# 在nat链POSTROUTING表中添加规则, 接受wg网卡发来的所有报文
PostUp = iptables -A FORWARD -i %i -j ACCEPT 
# 将10.100.1.0网段发往10.100.1.0网段的报文全部转发到wg网卡, 并进行动态NAT
PostUp = iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -d 10.100.1.0/24 -o %i -j MASQUERADE
# 将10.100.1.0网段的所有ip全部转发到eth0, 并进行动态NAT
PostUp = iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE
# 在down后删除先前加入的规则
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.100.1.0/24 -d 10.100.1.0/24 -o %i -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE

ListenPort = 50000 # 服务器监听端口为50000, 需打开服务器50000的UDP
PrivateKey = 阿里云服务器私钥

[Peer] # Kali
PublicKey = 客户端的私钥
AllowedIPs = 10.100.1.2/32 # 设置客户端的ip为10.100.1.2
PersistentKeepalive = 120 # 保持连接

[Peer] # Raspberry
PublicKey = 客户端的私钥
AllowedIPs = 10.100.1.4/32 # 设置客户端的ip为10.100.1.4
PersistentKeepalive = 120 # 保持连接

客户端Kali的配置文件为

[Interface]
Address = 10.100.1.2/32 # Kali在wireguard子网的ip地址
PrivateKey = 客户端私钥
DNS = 114.114.114.114

[Peer] # Aliyun
PublicKey = 中继端的公钥
AllowedIPs = 124.220.94.103/32 # 转发的ip范围
AllowedIPs = 10.100.1.0/24 # wireguard子网互联
Endpoint = 101.132.180.2:50000 # 中继端的监听ip
PersistentKeepalive = 120 # 保持连接 

客户端Raspberry的配置文件为

[Interface]
Address = 10.100.1.4/32 # Raspberry在wireguard子网的ip地址
PrivateKey = 客户端私钥
DNS = 114.114.114.114

[Peer] # Aliyun
PublicKey = 中继端的公钥
AllowedIPs = 124.220.94.103/32 # 转发的ip范围
AllowedIPs = 10.100.1.0/24 # wireguard子网互联
Endpoint = 101.132.180.2:50000 # 中继端的监听ip
PersistentKeepalive = 120 # 保持连接 

相关踩坑

关于Win11显示网卡注册失败
删除HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{3d09c1ca-2bcc-40b7-b9bb-3f3ec143a87b}

Headscale

Tailscale是基于Wireguard构建的上层应用, 其在Wireguard的Nat组网基础上加入了

  • 划分不同用户空间
  • Nat穿透
  • 能搭建中转节点
  • 支持fallback, 中转失败时由主服务器传递数据

等功能.

Tailscale虽然开源, 但其仅代码上开源, 并未构建出可用的服务端程序
Headscale为社区上自建的Tailscale服务端, 其实现了与Tailscale几乎相同的功能, 并能兼容Tailscale构建的客户端

Headscale部署

cd
# 创建存储相关数据的文件夹
mkdir headscale
cd headscale
# 下载官方配置文件并进行修改
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml

修改~/headscale/config-example.yamldocker文件

若有域名, 例如此处使用域名abc.top
在域名服务商处添加条记录, 使abc.top指向预备部署Headscale的服务器
若使用CloudFlare, 注意不要开Tls代理

# 修改server_url为域名
server_url: https://headscale.whhhy.top
# 监听所有ip发往8080端口的数据
listen_addr: 0.0.0.0:8080
# 客户端随机端口?好像说不开可能会出奇奇怪怪的问题
randomize_client_port: true

若无域名, 则使用不了https, 仅使用http也是可以的

# 修改server_url为固定ip, 并监听特定端口
server_url: http://124.220.94.103:8080
# 监听所有ip发往8080端口的数据
listen_addr: 0.0.0.0:8080
# 客户端随机端口?好像说不开可能会出奇奇怪怪的问题
randomize_client_port: true

# 创建存储数据与配置的文件夹
mkdir container-config container-data
cp config-example.yaml container-config/config.yaml

# 创建docker网络
docker network create headscale-network

编写docker配置~/headscale/docker-compose.yaml

version: '3'

services:
  headscale:
    container_name: headscale
    image: headscale/headscale:latest
    restart: unless-stopped

    volumes:
      - ./container-config:/etc/headscale # 容器配置文件存放位置
      - ./container-data:/var/lib/headscale # 容器数据存放位置
    entrypoint: headscale serve
    networks:
      headscale-network:
    
#    ports:
#        - 8080:8080

networks:
  headscale-network:
    external: true
# 启动容器
docker compose up -d
# 查看日志
docker compose logs

若无域名部署仅删掉上面#, 随后在浏览器通过ip:8080进行访问, 下面为有域名情况

Headscale UI界面部署

注意! 该界面运行于docker容器内, 并未实现身份认证! 所以要自己保存好自己的APIKEY与服务器地址!
理论上不一定需要域名, 但此处就懒得试不用域名情况了, 若有其他需求自行查看官方文档

cd
# 存放headscale-ui的相关数据, 实际上是一个静态网站, 也不需要存储什么数据和配置, 
# 就当把docker-compose文件找个合适的地方放着吧
mkdir headscale-ui
cd headscale-ui

编写docker配置~/headscale-ui/docker-compose.yaml

version: '3'

services:
  headscale-ui:
    image: ghcr.io/gurucomputing/headscale-ui:latest
    restart: unless-stopped
    container_name: headscale-ui
    networks:
      - headscale-network
    environment:
      - TZ=Asia/Shanghai # 设置时区为亚洲/上海, 实际没啥用
networks:
  headscale-network:
    external: true

可以使用nginx或者caddy处理ssl请求
此处使用docker容器运行caddy, 能顺便帮忙申请证书
此处为了方便处理跨域问题, 直接把其全部放在同一域名下

Caddy处理ssl请求

cd
# 存放caddy的相关数据
mkdir caddy
cd caddy
mkdir container-data container-config

# 将所有发往abc.top/web的报文全部转发给headscale-ui的8080端口
# 将所有发往abc.top的报文全部转发给headscale的8080端口
echo '
https://abc.top {
        reverse_proxy /web* http://headscale-ui:8080
        reverse_proxy * http://headscale:8080
}
' > container-config/Caddyfile

编写docker配置~/caddy/docker-compose.yaml

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: always
    networks:
      headscale-network:
    stdin_open: true
    tty: true
    volumes:
      - ./container-data:/data
      - ./container-config:/config
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 80:80
      - 443:443
    entrypoint: /usr/bin/caddy run --adapter caddyfile --config /config/Caddyfile

networks: # 此处需要保证三个容器在同一docker网络下
  headscale-network:
    external: true
# 启动容器
docker compose up -d
# 查看日志
docker compose logs

其实使用nginx也可以, 甚至不一定非要把服务器的443端口占了, 80只是申请证书时候用了下吧? 有空再改

# 下载服务端可执行二进制文件
wget https://github.com/juanfont/headscale/releases/download/v0.25.1/headscale_0.25.1_linux_amd64
mv headscale_0.25.1_linux_amd64 /usr/local/bin/headscale
chmod +x /usr/local/bin/headscale

# 配置文件目录
mkdir -p /etc/headscale
# 存储数据
mkdir -p /var/lib/headscale
# 空的SQLite数据库文件
touch /var/lib/headscale/db.sqlite
# 将配置文件复制过去
cp config-example.yaml /etc/headscale/config.yaml

# 添加新的用户
useradd headscale -d /home/headscale -m
chown -R headscale:headscale /var/lib/headscale

# 启动服务
systemctl enable --now headscale
# 查看headscale监听端口
ss -tulnp | grep headscale

其他部分? 没有跑过

# 会自动创建相关路由表和iptables规则似乎
# 查看路由表
ip route show table 52
# 查看iptables规则
iptables -S
iptables -S -t nat

Headscale常用命令

# 如果使用docker, 需要把下面headscale替换为docker exec -it headscale headscale
# 但都使用docker了, 顺手整个面板不是很难吧
# 创建用户空间, 此处使用default替代
headscale user create default
# 查看所有用户空间
headscale user list
# 查看用户空间连接的所有用户
headscale nodes list

# 服务端生成24h内有效的密钥
headscale preauthkeys create -e 24h --user default
# 查看所有有效密钥
headscale --user default preauthkeys list

# 查看用户路由
headscale routes list -i number
# 开启用户特定路由
headscale routes enable -i number -r "192.168.100.0/24,xxx"
# 开启用户所有路由
headscale routes enable -i number -a

Tailscale客户端连接

前往tailscale官网下载对应版本客户端, 也可以参考其教程

下面内容做替换:
如果有域名, IPPORT等价于https://headscale.whhhy.top
如果无域名, IPPORT等价于http://你的ip:8080

Linux

官网下有一键安装命令

# 一键安装
curl -fsSL https://tailscale.com/install.sh | sh

# 可以打开web操作界面
sudo tailscale web

# 连接服务器, 这种会要求在浏览器上访问服务端的特定路径, 并在服务端执行浏览器上的指令
sudo tailscale up --login-server=IPPORT \ 
                  --accept-dns=false  # 接受服务端的DNS配置, 默认true \
                  --advertise-routes=192.168.100.0/24 # 表示这个网段的数据包也能转交给此节点 \
                  --accept-routes=true # 接受外部其他节点发送的路由
# 添加这条指令, 并在后面接上服务端生成的有效密钥可不用像上述一样麻烦
--authkey=

windows

浏览器访问IPPORT/window, 按要求来

# 可以打开web操作界面
sudo tailscale web

安卓

官网下客户端去吧
Nope: 官网给的是GooglePlay的下载链接, 实际上F-Droid也有安装包, 唉! 逆天华为!

  1. APP的右上角进入Settings
  2. 点进第一个Accounts
  3. 点进右上角三个点
  4. 点进Use an alternate server, 填入IPPORT
  5. 如果有服务器生成的密钥可以在4下面的Use an auth key中填入

ISO

浏览器访问IPPORT/apple, 没苹果的设备, 穷

docker容器内使用tailscale客户端

观察其他安装好tailscale的正常Linux系统上的的/lib/systemd/system/tailscaled.service文件
(tailscale交给systemctl接管的配置文件)

其环境变量文件为/etc/default/tailscaled
仅包含一个有效参数PORT="41641"

其启动命令为/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS

其结束命令为/usr/sbin/tailscaled --cleanup

由上可知, 在docker容器内部, 要想启动一个tailscale服务最快的方法是在后台挂起一条命令

/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=41641

当然, 如果报/dev/net/tun does not exist的错误, 可手动创建该文件

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun

随后再运行上面的tailscaled命令, 即可正常使用tailscale命令啦

如果没有ip地址的话, 需要运行

apt install net-tools -y
# 不对, 这条命令安装ifconfig的, 并没有改变不能显示ip的问题
apt-get install -y iputils-ping
# 安装ping的, 还是不对

关于docker容器内怎么跑systemctl还是没什么思路, 我是用tmux挂后台运行的)

其他

OpenWrt
群晖
威联通

转发流量

# 允许转发
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
# 生效
sysctl -p /etc/sysctl.d/ipforwarding.conf

参考教程:

Tailscale 基础教程:Headscale 的部署方法和使用教程
HeadScale 管理虚拟机

DERP服务器

DERP是Tailscale自研的一套协议, 在DERP服务器上可以帮助用户转发流量、查看能否Nat穿透等功能
Tailscale虽然提供了免费的DERP服务器, 但大多服务器都在国外, 最近的一台位于香港, 且使用人数巨多, 最好还是自建一个DERP服务器

NAT2NAT穿透原理

关于DERP为什么能实现NAT2NAT原理官方提供了详细的博客说明, 看了但看不太懂

关于所有原理都能在官方的博客中找到实现原理, 需要一定的计网知识, 有机会研究一下

DERP服务器部署

# 创建存放数据文件夹
cd
mkdir derper
cd derper

编写配置文件~/derper/docker-compose.yaml

version: '3'

services:
  derper:
    container_name: derper
    image: fredliang/derper
    restart: always
    ports:
      - 3478:3478/udp
#      - 19850:19850  # 如果没有启用自定义的 network,则19850端口需要暴露出去
    environment:
      - DERP_DOMAIN=derper.abc.top # DERP服务器的域名
      - DERP_CERT_MODE=letsencrypt # 让caddy自行申请证书
      - DERP_ADDR=:19850
      - DERP_VERIFY_CLIENTS=false # 是否开启身份认证, 可以防止别人用自建的DERP服务器
#    volumes: # 若开启身份认证则需要将宿主机的sock映射给容器, 那我tailscale是跑在容器里的不就无解了
#      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
    networks:
      headscale-network:

networks:
  headscale-network:
    external: true
# 启动容器
docker compose up -d
# 查看日志
docker compose logs

修改caddy配置~/caddy/container-config/Caddyfile

https://derper.abc.top {
    reverse_proxy * http://derper:19850
}
# 重启caddy容器
cd ~/caddy
docker compose restart

在Headscale配置文件~/headscale/container-config/config.yaml中修改

derp:
  urls: # 可以在前面加#禁用官方derp服务器
    - https://controlplane.tailscale.com/derpmap/default
  paths: # 注意! 这个paths前面只有两个空格! 别改到headscale自带的derp server里去了
    - /etc/headscale/derp.yaml

添加配置文件~/headscale/container-config/derp.yaml

regions:
  900:
    regionid: 900          # 区域id
    regioncode: ALY        # 缩写名称
    regionname: ALiYunDERP # 详细名称
    nodes:
      - name: 900a    # 节点名称
        regionid: 900 # 所属区域
        hostname: derper.abc.top # derp服务器域名
        stunport: 3478  # stun端口
        stunonly: false # 仅开启stun服务
        derpport: 443   # derp服务端口
# 重启headscale服务端
cd ~/headscale
docker compose restart

数据流通限制?

参考资料:

最后修改:2025 年 06 月 13 日
赛博讨口子