ngrok 内网穿透+实现远程桌面

最近公司电脑的teamviewer经常被中断,基本上没办法使用了。而且破解越来越难,破解后没多久又被检测到。所以我想着换另一种方案来实现远程控制,公司内网服务器没有公网ip,所以只能进行内网穿透。内网穿透的方案有很多,向日葵,frp,ngrok,autossh等等。
以前我们有使用autossh来联通内网服务器和云服务器的经验,但是配置和使用起来比较麻烦。而做微信开发的时候是用ngrok做代理,只要配置一次,后边使用起来很简单,所以这里我决定用ngrok。并且我们已经搭建了ngrok服务,所以其实不用再搭建一次,只需要修改客户端配置即可。这里也体现了ngrok的方便,可以代理http和tcp协议,所以不止用来做远程连接,任何基于http和tcp的服务都可以用。另外我把搭建流程也记录下。

需要具备的条件

有公网ip的云服务器一台
域名一个(二级域名也行)
将域名解析到云服务器ip

准备环境

先安装编译环境和一些预备程序,已安装的可以忽略

#安装GNU编译器套件
yum install gcc -y

#GO语言环境
yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386

#安装git ,用来克隆ngrok源码
yum install git -y

#安装 lrzsz ,上传下载服务,一般服务器都有装,或者用别的上传下载也可以
yum install lrzsz -y

克隆源码

git clone https://github.com/inconshreveable/ngrok.git
cd ngrok

生成证书

注意修改下你的域名。将下边命令直接执行或者写到脚本执行

NGROK_DOMAIN="你的域名"
dir=cer
mkdir $dir

openssl genrsa -out $dir/rootCA.key 2048
openssl req -x509 -new -nodes -key $dir/rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out $dir/rootCA.pem
openssl genrsa -out $dir/device.key 2048
openssl req -new -key $dir/device.key -subj "/CN=$NGROK_DOMAIN" -out $dir/device.csr
openssl x509 -req -in $dir/device.csr -CA $dir/rootCA.pem -CAkey $dir/rootCA.key -CAcreateserial -out $dir/device.crt -days 5000

cp -rf $dir/rootCA.pem assets/client/tls/ngrokroot.crt
cp -rf $dir/device.crt assets/server/tls/snakeoil.crt
cp -rf $dir/device.key assets/server/tls/snakeoil.key

编译ngrok的服务端

这里需要花点时间,耐心等待,几分钟就好。生成的服务端在bin下

GOOS=linux GOARCH=amd64 make release-server

生成客户端

服务端是运行在外网云服务器上,而客户端是运行在我们需要代理的内网机器上的,用来与服务端连接,实现内网穿透的。根据自己需要选择使用命令生成客户端即可。

#windows 64位客户端:
GOOS=windows GOARCH=amd64 make release-client

#windows 32位客户端(以下生成客户端同理,将goarch值改为386即可):
GOOS=windows GOARCH=386 make release-client

#mac 客户端:
GOOS=darwin GOARCH=amd64 make release-client

#linux客户端:
GOOS=linux GOARCH=amd64 make release-client

生成的客户端在bin目录下,不同客户端类型的文件夹里

#windows64位客户端
ls bin/windows_amd64/

#mac 客户端
ls bin/darwin_amd64/

下载客户端

#sz下载或者其他方式下载
sz bin/windows_amd64/ngrok.exe

运行服务端

这里先运行下然后配置客户端测试,成功的话再配置后台运行
httpAddr http代理端口
httpsAddr https代理端口
tunnelAddr tcp代理端口
注意如果云服务器有防火墙,记得开放端口

./bin/ngrokd -domain="你的域名" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":1190"

后台运行,如果前台运行,ssh连接一端口,服务端就停止了,所以我们将他放到后台,这里使用nohup的方式。
注意不要少了最后的 -log=stdout &

nohup ./bin/ngrokd -domain="你的域名" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":1190" -log=stdout &

配置客户端

将上面下载的客户端放到一个目录,然后在同目录下建立配置文件ngrok.cfg
注意ngrok.cfg这里是yml格式,不能用tab,用2个空格替代,不懂的自己学习下yml
server_addr 是服务端地址 写 “你的域名:tcp端口”
tunnels 是建立一个隧道,
mstsc 是隧道名(自定义的)
proto 是协议,远程桌面是tcp协议,然后写你本机ip和本机的远程桌面端口,默认是3389
remote_port 是远程端口 就是你用远程桌面是要填的端口,最好不用3389,防止人家爆你端口。这里可以随便写,只要云服务器上防火墙开放就行。另外这里只要配置不同端口,就可以在别的机器上用,所以服务端只要部署一个,客户端可以在多台机器上运行。

server_addr: 你的域名:1190
trust_host_root_certs: false
tunnels:
  mstsc:
    proto:
      tcp: "127.0.0.1:3389"
    remote_port: 13389

启动命令,写到bat里方便使用

ngrok -config=ngrok.cfg start mstsc

最终目录结构如下,
ngrok.bat 配置文件
ngrok.exe ngrok客户端(前面下载的)
start.bat 启动命令
ngrok 内网穿透+实现远程桌面_第1张图片
双击start.bat 启动服务,现在绿色online就是连接成功
ngrok 内网穿透+实现远程桌面_第2张图片
本机注意开启远程桌面,然后在另一台电脑上测试远程连接,地址写 你的域名:端口。
ngrok 内网穿透+实现远程桌面_第3张图片

将客服端设置为window系统服务

经过上面的配置,我们已经能使用ngrok 进行内网穿透,实现远程桌面。但是运行ngrok客户端后会打开一个cmd窗口,一不小心就关掉了,关掉后服务就不可用了。所以这里我们将客户端配置成window的系统服务。这样不用担心意外关掉的情况,而且客户端挂了也能自动重启,并且系统重启后它也能自动启动服务。这里我们使用nssm来配置系统服务。

下载地址 http://nssm.cc/download 下载后选择适合自己系统的版本
为了方便管理,可将nssm程序和ngrok放到一个目录下。
然后以管理员权限运行cmd,输入安装命令,命令最后的ngrok是服务名,可以自定义。

nssm install ngrok

然后在弹出的窗口选择我们的start.bat脚本,点击install service即可。
ngrok 内网穿透+实现远程桌面_第4张图片
然后再启动服务

nssm start ngrok

成功安装成系统服务
服务安装成功

nssm常用命令

安装服务
nssm install  
启动服务
nssm start 
停止服务
nssm stop 
重启服务
nssm restart 
查看服务状态
nssm status 

你可能感兴趣的:(devops,ngrok,代理,内网穿透,远程桌面)