最近公司电脑的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
这里需要花点时间,耐心等待,几分钟就好。生成的服务端在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 启动命令
双击start.bat 启动服务,现在绿色online就是连接成功
本机注意开启远程桌面,然后在另一台电脑上测试远程连接,地址写 你的域名:端口。
经过上面的配置,我们已经能使用ngrok 进行内网穿透,实现远程桌面。但是运行ngrok客户端后会打开一个cmd窗口,一不小心就关掉了,关掉后服务就不可用了。所以这里我们将客户端配置成window的系统服务。这样不用担心意外关掉的情况,而且客户端挂了也能自动重启,并且系统重启后它也能自动启动服务。这里我们使用nssm来配置系统服务。
下载地址 http://nssm.cc/download 下载后选择适合自己系统的版本
为了方便管理,可将nssm程序和ngrok放到一个目录下。
然后以管理员权限运行cmd,输入安装命令,命令最后的ngrok是服务名,可以自定义。
nssm install ngrok
然后在弹出的窗口选择我们的start.bat脚本,点击install service即可。
然后再启动服务
nssm start ngrok
nssm常用命令
安装服务
nssm install
启动服务
nssm start
停止服务
nssm stop
重启服务
nssm restart
查看服务状态
nssm status