首先感谢 @韩风 大佬提供的方法
打洞原理详解:[译] NAT 穿透是如何工作的:技术原理及企业级实践(Tailscale, 2020)
前期准备:
- 云服务器一台
- FinalShell或其他支持编辑主机内文件的ssh工具
root账户登录
- FinalShell用root账户登录云服务器 查看教程
更新软件包
- 执行这行代码
apt update && apt upgrade
下载GO
- 安装依赖
apt install -y wget git openssl curl
- 拉取 “go” 压缩包
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
- 解压 “go” 压缩包
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
- 查看 “go” 版本信息(验证是否安装成功 )
export PATH=$PATH:/usr/local/go/bin
go version
- 添加环境变量
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile
安装tailscale derper
- 国内云服务器设置加速下载
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
- 拉取 “tailscale derper”
go install tailscale.com/cmd/derper@main
修改证书
- 从FinalShell的文件管理界面打开cert.go文件
- 文件夹路径:/root/go/pkg/mod/tailscale文件夹一般在最下面/cmd/derper
编译derper
- 复制cert.go文件所在的路径
- cd 到刚才复制的路径
cd 刚才复制的路径
- 开始编译derper
go build -o /etc/derp/derper
- 若像下面这样报错,就是cd路径错了
-
验证是否编译成功
- 先cd到根目录
cd
- 再执行下面验证代码
ls /etc/derp
自签域名
- 设置域名信息,域名可以是自己瞎编的
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"
配置DERP
- 将下面的代码复制到记事本里,修改 "33445" 这个端口为另外的,自己随便想一个
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
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOF
- 全部复制记事本里的代码,“ Ctrl + Shift + V ” 粘贴到finalshell的命令窗口(不是输入框)
- 云服务器里开放TCP“自己改的端口”和UDP“3478”这两个端口
启用DERP
- 重新加载DERP服务
systemctl daemon-reload
- 重启DERP服务
systemctl restart derp
- 设置开机自启
systemctl enable derp
检查DERP服务器状态
- 浏览器访问:云服务器的IP地址+端口号(“自己改的端口”)
ACL配置
- 进入tailscale网页端
- 进入ACL界面添加以下代码
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {
"901": {
"RegionID": 901,
"RegionCode": "Myself",
"RegionName": "Myself Derper",
"Nodes": [
{
"Name": "901a",
"RegionID": 901,
"DERPPort": 33445,
"IPv4": "服务器IP",
"InsecureForTests": true,
},
],
},
},
},
检查DERP服务器是否接入
- 在一台已加入tailscale网络的设备上(最好Linux系统的设备)
- 执行命令“tailscale netcheck”
- 再执行命令“tailscale status”
-
未报错
-
报错
- 这时运行命令“tailscale ping 任意一台任意一台已加入tailscale网络的设备的IP”
-
解决ping不通的问题
1、经过测试发现如果云服务器是国内的
初次打洞时要确保这两个客户端的网络也是国内的 反之亦然
2、检查防火墙设置
如果还是ping不通 进入端口查询网站 检查所需端口是否真正放行
有些云服务商提供的云服务器服务有两层防火墙
网页端的防火墙(安全组策略)和主机内的系统防火墙
这时就要两层防火墙都放行所需端口才行
例如:Debian系统放行 “33445” 端口命令:ufw allow 33445
放行端口后可能需要重启一下服务器或DERP服务
- 上面操作完成后就可以ping通了
防白嫖设置
如果服务器IP地址和端口泄露了 那么是可以被别人白嫖的,为了防止白嫖
- 在云服务器上安装tailscale客户端并加入到tailscale网络中
curl -fsSL https://tailscale.com/install.sh | sh
- 修改DERP服务,开启连接验证
nano /etc/systemd/system/derp.service
快捷键:Ctrl + X ,输入 “y”,最后回车
- 重新加载DERP服务
systemctl daemon-reload
- 重启DERP服务
systemctl restart derp
好 这样操作完后 别人就无法白嫖了
END