Loading... # 一、背景 上次介绍了使用多种方案实现了华为服务器的远程带外维护,而BMC、maxcent、ez2pc在维护过程中的功能及表现各有特色。基于ez2pc,我觉得还有进一步扩展易用性和稳定性的方法。以下是两天时间进行探索的梳理。 主要摄像是,发挥ez2pc的ngrok客户端功能,实现开机后自动打通VNC协议隧道到互联网,使得运维人员可以通过VNC客户端经过互联网跟直接带外管理目标服务器。并且,再加上uptime-kuma的监控功能,实现ez2pc存活监测。 ![2024-04-30T05:27:18.png][1] # 二、搭建ngrok服务 话说ngrok在2015年前后可以非常棒棒的软件 ,实现了没有公网也可以访问内网服务,甚至可以获得https能力。但是,时间到了2024年,时过境迁,ngrok已经被frp逐步取代,且自己编译代码遇到的各种版本兼容性问题也增加了部署难度。 ## 2.1 准备编译打包服务器 由于编译ngrok需要用到可以正常访问github的网站资源,所以最好这台机器可以位于HK等大陆地区以外。 需要go版本为1.13。因为代码里面的语法对于新版go程序会不适应。 准备go环境 ``` # 下载go程序 cd /usr/local/ wget https://go.dev/dl/go1.13.15.linux-amd64.tar.gz tar xzvf go1.13.15.linux-amd64.tar.gz # 设置环境变量 cat <<'EOF'>~/.bashrc export GOPATH=/usr/local/ngrok/ export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH:$GOPATH/bin EOF # 测试是否可以看到go版本 . ~/.bashrc go version ``` ## 2.2 编译ngrok 下载代码 ``` cd /opt git clone https://github.com/inconshreveable/ngrok.git cd ngrok ``` ``` # 生成证书 export NGROK_DOMAIN="ngrok.op123.ren" openssl genrsa -out base.key 2048 openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 100000 -out server.crt /usr/bin/cp base.pem assets/client/tls/ngrokroot.crt /usr/bin/cp server.crt assets/server/tls/snakeoil.crt /usr/bin/cp server.key assets/server/tls/snakeoil.key ``` 编译 ``` make release-server release-client ``` 但是,会遇到代码不正确的问题。需要切换两个包的tag ``` cd /opt/ngrok/src/github.com/rivo/uniseg git checkout v0.2.0 cd /opt/ngrok/ngrok/src/github.com/gorilla/websocket git checkout v1.1.0 ``` 再次编译 ``` make release-server release-client ``` 如果想编译其他系统或者架构的ngrok程序,可以继续执行 ``` GOOS=linux GOARCH=amd64 make release-server release-client GOOS=windows GOARCH=amd64 make release-server release-client GOOS=linux GOARCH=arm make release-server release-client ``` ![2024-04-30T05:40:49.png][2] ![2024-04-30T05:41:57.png][3] ![2024-04-30T05:42:55.png][4] ## 2.3 运行ngrok ``` ngrokd -domain=ngrok.op123.ren -httpAddr=:4040 -httpsAddr=:2443 -tunnelAddr=:4443 -tlsCrt=snakeoil.crt -tlsKey=snakeoil.key -log-level=INFO ``` ``` 这里提到了使用 ngrokd 来创建 ngrok 服务,并指定了各种参数和选项。以下是对这些参数的解释: ngrokd: 运行 ngrok 服务器端的命令。 -domain=ngrok.op123.ren: 指定 ngrok 服务所在的域名,这里是 ngrok.op123.ren。 -httpAddr=:4040: 指定 HTTP 流量的地址和端口,这里是 4040,表示 ngrok 在该端口监听 HTTP 流量。 -httpsAddr=:2443: 指定 HTTPS 流量的地址和端口,这里是 2443,表示 ngrok 在该端口监听 HTTPS 流量。 -tunnelAddr=:4443: 指定 ngrok 用于处理隧道流量的地址和端口,这里是 4443。 -tlsCrt=snakeoil.crt: 指定 TLS 证书文件,这里是 snakeoil.crt,用于加密通信和安全认证。 -tlsKey=snakeoil.key: 指定 TLS 私钥文件,这里是 snakeoil.key,用于 TLS 连接的密钥生成。 -log-level=INFO: 指定日志级别为 INFO,表示将显示信息日志,适用于了解 ngrokd 运行时的状态和活动。 综合起来,该命令的作用是在域名 ngrok.op123.ren 上运行 ngrok 服务器,监听HTTP流量在4040端口,HTTPS流量在2443端口,处理隧道流量在4443端口,并使用指定的TLS证书和密钥进行加密和认证。日志级别设置为INFO,以显示一般信息性日志。这样配置后,ngrok 应该可以在指定的端口上运行并处理流量了。 ``` # 三、配置ez2pc 主要配置: Server Address: 服务器ip地址或者域名 Server Port: 运行ngrokd的tunnelAddr端口 VNC配置中的远端端口:固定一个公网端口,最后可以使用Server Address+这个端口进行访问 ![2024-04-30T05:45:00.png][5] # 四、配置uptime-kuma 注意选择TCP协议。 ![2024-04-30T05:47:06.png][6] ![2024-04-30T05:47:37.png][7] ![2024-04-30T05:47:49.png][8] # 五、测试VNC连接 连接过程可能会有些延迟,稍微等一下。 ![2024-04-30T05:49:28.png][9] ![2024-04-30T05:49:22.png][10] 注意:由于VNC跑在了互联网,所以ez2pc的密码记得要改。 # 六、其他 ## 6.1 ngrok客户端的一般配置 ``` server_addr: "ngrok.op123.ren:4443" trust_host_root_certs: false console_ui: false region: ap tunnels: ssh: proto: tcp: 22 addr: 0.0.0.0:32895 web: proto: http: 10.168.1.1:80 https: 10.168.1.1:80 ``` 下面是对ngrok客户端配置文件各部分的解释: - `server_addr: "ngrok.op123.ren:4443"`:指定ngrok客户端连接到的ngrok服务器地址和端口。在这种情况下,客户端将连接到 "ngrok.op123.ren" 域名的 4443 端口。 - `trust_host_root_certs: false`:配置是否信任主机根证书。当设置为 false 时,ngrok客户端不会信任主机的根证书。 - `console_ui: false`:设置是否启用ngrok的控制台用户界面。在这里设置为 false,表示禁用控制台用户界面。 - `region: ap`:指定ngrok服务器所在的地区。在这里,ngrok客户端配置为连接到亚太地区的ngrok服务器。 - `tunnels`:配置ngrok的隧道设置,包括定义多个隧道类型和其设置。在这里,定义了两个隧道:`ssh`和`web`。 - `ssh`隧道: - `proto: tcp: 22`:定义了ssh隧道的协议和端口,这里使用TCP协议的端口22。 - `addr: 0.0.0.0:32895`:指定了ssh隧道映射到ngrok服务器的端口,这里是本地端口 32895。 - `web`隧道: - `proto: http: 10.168.1.1:80`:定义了web隧道的协议和地址,这里使用HTTP协议将本地主机的地址 10.168.1.1 的端口 80 映射到ngrok服务器。 - `proto: https: 10.168.1.1:80`:类似地,这里使用HTTPS协议将本地主机的地址 10.168.1.1 的端口 80 映射到ngrok服务器。 这些配置项定义了ngrok客户端如何连接到ngrok服务器并设置了两种类型的隧道,一个用于SSH服务,另一个用于Web服务,分别映射到不同的本地端口和地址上。通过这些配置,可以实现将本地服务通过ngrok暴露到公共互联网上,以便远程访问和调试。 ## 6.2 ngrokd服务启动脚本 ``` cat <<'EOF'>/etc/systemd/system/ngrokd.service [Unit] Description=ngrokd - Secure introspectable tunnels to localhost [Service] WorkingDirectory=/opt/ngrok ExecStart=/opt/ngrok/bin/ngrokd -domain=ngrok.op123.ren -httpAddr=:4040 -httpsAddr=:2443 -tunnelAddr=:4443 -tlsCrt=/opt/ngrok/snakeoil.crt -tlsKey=/opt/ngrok/snakeoil.key -log-level=INFO Restart=always ExecStop=/bin/kill -s QUIT $MAINPID TimeoutStopSec=30 StandardOutput=null StandardError=null [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl restart ngrokd ``` ## 6.3 ngrok客户端服务配置 下载 ``` sudo wget -O /bin/ngrok xxxxx sudo chmod a+x /bin/ngrok ``` 配置文件 ``` mkdir -p /opt/ngrok/ cat <<'EOF'>/opt/ngrok/ngrok.yml server_addr: "ngrok.op123.ren:4443" trust_host_root_certs: false console_ui: false region: ap tunnels: ssh: proto: tcp: 22 addr: 0.0.0.0:32895 web: proto: http: 10.168.1.1:80 https: 10.168.1.1:80 EOF ``` ## 6.4 ngrok客户端系统服务 ``` cat <<'EOF'>/etc/systemd/system/ngrok.service [Unit] Description=ngrokd - Secure introspectable tunnels to localhost [Service] WorkingDirectory=/tmp ExecStart=/bin/ngrok -log=stdout -config=/opt/ngrok/ngrok.yml start-all Restart=always ExecStop=/bin/kill -s QUIT $MAINPID TimeoutStopSec=30 StandardOutput=null StandardError=null [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl restart ngrok ``` [1]: https://www.sddts.cn/usr/uploads/2024/04/712652904.png [2]: https://www.sddts.cn/usr/uploads/2024/04/324893238.png [3]: https://www.sddts.cn/usr/uploads/2024/04/592924005.png [4]: https://www.sddts.cn/usr/uploads/2024/04/393659361.png [5]: https://www.sddts.cn/usr/uploads/2024/04/244527525.png [6]: https://www.sddts.cn/usr/uploads/2024/04/2146425213.png [7]: https://www.sddts.cn/usr/uploads/2024/04/2301427697.png [8]: https://www.sddts.cn/usr/uploads/2024/04/1614122672.png [9]: https://www.sddts.cn/usr/uploads/2024/04/2501177646.png [10]: https://www.sddts.cn/usr/uploads/2024/04/1282925236.png 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏