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 ...
随机推荐
- Azkaban调度器
Azkaban介绍 Azkaban 是由 Linkedin 公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程.Azkaban 使用 job 配置文件建立任务之间 ...
- Microsoft SQL Server 数据量大 导入导出 问题汇总
问题一: 今天拿到一份有近百万条数据的Excel要导到数据库里面,我先在本地(2014)用自带Excel,然后生成脚本文件去服务器(2008)上执行:文件SQL打开不了. 解决方法: 用自带的sqlc ...
- OC基础数据类型-NSDictionary
1.字典NSDictionary 字典与数组的区别:数组讲究顺序,而字典可以快速帮助我们找到数据,数据是我们的目的,键是我们的手段 NSDictionary *dict = [[NSDictionar ...
- 在Windows 10上部署Apache PredictionIO开发环境
Windows在初研究人员的探索下,研究出了一套更为精简的环境配置,极大的缩短了开发时间与效率,在此总结以供后来者参阅. 1.部署环境的配置 Windows10 64 home IntelliJ ID ...
- 如何使用jMeter对某个OData服务进行高并发性能测试
For project reason I have to measure the performance of OData service being accessed parallelly. And ...
- tp 查询数据库时报错 A non well formed numeric value encountered
在database.php中配置或修改 'datetime_format' => false,
- phonegap 的指南针 api Compass
一. Compass 介绍方法参数 1.Compass 也就是,常说的指南针,又叫罗盘 2.方法 compass.getCurrentHeading compass.watchHeading co ...
- LSF作业管理系统使用方法
查看LSF计算节点列表bhosts # bhosts HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV fat01 ok - 16 0 0 0 0 ...
- php仿照asp实现application缓存的代码分享
php 怎么没有asp 那样的application缓存呢?最近我找了很多,都只有自己写,下面我分享一段代码 class php_cache{ //相对或者绝对目录,末尾不要加 '/' var $ca ...
- Selenium基础知识(详解IDE命令、css及xpath定位一)
1. ide常用命令,参考 http://sariyalee.iteye.com/blog/1743350 2. ide介绍,参考 http://blog.csdn.net/oscar999/art ...