centos7下使用n grok编译服务端和客户端穿透内网
(发现博客园会屏蔽一些标题中的关键词,比如ngrok、内网穿透,原因不知,所以改了标题才能正常访问,)
有时候想在自己电脑、路由器或者树莓派上搭建一些web、vpn等服务让自己用,但是自己的电脑一般没有外网ip,没法在外部访问这些服务,就像下图,电脑能访问到外网,但是没法从外网访问到电脑。

这时可以用一台有外网ip的服务器利用ngrok在中间做个跳板,如下图,原理是搭有web服务的内网电脑A 与公网服务器C长连接,手机B访问服务器C的指定一个端口,服务器C将收到的手机发来的数据转发给内网电脑A,A做出相对的响应回传给服务器C,C再将收到的数据发给手机A,实现穿透内网。端口转发这些规则都是在服务器C和电脑B上定义好的。

ngrok穿透内网原理搭建比较简单,搭建也比较简单,不需要填很多配置文件。只需要在服务器上运行服务端程序,在内网电脑上运行客户端程序就行了。
需要:一台服务器、一个域名
搭建步骤:
1、环境准备:在服务器上安装git、go语言环境,下载ngrok源码包。
2、用域名生成证书(防止别人用利用你的服务器做跳板)。
3、编译服务端程序。
4、编译客户端程序,并复制到内网电脑上。
5、分别运行服务端和客户端,实现长连接。
6、测试,用手机访问看能不能转发数据。
详细步骤:
(为了容易理解,这里用abcd.cn当做域名,二级域名是ngrok.abcd.cn,指向同一个服务器)
1、环境准备
安装git:yum install git -y
下载go语言包,直接给出下好的了:https://pan.baidu.com/s/1dTzXD-r5kMgIvcD8HZJN1g
解压go语言压缩包,创建环境变量:
tar -zxvf go1.9.2.linux-amd64.tar.gz
vi /etc/profile
添加并保存profile文件:
export GO_HOME=/file/go/go
export PATH=$PATH:$GO_HOME/bin
更新环境变量:source /etc/profile
下载解压github上的ngrok源码:wget https://codeload.github.com/inconshreveable/ngrok/zip/master
给一个下好的ngrok:https://pan.baidu.com/s/1K2PB-Kka0-alLDSBfpotqQ
2、生成证书
执行下列命令:
NGROK_DOMAIN="你的域名"
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
执行后文件夹下会生成一些证书文件。
将新生成的证书,替换掉assets/client/tls下的证书
cp base.pem assets/client/tls/ngrokroot.crt -y
3、编译生成服务端程序
make release-server
会在ngrok/bin/目录下生成ngrokd可执行文件,
运行命令:./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="abcd.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
命令中-httpAddr 和-httpsAddr 是手机访问ngrok.abcd.cn的的端口,服务端会将80端口接收到的数据通过4443端口(默认)转发到内网电脑。
出现下列信息是成功运行了。
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
4、编译生成客户端程序
这里编译一个window版的客户端:
GOOS=windows GOARCH=amd64 make release-client
(生成linux客户端直接执行make release-client)
执行完上述命令后会在ngrok/bin/目录下生成windows_amd64文件夹,里面有一个ngrok.exe程序,复制到自己内网电脑上。
比如复制到E:/ngrok文件夹,需在此文件夹里新建ngrok.cfg配置文件,里面写:
server_addr: "abcd.cn:4443"
trust_host_root_certs: false
在命令提示符里切换到此文件夹,执行:
ngrok.exe -config=ngrok.cfg -log=ngrok.log -subdomain ngrok 5000
命令中指定配置文件、日志文件,-subdomain后面跟的是二级域名和服务器将数据转发到的本地端口,注意填的是二级域名的前一部分,比如ngrok.abcd.cn就写ngrok。
下图是运行成功的截图:

就会将服务器80接收到的数据转发到内网电脑的5000端口。
5、连接测试
先运行服务端:./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="abcd.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
再运行客户端:ngrok.exe -config=ngrok.cfg -log=ngrok.log -subdomain ngrok 5000
6、用手机访问进行测试。
如果是客户端连接不到服务端(就是上面步骤那个图状态不显示online),一般是服务端配置的问题,客户端程序和服务端程序是用证书编译出来的配套使用的。
如果服务端能接收到手机访问的数据但是找不到隧道转发,可能是客户端域名写的有问题(我就是这样的错误)。
手机访问的是二级域名:ngrok.abcd.cn。
自己搭建时别忘了把abcd.cn替换成自己的域名。
ps:域名那里没做其他尝试,不知道填服务器ip可不可行,我在运行客户端写一级域名不行,写二级域名可以,但是看网上教程填的一级域名。。
centos7下使用n grok编译服务端和客户端穿透内网的更多相关文章
- SVN 服务端 和 客户端
网址大全 | EF CodeFirst | 电视 | MyNPOI | 开源 | 我的皮肤 | ASP.NET MVC4 | 前端提升 | LINQ | WCF ...
- [企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用
1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决, ...
- Linux CentOS7下安装Zookeeper-3.4.10服务(最新)
Linux CentOS7下安装Zookeeper-3.4.10服务(最新) 2017年10月27日 01:25:26 极速-蜗牛 阅读数:1933 版权声明:本文为博主原创文章,未经博主允许不得 ...
- 【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
前言: MQTT广泛应用于工业物联网.智能家居.各类智能制造或各类自动化场景等.MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信.机器与物联网通信等. ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)
前言 在搭建个人博客时,由于没有使用任何框架,纯手工code前台和后台,导致遇到许多问题,其中一个问题就是mysql连接导致的页面相应速度异常低.在查询各种途径后,只能考虑使用memcache缓存.在 ...
- centos7下cups + samba共打印服务的教程
centos7系统我们用到的不多但是这款系统比centos6功能要强大了不少,下文来介绍一篇centos7下cups + samba,共打印服务的例子,具体如下所示. 这个算是rhce课程的篇外篇 ...
- centos7下cups + samba共打印服务
centos7下cups + samba共打印服务 2015年8月21日admin发表评论阅读评论 这个算是rhce课程的篇外篇,Samba除了提供文件共享外,也可以像windows下的共享一样提 ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
随机推荐
- Oracle案例04——ORA-39700: database must be opened with UPGRADE option
Oracle11.2.0.3数据库通过rman备份到Oracle11.2.0.4上做还原,报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open r ...
- June 28th 2017 Week 26th Wednesday
Anger begins with folly, and ends in repentance. 愤怒以愚蠢开始,以后悔告终. Learn to control your temper, don't ...
- PTA练习题之7-1 出租车计价(15 分)
7-1 出租车计价(15 分) 本题要求根据某城市普通出租车收费标准编写程序进行车费计算.具体标准如下: 起步里程为3公里,起步费10元: 超起步里程后10公里内,每公里2元: 超过10公里以上的部分 ...
- 关于Hibernate懒加载问题的最终解决方案
看到一篇Hibernate懒加载的文章,所以转载,原地址如下: http://tuoxie007.iteye.com/blog/334853 Hibernate的强大之处之一是懒加载功能,可以有效的降 ...
- 阅读《C陷阱与缺陷》的知识增量
版权声明:本文为Focustc原创文章.转载请注明作者及出处. https://blog.csdn.net/caozhankui/article/details/35925939 看完<C陷阱与 ...
- Yii 读写分离 分表分库
本文转自 http://hudeyong926.iteye.com/blog/1299989 实现一主一从,一主多从,多主多从的读写分离 .支持DAO,AR,其中Query builder只完成部分 ...
- PHP------析构方法
析 构 方 法 封装,有一个叫构造函数 和构造函数对应的还有一种方法叫做析构. class ren //一个类 是 人类 { public $mingzi ://成员变量 punction__d ...
- HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others) M ...
- php函数:call_user_func
前段时间浏览文档发现一个有意思的PHP函数:call_user_func [文档地址] 函数作用:该函数主要用于通过函数名去调用该函数 例如: function test(){ echo " ...
- canny算子求图像边缘,edgebox那部分
过程: 1. 彩色图像转换为灰度图像 2. 对图像进行高斯模糊 3. 计算图像梯度,根据梯度计算图像边缘幅值与角度(这里其实用到了微分边缘检测算子来计算梯度幅 ...