Zer0e's Blog

使用ngrok实现内网远程桌面

字数统计: 1k阅读时长: 4 min
2019/04/01 Share

前言

最近打算在机房里面用自己的电脑,笔记本太重不想背在身上,就决定使用远程控制。之前一直在用teamviewer,这几天在想为什么不用远程桌面呢,于是我便开始研究如何内网穿透使笔记本的3389端口暴露到公网上。
网上找了几种方法,无非就是那几个在国内比较有名的产品,花生壳和nat123。当然他们也不都是免费的,免费的也有种种限制,后来找到了ngrok来进行内网穿透,ngrok1.x是开源的,我便想使用ngrok来完成想法。

准备

  1. 一台有公网ip的vps服务器
  2. 一个任意域名

实现

服务器环境

由于ngrok使用go语言编写的,需要先安装go环境。
先到golang官网下载linux安装包
执行sudo tar zxvf go1.12.1.linux-amd64.tar.gz -C /usr/local
之后配置环境变量

1
2
3
4
5
6
7
vim ~/.bashrc
//添加
export GOROOT=/usr/local/go
export GOPATH=/home/root/program_develop/go_demo
export PATH=$PATH:$GOPATH:/usr/local/go/bin
//使环境变量生效
source ~/.bashrc

执行go version出现版本就安装成功了。

域名DNS解析设置

首先将一个子域名解析到自己的服务器上,例如我将remote.xxxxx.com 解析到自己的服务器ip上(A记录).随后将 *.remote.xxxxx.com 解析到remote.xxxxx.com上(CNAME类型)。
至此DNS设置告一段落。

安装ngrok

下载ngrok

先下载ngrok源码,然后切换到目录
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok

生成证书与替换证书

1
2
3
4
5
6
7
8
9
10
11
12
//生成
export NGROK_DOMAIN="remote.xxxxx.com"
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

//替换
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

编译linux服务端

GOOS=linux GOARCH=amd64 make release-server

编译windows客户端

GOOS=windows GOARCH=amd64 make release-client
无论是编译客户端还是服务端,都会在ngrok/bin目录下生成可执行文件。

运行与使用

在服务器上

进入ngrok/bin目录,执行./ngrokd -domain="remote.xxxxx.com" -httpAddr=":8001" -httpsAddr=":4443" -tunnelAddr=":8083"
这里由于服务器的80和443端口被占用,就换了任意一个端口来侦听http和https,当然我们用不到这个。其次我使用了一个端口来侦听客户端的服务,客户端也是通过这个端口来使用ngrok。
还有,如果是想后台运行,建议使用screen或者nohub命令来实现。
然后到云服务器的安全组中放行这些端口(不要忘记3389),以保证服务正常运行。

在个人电脑上

首先先开启本机的远程桌面服务(好像是要win10专业版才能使用远程桌面,具体请参照微软官网。)
然后防火墙放行3389端口。
将服务器上的ngrok/bin/windows_amd64/ngrok.exe拷贝到个人电脑上,然后在同目录下创建
ngrok.cfg和ngrok.bat两个文件。

1
2
3
4
5
6
7
8
9
10
11
//ngrok.cfg
server_addr: "remote.xxxxx.com:8083"
trust_host_root_certs: false
tunnels:
mstsc:
remote_port: 3389
proto:
tcp: "127.0.0.1:3389"

//ngrok.bat
ngrok.exe -config=ngrok.cfg start mstsc

双击ngrok.bat文件,显示状态为online就成功了,在远程桌面连接中输入remote.xxxxx.com便可以开始使用远程桌面了。

后话

虽然实现了远程桌面,但其实效果并不是特别好,其主要原因还是vps限制了速率,毕竟学生机只有1M的带宽,如果有4M以上的带宽也许能顺畅一点,不过1M的速率简单使用也就已经足够了。
后来我又将本机的FTP服务穿透到公网,在由于IIS无法设置主被动模式,导致无法正常使用IIS自带的FTP服务,也只好作罢。理论上使用可以设置端口的其他软件搭建的FTP服务,就能成功穿透,但速度也是堪忧。

原文作者:Zer0e

原文链接:https://re0.top/2019/04/01/ngrok/

发表日期:四月 1日 2019, 10:20:28 晚上

更新日期:April 3rd 2019, 5:42:36 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 前言
  2. 2. 准备
  3. 3. 实现
    1. 3.1. 服务器环境
    2. 3.2. 域名DNS解析设置
    3. 3.3. 安装ngrok
      1. 3.3.1. 下载ngrok
      2. 3.3.2. 生成证书与替换证书
      3. 3.3.3. 编译linux服务端
      4. 3.3.4. 编译windows客户端
    4. 3.4. 运行与使用
      1. 3.4.1. 在服务器上
      2. 3.4.2. 在个人电脑上
  4. 4. 后话