headscale部署与derp服务器部署

发布于 2023-11-13  856 次阅读


因为后期需要远程与宿舍电脑通信进行点云的采集与处理,特地去寻找了一下虚拟组网的工具,看了半天发现tailscale比较符合我的需求,但是学校网络是对称NAT,不太容易打洞或者需要一个中继服务器去辅助打洞,然后tailscale的企业版需要钱,于是就找了一个开源并且被tailscale所认可的服务端headscale,然后我会分享一下headscale搭建以及中转服务器derp的搭建

20231213更新,目前已有一键脚本但不完善

https://github.com/Valkierja/headscale_installer

首先先介绍一下tailscale,tailscale是一个可以进行虚拟组网的软件,基于wireguard协议,可以实现p2p的虚拟局域网组建。我这里选择在美国的一台云主机当做derp中转服务器和headscale服务端。

首先是部署derp中转服务器,derp服务器是需要一个域名来进行运行,但是我的域名目前绑定在博客上,我也不想因为这个把自己的服务器暴露,于是就需要对derp的源码进行修改,删除域名验证部分。derp是用go语言进行编译的,首先是得下一个go

首先是对服务器进行更新,我的云服务器运行的是20.04LTS的ubuntu服务器

******************重要说明,derp服务器和headscale服务器都需要公网ip!!!!!!!*******************

apt update && apt upgrade
apt install -y wget git openssl curl
wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version //这边是确定go是否已经安装到位
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct //这边是使用中国的镜像,如果站点在国外可以不用输入
go install tailscale.com/cmd/derper@main

在编译完成之后进入到/root/go/pkg/mod/tailscale.com@xxxxxxx/cmd/derper文件夹下,编辑一下cert.go文件,这里是将域名部分给删掉,将

if hi.ServerName != m.hostname {
return nil,fmt.Errorf("cert mismatch with hostname: %q",hi.ServerName)
}

这部分用//注释掉并保存

之后使用cd命令进入到derper这个文件夹下

go build -o /etc/derp/derper
ls /etc/derp   //确认已经编译成功并且放置在etc下
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /etc/derp/derp.myself.com.key -out /etc/derp/derp.myself.com.crt -subj "/CN=derp.myself.com" -addext "subjectAltName=DNS:derp.myself.com"

最后一行代码是进行自签ssl证书,里面的域名大家可以自行更换,不过建议还是用这个域名,因为这个只是让derp服务器启动,不会上网。

cat > /etc/systemd/system/derp.service <<EOF
[Unit]
Description=TS Derper
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/etc/derp/derper -hostname derp.myself.com -a :33445 -http-port 33446 -certmode manual -certdir /etc/derp --verify-clients
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOF

这部分是对derp的服务器进行修改 其中33445是https的端口 33446是http的端口,记得放行这两个端口,如果derp连不上可以进行修改,我这里用的是9876和9877。

systemctl enable derp
systemctl start derp

启用并开启Derp服务器

那么derp就搭建完成了,下一步就是安装headscale服务器

headscale服务器是用于验证的服务器,他的作用就是验证客户端的身份以及提供需要打洞的ip,如果无法打洞成功就会让derp服务器提供中转服务,用中转的方式将两个客户端联通

wget --output-document=headscale.deb \
     https://github.com/juanfont/headscale/releases/download/v0.22.3/headscale_0.22.3_linux_amd64.deb
 
sudo dpkg --install headscale.deb
 
sudo systemctl enable headscale
vim /etc/headscale/config.yaml

配置文件中有如下几个地方需要修改

server_url: http://127.0.0.1:8080    //ip换成自己的服务器ip,端口这个换不换都行,我的建议是换掉
ip_prefixed:
# fd7a:115c:a1e0::/48  //这里把ipv6注释掉,因为headscale有点bug,ipv4不需要变动,当然如果你想换网段可以自行更换

下面安装nginx,因为我们要安装一个ui界面,方便后续管理

apt install -y nginx
vim /etc/nginx/sites-available/default
//在里面靠前位置粘贴下方代码
map $http_upgrade $connection_upgrade {
    default      keep-alive;
    'websocket'  upgrade;
    ''           close;
}
server {
    listen 3355;  //改成你设置的端口
    listen [::]:3355;   //这里也改
    server_name 云服务器IP;   //换成你的ip
    location / {
     
        proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Host $server_name;
            proxy_buffering off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
            add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
 
    }
     
    location /web {
        index  index.html;
            alias  /var/www/web;
    }
}
server {
    listen 80;
    listen [::]:80;
 
    server_name 127.0.0.1;
 
    root /var/www;
    index index.html index.htm index.nginx-debian.html;
    location /d {
        alias   /var/www;
        autoindex on;
    }
    location / {
        try_files $uri $uri/ =404;
    }
}
//---------结束线----------
wget https://github.com/gurucomputing/headscale-ui/releases/download/2023.01.30-beta-1/headscale-ui.zip
unzip -d /var/www headscale-ui.zip
systemctl start headscale
systemctl restart nginx
headscale apikeys create --expiration 9999d
XXXXXXXXXXXXXXXXXXXXXXXXXXXX//这部分是你的授权api,复制下来

打开你的浏览器,输入你的ip:端口/web

在settings中输入你刚刚复制的api key

然后点击Test Server Settings,如果右边出现了对号那就说明和Headscale连接上了

这里有个重要的点,这个ui界面加载会非常非常非常非常非常非常慢,稍微耐心等等

连接上之后再user view里创建一个用户,名称随意

之后进入终端

touch /var/www/derp.json
vim /var/www/derp.json

{
    "Regions": {
        "901": {
            "RegionID":   901,
            "RegionCode": "Myself",
            "RegionName": "Myself Derper",
            "Nodes": [
                    {
                    "Name":             "901a",
                    "RegionID":         901,         //以上不用修改
                    "DERPPort":         33445,     //你之前设置的端口
                    "IPv4":   "IP地址",
                    "IPv6":    "IP地址", //如果有的话,没有就删掉
                    "InsecureForTests": true
                }
            ]
        }
    }
}
//-------终止线------
vim /etc/headscale/config.yaml
找到urls:
    -https://contorlplane.Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
注释掉-https://contorlplane.Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
在下面一行加上
    -http://127.0.0.1/d/derp.json
    一定要对齐
保存退出
systemctl restart nginx
systemctl restart headscale

之后为了防止你的derp服务器被白嫖,我在derp服务器的配置里就已经加上了验证客户端,这里就需要你在derp所在的服务器上安装tailscale,具体如下

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update
sudo apt-get install tailscale

如果你不是ubuntu服务器或者不是Linux服务器可以去https://tailscale.com/kb/1031/install-linux/  寻找安装方式

之后就是tailscale up --login-server=http://你的云服务器ip:端口

你会得到一个http://ip:端口/register/nodekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

复制nodekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

登陆进你的headscale管理ui,在Device View中点击New Device,在device key中粘贴进去,用户选择你创建的用户,点对勾,这时候你的服务器会自动弹出sucess的字样,这时候tailscale服务器已经验证成功了

tailscale在windows mac 安卓 linux上均有客户端,我就简单说一下如何让各个版本使用自己的Headscale服务器

首先windows中可以直接使用linux同款命令进行自定义客户端的登陆,前提是你没有登陆任何的服务器

mac中按住option键点击tailscale会有debug选项,点进去之后里面有自定义服务器可以填写,点进去会跳转浏览器,会跟着有nodekey,按照上面的方式添加设备就行

ios是进入设置-tailscale 在最下民有alternate server,填写你的服务器

安卓是右上角的菜单选项,点击四次就会出现更改服务器选项

-----------------------------------------------------------------------------------------

另外说一下出口节点,tailscale中有个功能可以让你选择一个设备作为流量的出口,至于作用嘛大家都明白

安卓,windows,mac的设置都很简单,点击之后都会有个exit node选项,里面有run exit node这个,点击之后需要你去headscale的服务器上允许,具体在device中,选择你刚刚申请出口的节点

把点击pending改成active就行

linux上需要设置一次ip转发,之后再开启exitnode

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale up --advertise-exit-node --login-server=http://你的云服务器ip:端口

之后你就可以在你设备中的tailsacle中看到你设置为出口的节点,点击之后你设备的流量都会从出口出去

不要平和的走进那个良夜
最后更新于 2023-12-13