本文介绍Ngrok服务搭建。Ngrok和花生壳类似都是内网穿透工具,了解更多可以查看另外一篇专门介绍内网穿透工具的文章:内网穿透的几种方式
Ngrok介绍
Ngrok官方介绍是:一个通过任何NAT或防火墙为您的本地主机服务器提供即时,安全的URL的命令。
官方提供了免费的服务器,申请账号后下载客户端就可以直接使用,不过有一些其他限制,比如带宽很小。1.0的客户端和服务端都是开源的,2.0的版本没开源,而且官网找不到开源代码的链接。
Ngrok分为客户端和服务端,使用官网提供的服务,我们就只需要下载一个客户端就可以了,本文不做介绍,我们的重点是,自己搭建服务器。
资源链接
安装服务端
我比较喜欢使用Dcoker,就直接以Docker为例,喜欢安装到本地的,自己去编译源代码。官方的Docker镜像有问题,有个命令使用不兼容,会导致一直无法找到CA文件而启动失败,可以直接使用我重新编译的Docker镜像。
准备证书
推荐使用这篇文章来申请证书文件:免费通配符域名CA证书。通过这种方式生成的证书包括了cert.pem和privkey.pem。
$ mkdir certs
拷贝cert.pem和privkey.pem到certs
目录,还需要转换以下格式:
$ openssl rsa -in privkey.pem -out server.key
$ openssl x509 -in cert.pem -out server.crt
$ cp server.crt ca.crt
现在certs
目录看起来像:
.
├── ca.crt
├── cert.pem
├── privkey.pem
├── server.crt
├── server.key
直接运行docker
docker run -d --net host \
-e DOMAIN="your.domain" \
-v ./certs/server.key:/server.key \
-v ./certs/server.crt:/server.crt \
-v ./certs/ca.crt:/ngrok/assets/client/tls/ngrokroot.crt \
-v ./bin:/ngrok/bin \
yangqiang/ngrok-server
主要会做两件事:
* 会编译好服务端和客户端程序:bin/ngrokd、bin/ngrok
* 会通过编译好的ngrokd程序,启动服务端
到目前位置,服务端就启动好了,客户端可以拷贝到其他机器上去连接到服务端。
通过docker-compse运行
ngrok-server:
restart: always
container_name : 'ngrok-server'
image : 'yangqiang/ngrok-server'
environment :
TZ: 'Asia/Shanghai'
DOMAIN: "your.domain"
volumes :
- './certs/server.key:/server.key'
- './certs/server.crt:/server.crt'
- './certs/ca.crt:/ngrok/assets/client/tls/ngrokroot.crt'
- './bin:/ngrok/bin'
客户端使用
生成的服务端和客户端程序在./bin
目录。服务端会自动启动,需要客户端的话拷贝出去。首先需要准备域名*.your.domain
,通过这个通配域名指向服务端的服务器IP,ngrok会自动分配子域名。
创建配置文件ngrok.yml
server_addr: your.domain:4443
trust_host_root_certs: false
tunnels:
gitlab:
subdomain: gitlab
proto:
https: 10104
http: 10104
简答做一个说明:
server_addr
:是服务端的地址,通过这个地址和端口连接到服务端。tunnels
:通道,通过通道可以建立很多http、https、tcp等连接。subdomain
:子域名proto
:连接协议:http、https、tcp等
上面的配置文件的意思是可以通过:gitlab.your.domain
访问内网的10104端口的gitlab服务。可以通过http和https两种方式。
客户端连接
拷贝刚刚服务器在certs
目录同级的bin目录中的ngrok到本机。
$ chmod +x ngrok
$ ./ngrok -config=ngrok.yml start gitlab
如果有多个可以按照gitlab的配置方式配置,然后启动的时候也需要加上:
server_addr: your.domain:4443 trust_host_root_certs: false tunnels: gitlab: subdomain: gitlab proto: https: 10104 http: 10104 test: subdomain: test proto: http: 8080
然后启动的时候加上新的通道:
$ ./ngrok -config=ngrok.yml start gitlab test
启动成功后,应该是这个界面:
ngrok
(Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding https://gitlab.your.domain -> 127.0.0.1:10104
Forwarding http://gitlab.your.domain -> 127.0.0.1:10104
Forwarding http://test.your.domain -> 127.0.0.1:8080
Web Interface 127.0.0.1:4040
现在就可以通过gitlab.your.domain访问内网的127.0.0.1:10104啦。
通过docker-compse 启动后bin目录下面没有生成 bin/ngrokd、bin/ngrok 这个两个文件,还有docker pull yangqiang/ngrok-server 拉取不到镜像 只能用2.0.2的版本
如果没有就证明 你的docker启动失败了。如果拉不下来镜像 你应该没用vpn。如果你要内网穿透推荐介绍的另外一款frp,现在比较稳定和完善了。
我还是喜欢ngrok多点 ,非docker版本的我已经弄成功,就是一使用证书启动就不行,没有证书就可以,会报证书无效连接不上,我确认我的证书是没有问题,我有空去看看他们的代码好了
可以在服务器上部署ngrok, 又在外网访问本服务器吗?
不可以的 原理就是其他网络访问你外网机器,外网机器转发流量到内网。所以必须要一台可以被外网访问的机器。
我运行
root@zhang:~# docker run -d –net host -e DOMAIN="mywall.tk" -v /root/c erts/server.key:/server.key -v /root/certs/server.crt:/server.crt -v /root/cer ts/ca.crt:/ngrok/assets/client/tls/ngrokroot.crt -v /bin:/ngrok/bin yangqiang/n grok-server:2.0.2
4b6a9f57b8b33c35cdab8f8e913d1de33809ff8e0017086f0b1b4971a6cee9a8
但是我用docker ps 查看创建的容器,却查找不到。貌似容器没有运行。
我使用docker start ID,返回了这容器的ID,但是使用 docker exec -it 4b6a9f57b8b3 /bin/bash进入容器,还是没有这个容器,不知道为什么?
你可以先不用-it 然后启动看看日志。你的问题是容器里面app启动错误。
启动docker是为了编译程序,最后的bin目录里面会有客户端和服务端,服务端在一个外网服务器,客户端就在你的内网去启动。
docker run -d –net host \
-e DOMAIN="your.domain" \
-v ./certs/server.key:/server.key \
-v ./certs/server.crt:/server.crt \
-v ./certs/ca.crt:/ngrok/assets/client/tls/ngrokroot.crt \
-v ./bin:/ngrok/bin \
yangqiang/ngrok-server
命令是为了创建docker容器编译ngrok,那编译好的客户端和服务器端,我如何拷贝出来呢,请版主指点一下,之前docker用的不是很多,不是很了解。如果方便可以加我一下微信:18604316112,和你讨论一下,多谢。
现在主要问题,这个docker容器编译ngrok程序,关键我启动这个容器都启动不起来,不知道为什么呢?好奇怪呀,微信可以发你图片。这里评论好像没法发图片。
编译好的就在你当前目录的bin下面。你的-v 不是指定了./bin这个目录