一、背景
上次介绍了使用多种方案实现了华为服务器的远程带外维护,而BMC、maxcent、ez2pc在维护过程中的功能及表现各有特色。基于ez2pc,我觉得还有进一步扩展易用性和稳定性的方法。以下是两天时间进行探索的梳理。
主要摄像是,发挥ez2pc的ngrok客户端功能,实现开机后自动打通VNC协议隧道到互联网,使得运维人员可以通过VNC客户端经过互联网跟直接带外管理目标服务器。并且,再加上uptime-kuma的监控功能,实现ez2pc存活监测。
二、搭建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
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+这个端口进行访问
四、配置uptime-kuma
注意选择TCP协议。
五、测试VNC连接
连接过程可能会有些延迟,稍微等一下。
注意:由于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 条评论
hello world