Ngrok实现访问内网的远程桌面和web服务器

frp更方便、快捷

Posted by xqiushi on Saturday, July 15, 2017

ngrok介绍

看名字就知道跟nginx是同辈的,具有是一个反向代理的功能,但是它又有很多特别地方:当它在外网服务器上,便可以通过外网的公共的端点和内网(本地)之间建立一个安全的通道.

ngrok功能

由于能在公网与内网建议一个安全通道,那么它最大的功能就是实现内网穿透.

比如,我台电脑建了一个typecho博客网站用于平常的测试.这个电脑在内网的IP地址是10.1.102.4,并且我没有网络管理权限,不能做端口映射.当我不在这台电脑旁边但想浏览一下这个电脑上的web内容,这时ngrok就是便可以大显身手.可以将10.1.102.4:80映射到xiangqiushi.com:8080下.便可以在任何公网下输入xiangqiushi.com:8080,便可以访问到10.1.102.4的web服务器内容.从此便可以将博客放在家中电脑,然后在阿里云的ECS上安装ngrok服务.以后搬家就不用备份资料.

那么,映射远程桌面端口也就不成问题了.

ngrok安装[1][2]

服务器端安装,以CentOS 7 64位为例

SSH到服务器,下载源码

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

配置域名与证书

cd /ngrok
NGROK_DOMAIN="xiangqiushi.com"
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 10000 -out server.crt

替换默认证书

cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
cp base.pem assets/client/tls/ngrokroot.crt

开始编译,完成后便可以在/opt/ngrok/bin/中看到ngrok、ngrokd 两个可执行文件

sudo make release-server release-client

编译Mac版客户端,完成后便可以在/opt/ngrok/bin/darwin_amd64/中找到ngrok可执行文件

GOOS=darwin GOARCH=amd64 make release-client

编译Windows64位版,完成后便可在生/opt/ngrok/bin/windows_amd64/中打到ngrok.exe可执行文件

GOOS=windows GOARCH=amd64 make release-client

开启ngrok服务

sudo ./opt/ngrok/bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xiangqiushi.com" -httpAddr=":8080" -httpsAddr=":8081"

设置防火墙规则

httpAddr和httpsAddr的端口分别是ngrok用来转发http和https服务的端口。但是ngrokd还会默认运行4443端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定),因此,在防火墙中放行这三个端口。

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --add-port=4443/tcp --permanent

如果添加不了,可参考CentOS 7下LNMPA介绍以及在防火墙规则中添加端口方法

ngrok配置

客户端设置,以windows为例

下载/opt/ngrok/bin/windows_amd64/ngrok.exe到本地电脑(10.1.102.4).新建ngrok.cfg,内容如下:

server_addr: xiangqiushi.com:4443
trust_host_root_certs: false
tunnels:
    mstsc:
         remote_port: 33891
         proto:
             tcp: 3389
    mysql:
         remote_port: 33061
         proto:
             tcp: 3306
    http:
         subdomain: web
         proto:
             http: 80
    https:
         subdomain: blog
         proto:
             https: 443

此处不要复制粘贴,最好自己写一下:因为配置文件不能有制表符也就是tab,缩进只能用空格!

在ngrok.exe所在目录,运行:

ngrok -config=ngrok.cfg start mstsc  mysql http https

这样就可以同时开启web、数据库和远程桌面的端口穿透.

任一公网电脑上输入web.xiangqiushi.com:8080和blog.xiangqiushi.com:8081便可以10.1.102.4的80和443端口.

用远程访问工具,输入地址xiangqiushi.com:33891就可以实现远程访问了.

小结

真是有网络就有天下的感觉,当然,这些都是人类智慧的结晶.网络不断的缩小物理距离感,减小世界的延时,加速经济的发展速度,促进文化的交融.

参考与注释

[1]. 搭建属于自己的ngrok服务器 实现内网穿透 左手代码右手诗

[2]. 搭建 ngrok 服务实现内网穿透 Jerry Qu