视频介绍
通过搭建ngrok内网穿透服务器,可实现web服务器本地化,tcp、udp转发、微信开发等
所需要的文件:下载所需文件
What?
ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。简单来说就是可以让你的本地服务暴露在外网上面,可以通过外网访问,这是我们经常需要用到的功能。
Why?
作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供它人体验评价或协助调试等等,通常我们会这么做:
- 找到一台运行于外网的Web服务器
- 服务器上有网站所需要的环境,否则自行搭建
- 将网站部署到服务器上
- 调试结束后,再将网站从服务器上删除
- 只不过是想向朋友展示一下网站而已,要不要这么麻烦,累感不爱
在国内开发微信公众号、企业号以及做前端开发的朋友想必对ngrok都不陌生吧,就目前来看,ngrok可是最佳的在内网调试微信服务的tunnel工具。之前,ngrok.com提供的服务还一切正常,后来就被墙了 。没有了ngrok tunnel,一切开始变得困难且没有效率起来。内网到外部主机部署和调试是一件慢的让人想骂街的事情。后来就想着自己搭一个ngrok服务。
How?
如何搭建ngrok服务呢?
下面是我在阿里云centOS7上面的搭建过程。
准备工作:
1、一台拥有公网ip的服务器或者vps
2、把需要做的主域名解析到服务器上面
软件下载地址:
go的下载地址:http://www.golangtc.com/download
git的下载地址:http://git-scm.com/downloads 绝对下载地址:https://www.kernel.org/pub/software/scm/git/git-2.6.0.tar.gz
ngrok克隆地址:https://github.com/inconshreveable/ngrok.git
准备映射的域名:ngrok.10086ol.com
一、域名泛解析
二、go环境搭建
go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。
源码安装go的详细过程如下:
1).下载源码:
可以在http://www.golangtc.com/download 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.9.2.linux-amd64.tar.gz。
2).将其解压到/usr/local目录下:
wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。
3). 在root环境下执行如下命令:
mkdir $HOME/go echo 'export GOROOT=/usr/local/go'>> ~/.bashrc echo 'export GOPATH=$HOME/go'>> ~/.bashrc echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc source $HOME/.bashrc
三、安装git环境
方式一:自动安装git环境
yum install mercurial git bzr subversion
方式二:手动安装git环境(此方法可以安装git的最新版本)
1.下载编译工具
yum -y groupinstall "Development Tools"
2.下载依赖包
yum -y install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel
3.下载git最新版本源代码
登录
https://github.com/git/git/releases
查看git的最新版。不要下载带有-rc的,因为它代表了一个候选发布版本。
如图,可以看出,目前git最新的版本是2.16.3
然后进入
https://mirrors.edge.kernel.org/pub/software/scm/git/
查找到对应版本下载
wget https://www.kernel.org/pub/software/scm/git/git-2.16.3.tar.gz
4.解压
tar -zxvf git-2.16.3.tar.gz
5.进入目录配置
cd git-2.16.3
./configure --prefix=/usr/local/git
6.编译安装
make && make install
7.配置全局路径
export PATH="/usr/local/git/bin:$PATH"
source /etc/profile
8.查看git版本
git --version
四、获取ngrok源码
获取源码:
git clone https://github.com/inconshreveable/ngrok.git
如果获取源码速度较慢,可以进入https://github.com/inconshreveable/ngrok.git 下载源码到本地,上传至目录/root/ngrok
五、编译
1). 配置环境变量
cd cd ngrok export NGROK_DOMAIN="ngrok.10086ol.com"
ngrok.10086ol.com替换成你自己的域名
2). 生成自签名ssl证书
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
3). 替换证书
cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
替换时系统会提示是否替换,输入“y”后回车确定替换
4).设置变量:
GOOS=linux GOARCH=amd64
如果是32位系统,这里 GOARCH=386
5).生成服务端
make release-server release-client
注:上述编译的过程会需要去github、google code下载其余依赖项目的源码,因此需要挂VPN。当然,如果VPS不能挂vpn可以在本地进行上面介绍的操作过程,然后将编译后的源码复制到vps上重新编译即可。 还有一种最简单的解决办法就是,修改源码,将需要连接google code的地址改为连接github上的地址:
找到 /root/ngrok/src/ngrok/log/logger.go ,看到里面有一个import中引用了google code,将其改为:”github.com/keepeye/log4go” 。
(在本地操作方法:
1.使用winscp进入本地centos目录,找到/root/ngrok/src里面的github.com、gopkg.in两个文件夹上传至对应目录下
2.进入root权限ssh root@192.156.35.3
3.cd ngrok
)
GOOS=linux GOARCH=amd64
make release-server release-client
编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。
六、交叉编译生成windows客户端、mac客户端
1).windows客户端编译;
进入go目录,进行环境配置
cd /usr/local/go/src/ GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash
进入ngrok目录重新编译
cd cd ngrok GOOS=windows GOARCH=amd64 make release-server release-client
编译后,就会在/root/ngrok/bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。
2).mac客户端编译;
进入go目录,进行环境配置
cd /usr/local/go/src/ GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 ./make.bash
进入ngrok目录重新编译
cd cd ngrok GOOS=darwin GOARCH=amd64 make release-server release-client
编译后,就会在/root/ngrok/bin目录下生成mac客户端目录,其中就包含着windows下运行的服务器和客户端程序。
3).linux客户端编译;
进入go目录,进行环境配置
cd /usr/local/go/src/ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./make.bash
进入ngrok目录重新编译
cd cd ngrok GOOS=linux GOARCH=amd64 make release-server release-client
编译后,就会在/root/ngrok/bin目录下生成mac客户端目录,其中就包含着windows下运行的服务器和客户端程序。
4).arm客户端编译;
进入go目录,进行环境配置
cd /usr/local/go/src/ GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash
进入ngrok目录重新编译
cd cd ngrok GOOS=linux GOARCH=arm make release-server release-client
编译后,就会在/root/ngrok/bin目录下生成mac客户端目录,其中就包含着windows下运行的服务器和客户端程序。
七、ngrokd服务启动与使用
1).启动ngrokd服务端
临时启动:
cd ngrok bin/ngrokd -domain="ngrok.10086ol.com" -httpAddr=":80"
注:ngrok.10086ol.com更换为你自己的域名
后台一直运行启动:
cd ngrok nohup bin/ngrokd -domain="ngrok.10086ol.com" -httpAddr=":80" &
注:ngrok.10086ol.com更换为你自己的域名
想要结束后台进程
ps -A #找到PID
kill xxx
2).启动ngrokd客户端
创建ngrok.cfg配置文件
server_addr: "ngrok.10086ol.com:4443" trust_host_root_certs: false
注:ngrok.10086ol.com更换为你自己的域名
ngrok.cfg配置文件和ngrok客户端放在本地同一文件夹内
windows客户端启动方式
1.打开CMD命令
2.如果ngrok.cfg配置文件和ngrok客户端放在本地桌面,那么输入命令
cd desktop ngrok -config=ngrok.cfg -subdomain veecolor 80
veecolor是你自定义地址
3.如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到你自己服务器的ip:119.29.113.146(域名需要已备案哦),然后执行 ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80
//(xxx.xxx.xxx是你自定义的顶级域名)
Linux/Mac客户端启动方式
1.打开终端
2.如果ngrok.cfg配置文件和ngrok客户端放在本地桌面,那么输入命令
cd desktop ./ngrok -config=ngrok.cfg -subdomain=veecolor 80
veecolor是你自定义地址
3.如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到你自己的服务器ip:119.29.113.146(域名需要已备案哦),然后执行 ./ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80
//(xxx.xxx.xxx是你自定义的顶级域名)
看到这样以下界面就说明成功了:
4.保持后台启动
cd desktop setsid ./ngrok -config=ngrok.cfg -subdomain=veecolor 80
八 、公司用代理上网,修改ngrok监听端口,并设置代理既可使用
注意:大家在看视频教程的时候,这里的域名ngrok.veecolor.com与之前的ngrok.10086ol.com,不一样是因为我在做这个节教程的时候换了域名了,不影响,大家把域名替换成你自己的就行。
1.ngrok修改端口启动:
临时启动:
cd ngrok bin/ngrokd -domain="ngrok.10086ol.com" -httpAddr=":80" -httpsAddr=":8081" -tunnelAddr=":443"
注:ngrok.10086ol.com更换为你自己的域名
把默认端口4443修改为443,在原来的启动命令中加入-tunnelAddr=”:443″
后台一直运行启动:
cd ngrok nohup bin/ngrokd -domain="ngrok.10086ol.com" -httpAddr=":80" -httpsAddr=":8081" -tunnelAddr=":443" & 注:ngrok.10086ol.com更换为你自己的域名 把默认端口4443修改为443,在原来的启动命令中加入-tunnelAddr=":443"
2.创建ngrok.cfg配置文件
server_addr: "ngrok.10086ol.com:443" trust_host_root_certs: false http_proxy: http://10.168.57.241:8088
注:ngrok.10086ol.com更换为你自己的域名
ngrok.cfg配置文件和ngrok客户端放在本地同一文件夹内
把原来的端口号4443修改为443,并加入公司代理上网地址及端口,http://10.168.57.241:8088替换为你们公司的代理地址。
九、ngrok绑定多个顶级域名、多个二级域名及转发tcp同时启动的方法
上次ngrok的配置教程中只讲解了配置一个二级域名及一个顶级域名的方法,这个教程教大家配置多个顶级域名、多个二级域名及转发tcp同时启动的方法。
server_addr: 服务器地址
tunnels:连接隧道
subdomain: 想服务器分配的域名
proto:转发服务
http: http模式
remote_port: 远程端口,当做tcp转发的时候如果不设置将有服务器自动分配
tcp: tcp模式
hostname: 绑定顶级域名
auth: 需要身份验证
http_proxy: 使用代理
一、配置ngrok.cfg文件
没有使用代理上网配置如下:
server_addr: "ngrok.10086ol.com:443" tunnels: vee: subdomain: "vee" auth: "vee:admin1993" proto: http: 192.168.1.108:80 vee1: subdomain: "vee1" proto: http: 192.168.1.104:80 ssh: remote_port: 50000 proto: tcp: 192.168.1.120:22 test: hostname: "test.10086ol.com" proto: http: 80 test1: hostname: "10086ol.com" proto: http: 192.168.1.104:80 test2: hostname: "www.10086ol.com" proto: http: 192.168.1.104:80
在公司使用了代理上网的配置如下:
server_addr: "ngrok.10086ol.com:443" http_proxy: http://10.168.57.241:8088 tunnels: test1: hostname: "www.10086ol.com" proto: http: 127.0.0.1:80 test2: hostname: "10086ol.com" proto: http: 127.0.0.1:80
http_proxy: http://10.168.57.241:8088修改为你们公司的代理地址即可
二、启动方式
Linux/Mac 启动命令:
./ngrok -config=ngrok.cfg start vee vee1 ssh test test1 test2
Linux/Mac 后台保持启动命令:
setsid ./ngrok -config=ngrok.cfg start vee vee1 ssh test test1 test2
windows 启动命令
ngrok -config=ngrok.cfg start vee vee1 ssh test test1 test2
[…] 转载原创文章请注明,转载自: Vedio Talk – VLOG丨内网穿透手把手教你自建ngrok服务器,从此抛弃花生壳公云等DDNS服务商…(https://vt.wooomoo.com/archives/336) […]
配置git的时候,我文件夹名称改成GIT,方便记录,然后在输入./configure –prefix=/usr/local/git这一步出现-bash: ./configure: No such file or directory,请问文该怎么处理啊??
推荐用FRP了 NGROK已经过时了
[…] https://vt.wooomoo.com/archives/336 […]
大佬请教一下, $NGROK_DOMAIN 所设定的域名是否需要经过备案呢?
我这边按照流程走下来, 发现无法连接到我的阿里云服务器上面, ngrokd服务是正常跑的
客户端的报错信息是
[2019/07/11 13:33:48 CST] [EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 106.15.94.31:4443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
国内服务器都需要备案
如何实现https访问呢
你好,请问为什么我跟着教程走却提示这个?
我用这种方式可以正常启动(bin/ngrokd -domain=”ngrok.10086ol.com” -httpAddr=”:80″ -httpsAddr=”:8081″ -tunnelAddr=”:443″),但是我想用来转发TCP所以无法用这个来启动;
用ngrok -config=ngrok.cfg start来启动就如图报错,请问是什么原因?
错误信息:Tunnel mstsc does not specify any protocols to tunnel.
ngrok version:1.7 Centos7
非常感谢,搭建成功了,但是有个问题:
昨日,在搭建成功之后,启动成功了,然后发现自己服务器上的网站不能访问了,我猜原因是端口冲突。
今天,我将服务器重启之后,网站可以访问了,但是在启动ngrok服务器的时候出现“panic: listen tcp :80: bind: address already in use”,80端口冲突;于是我启动ngrok的时候使用8181端口,然后又出现了443端口冲突,请问443端口冲突怎么解决呢。期待您的回复
一般情况不会冲突啊 是不是你服务器搭建了有其他服务再用443端口的
大佬,非常感谢,搭建成功了!!!终于摆脱花生壳了!!谢谢
编译安装那一步时出错了,复制粘贴 make && make install 命令然后回车,下面显示
CC credential-store.o
In file included from credential-store.c:1:0:
cache.h:44:18: fatal error: zlib.h: No such file or directory
#include
^
compilation terminated.
…这是啥情况?
[…] 搭建方案直通车 […]
非常感谢已经搭建成功了,问下,这个跟商业的好像有区别,怎么让路由器穿透?
没区别的 路由器穿透?
非常感谢,经过一天一夜的琢磨,终于成功了!
楼主利好,生成服务端那个步骤做不出来了,安装出口留学软件什么鬼,再说你那两个文件没看见你发下载地址啊,
出国留学就是您能上youtube 那你就出国留学了,说的隐晦点。
下载地址在这篇文章的视频下方,把这两个文件上传,就可以生成服务端了
你好 在中间过程我遇到了一个问题就是找不到go1.4不知道该怎么继续?
能具体说下是操作到哪一步吗?
好的 过段时间我出个 这方面的教程
make release-server release-client
好像是这一步附近
我视频里面也有找不到go1.4的提示,但是没有关系不影响,直接下一步操作就可以了
小哥哥 求出个树莓派lnmp环境的搭建 四次了没搭成
= =‘’ ojbk Thanks♪(・ω・)ノ
很感谢你的教程 在你的教程里最后本地客户端已经成为了外网服务器 在穿透使用后 是客户端用多少流量 腾讯云服务器就用多少流量吗 还是节省了服务器的压力
是的本地服务器用多少流量,腾讯云就是使用多少流量
[…] 搭建方案直通车 […]