Wireguard
相关概念
Wireguard在内核层面处理路由, 使用系统内核的加密模块对数据进行加密, 速度快效率高, 使用UDP协议传输数据
Wireguard使用中继节点充当各位于NAT后客户端的中继服务器, 具体规则转发交予iptables执行
Peer
所有节点都叫Peer, 也可称为Node或Device
BounceServer
中继节点, 即具有公网ip的节点, 并开启了内核级别ip转发, 能够转发流量, 负责接受所有客户端的数据, 并进行转发
Subnet
子网, 私有局域网网段
10.0.0.0/8-10.255.255.255/8172.16.0.0/12-172.31.255.255/12192.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 yesPostDwon
常用配置
在关闭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 MASQUERADEdocker可视化面板
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页面, 填写
| item | value |
|---|---|
| Listen port | 50001 |
| Server interface address | 10.58.40.1/24 |
| Public endpoint for clients to connect to | ip:50001 |
| DNS servers for clients | |
| Default Allowed IPs for clients | 10.58.40.0/24 |
| RreUp | echo "WireGuard PreUp" |
| PostUp | iptables -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 |
| PreDown | echo "WireGuard PreDown" |
| PostDown | iptables -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指向预备部署Headscale的服务器
若使用CloudFlare, 注意不要开Tls代理
# 修改server_url为域名
server_url: https://headscale.whhhy.top
# 监听所有ip发往8080端口的数据
listen_addr: 0.0.0.0:8080
# 客户端随机端口?好像说不开可能会出奇奇怪怪的问题
randomize_client_port: true# 修改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 -aTailscale客户端连接
前往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也有安装包, 唉! 逆天华为!
- APP的右上角进入Settings
- 点进第一个Accounts
- 点进右上角三个点
- 点进
Use an alternate server, 填入IPPORT - 如果有服务器生成的密钥可以在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挂后台运行的)
其他
转发流量
# 允许转发
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数据流通限制?
参考资料: