一、说明和准备
为更好地帮助小白从零开始部署,因此将笔者配置或实际选择以黄色背景显示
1.一个可用的域名(笔者在阿里云购买),并解析到服务器公网ip(笔者解析nwct.域名)
2.一台有公网IP的服务器(国内站点 ,优先选择带宽,根据实时价格选择,笔者选择腾讯云99/年 4M带宽 (北京))
3.FileZilla软件(用于传输文件,也可使用ssh,scp等命令在CMD中操作,但不能设置密钥(使用密码) 笔者没有试验)
4.本文的操作过程主要参考《手把手教你在 CentOS7 上部署Ngrok (踩坑&填坑)》,部分操作可以从原文获取,输入和输出结果一致。文中以《参考引文》替代,有一些细致的差异导致最终连接不上,因此记录下来。
二、实施
我习惯使用腾讯云/阿里云的网页连接,因此进入后需首先查看是否为root用户(重要!!!),一般需要输入自己设置的密码才能进入到root账户,因此推荐使用第二个密码登录。
如果使用一键登录也没有关系,进入后最左侧不是root,而是其他用户(如:lighthouse等自定义用户),执行su -命令输入密码
显示示例:
[lighthouse@VM-20-15-centos ~]#su -
快捷复制
su -
然后弹出Password:光标,输入你的密码回车即可,即可进入到root用户!下面的所有操作均基于此用户!
2.1 安装go环境和git环境
首先是更新软件
yum update
然后安装golang
(如果出错No package go available.请查看 《参考引文》对应部分解决,笔者没有出错)
yum install go
然后查看go的版本
go version
返回以下类似结果即成功(版本可能随时间不一样,但不影响)
go version go1.21.5 linux/amd64
安装git环境(中间会出来输入y or n的,输入y)
yum install git
查看git版本,返回结果请参照go,有返回版本号即为成功(版本低一些无所谓,不一定非要是最新版)
git --version
2.2 安装ngrok
拉去Ngrok的源码,github地址,和国内gitee源(笔者使用国内源,国外的超时)
git clone https://gitee.com/marchocode/ngrok
然后进入ngrok目录(linux中目录很重要,在不同目录的指令可能不同,请随时保证目录与本文一致!!!)
cd ngrok/
mkdir ssl
cd ssl
cd 后会显示对应文件夹
显示示例:
[root@VM-20-15-centos ~]#cd ngrok/
[root@VM-20-15-centos ngrok]#mkdir ssl
[root@VM-20-15-centos ngrok]#cd ssl
[root@VM-20-15-centos ssl]#
在服务器上制作SAN证书,原因请参照《参考引文》部分
(下文中所有xx.xx.xxx都需要替换为自己的域名解析)
echo subjectAltName = DNS:"xx.xx.xxx">extfile.cnf
如笔者如下执行
显示示例:
[root@VM-20-15-centos ssl]#echo subjectAltName = DNS:"nwct.nideyuming.top">extfile.cnf
生成证书
export NGROK_DOMAIN="xx.xx.xxx"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 5000 -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 5000 -out server.crt -extfile extfile.cnf
替换证书(询问时请输入y)
第一个:
cp base.pem ../assets/client/tls/ngrokroot.crt
第二个:
cp server.crt ../assets/server/tls/snakeoil.crt
第三个:
cp server.key ../assets/server/tls/snakeoil.key
然后回到上级目录(应为ngrok文件夹),生成服务端,出错make: *** [deps] Error 1请看《参考引文》
cd ../
GOOS=linux GOARCH=amd64 make release-server
成功后在结果中显示/ngrok/bin/ngrokd文件夹即成功
然后生成客户端(Windows 64位系统)文件,其他类型客户端命令请参考其他来源,如1,2
GOOS=windows GOARCH=amd64 make release-client
然后在ngrok/bin/windows_amd64目录下会生成一个ngrok.exe文件,成功
2.3 使用FileZilla连接服务器并下载文件
使用密码或者密钥连接,请搜索相关教程,笔者使用密钥连接(腾讯云控制台生成密钥后自动关闭密码连接)
打开文件-站点管理器-创建新站点-填写信息-点击连接
选择SFTP协议,主机填写服务器公网IP,用户root,类型选择密码/密钥,如果是密钥的话请将自动下载的私钥文件添加到引用上。
连接成功后将左边打开到想要保存的本地文件夹中,右边则打开/root/ngrok/bin/windows_amd64文件夹,可以看到生成的文件ngrok.exe
将ngrok文件拖拽或者复制到左侧本地文件夹中,即可完成客户端的下载
然后需要新建配置文件为ngrok.cfg,并填写以下内容,保存,其中 remote_port值可以自己修改为任意不常用的端口值(常用的端口不要用)
server_addr: xx.xx.xxx:4443
trust_host_root_certs: false
tunnels:
mstsc:
remote_port: 3378
proto:
tcp: "127.0.0.1:3389"
在服务器控制台放行端口,放行4443(用来与内网电脑客户端建立隧道)以及自己设置的远程3378的TCP和UDP端口(外网电脑远程连接服务器该端口)
2.4 开启服务
在root的ngrod文件夹下输入如下指令启动服务端
./bin/ngrokd -domain="xx.xx.xxx" -httpAddr=:80 -httpsAddr=:443 -tunnelAddr=:4443
出现如下指令代表服务端开启成功,注意开启后会一直在这个进程中并不断刷新
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[06:51:54 UTC 2024/03/01] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[06:52:24 UTC 2024/03/01] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting: {"bytesIn.count":0,"bytesOut.count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0,"osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1":0,"windows":0}
然后启动客户端,打开cmd,cd到本地电脑(被控端)的ngrok.exe所在文件夹中,输入
ngrok.exe -log=stdout -config=ngrok.cfg start mstsc
其中 -log=stdout 是输出日志到结果中,加了的话会出现日志
不加的话就会显示
上图中没有出现[Error]或下图中没有出现红色即为成功,已经可以使用外网电脑远程桌面连接进行连接了!
三、外网电脑远程桌面连接
使用外网电脑打开Windows的远程桌面连接应用,其他电脑系统也有自带的相关软件,以Windows远程桌面连接为例进行演示。输入域名:端口号,本例中为3378,以及被控端电脑的用户名
点击连接后输入账户密码即可
成功连接!
四、使用Screeen后台持续运行
在服务器上跑服务端软件的时候,当主机与服务器断开连接的时候,centos会中断程序进行,这就意味着要让程序持续运行,就必须得保持主机和服务器的连接,为了解决这个问题, screen 是个极其有用的方法
错误表现截图,如果你的错误一致,可以根据下面的教程解决
外网计算机远程连接时,长时间显示配置远程会话。
本地客户端从绿色的online变成了蓝色的connecting并一直持续
仍然在root用户的根目录
安装screen
yum install screen
使用screen运行ngrok,-S test 可以取任意名字,笔者取得是ngrok
screen -S ngrok
在screen ngrok这个会话中,执行命令(出问题可以看五)
cd ngrok/
./bin/ngrokd -domain="xx.xx.xxx" -httpAddr=:80 -httpsAddr=:443 -tunnelAddr=:4443
然后按ctrl+a+d来从ngrok会话回到命令行
五、使用Powershell后台执行客户端程序
在windows中为了执行ngrok.exe,向上面说的一样使用cmd可以执行,但由于在于我的电脑开机过程中ngrok程序一直需要开着,而cmd窗口就得一直存在,因为cmd并没有提供挂起的功能,因此我们可以使用Powershell来实现后台挂起的操作,这样界面就会清爽一些。
首先需要在客户端执行程序和配置文件所在的文件夹里创建一个文本文件,将以下代码复制进去,保存并修改后缀名为.bat。我这里的名字是ngrok.bat。
ngrok.exe -config=ngrok.cfg start mstsc
然后在该文件夹中打开powershell,右键 open terminal或者win+R输入powershell然后cd到该文件夹,之后输入以下指令(注意引号内的内容是自己定义的文件名!):
Start-Process -WindowStyle hidden -FilePath "ngrok.bat"
示例如图:
然后就可以将powershell关掉,通过检查任务管理器可以看到ngrok已经开始运行了,然后就可以使用远程桌面连接测试了!这样的话 只要被控电脑不重启,都可以很安静的让客户端软件后台运行了。
六、一些注意事项和命令
6.1 kill掉错误进程
如果ngrokd程序自己断掉了,但其进程仍然在,因此需要先杀掉进程
查找进程号
ps -ef | grep ngrok
查找到的进程号杀掉即可
kill 2823
6.2 转移目录
cd 命令,如果出错提示没有文件夹,如果确实已经make dir了,则代表所在的文件夹不对,使用cd ../返回上一级目录,使用ls查看文件夹所有文件
cd dir
make dir
cd ../
6.3 退出程序
当程序在持续运行时,没有让我们输入的地方,如果有想进行其他操作,可以使用ctrl+C来退出当前程序回到命令行模式。
6.4 Screen操作
列出所有的screen:
screen -ls
重新连接screen,需要要连接的是detached
screen -r ngrok
删除上述列表中没有用的的screen,name为列表中的名字,格式为numid.balabala
screen -S name -X quit