一、背景

上次介绍了使用多种方案实现了华为服务器的远程带外维护,而BMC、maxcent、ez2pc在维护过程中的功能及表现各有特色。基于ez2pc,我觉得还有进一步扩展易用性和稳定性的方法。以下是两天时间进行探索的梳理。
主要摄像是,发挥ez2pc的ngrok客户端功能,实现开机后自动打通VNC协议隧道到互联网,使得运维人员可以通过VNC客户端经过互联网跟直接带外管理目标服务器。并且,再加上uptime-kuma的监控功能,实现ez2pc存活监测。

2024-04-30T05:27:18.png

二、搭建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
2024-04-30T05:41:57.png
2024-04-30T05:42:55.png

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

四、配置uptime-kuma

注意选择TCP协议。
2024-04-30T05:47:06.png
2024-04-30T05:47:37.png
2024-04-30T05:47:49.png

五、测试VNC连接

连接过程可能会有些延迟,稍微等一下。
2024-04-30T05:49:28.png
2024-04-30T05:49:22.png

注意:由于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的隧道设置,包括定义多个隧道类型和其设置。在这里,定义了两个隧道:sshweb

    • 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
最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏