linux下ngrok配置和使用

什么是Ngrok

Ngrok是一款用go语言开发的开源软件,它是一个反向代理。通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。Ngrok可捕获和分析所有通道上的流量,便于后期分析和重放。

应用场景

用于对处在内网环境中,无外网IP的计算机的远程连接。

Ngrok可以做TCP端口转发,对于Linux可以将其映射到22端口进行SSH连接。Windows的远程桌面可以将其映射到3389端口来实现。同理,如果要做MySQL的远程连接,只需映射3306端口即可。

用作临时搭建网站并分配二级域名,可用作微信二次开发的本地调试。

微信公众平台二次开发时,服务器必须要能通过外网访问,而且必须是80接口。我们一般会在自己的电脑上写代码,但是由于电信运营商将80端口屏蔽了,甚至很多人通过无线路由器上网,根本就没有公网ip。在这种情况下,我们每次都要上传代码到服务器对微信公众平台进行接口调试,十分的不方便。而Ngrok可以将内网映射到一个公网地址,这样就完美的解决了我们的问题。

Ngrok官方为我们免费提供了一个服务器,我们只需要下载Ngrok客户端即可正常使用,但是后来官方的服务越来越慢,直到Ngrok官网被完全屏蔽。现在我们已经无法使用ngrok官方的服务器了。所以,接下来我们自行搭建属于自己的ngrok服务器,为自己提供方便快捷又稳定的服务,一劳永逸。

注意:ngrok.com 提供的服务是基于 ngrok 2.0,github 上目前只有 1.0 的源码,二者功能和命令有一些区别,用的时候别搞混了

编译ngrok

安装go get工具
#ubuntu
apt-get install build-essential golang mercurial git

#centos
yum install mercurial git bzr subversion  golang

#git版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。
yum --disablerepo=base,updates --enablerepo=rpmforge-extras update git
获取ngrok源码
GOPATH=~/goproj
mkdir ~/goproj/src/github.com/inconshreveable
cd ~/goproj/src/github.com/inconshreveable
#官方地址编译时要报错
git clone https://github.com/inconshreveable/ngrok.git
#请使用下面的地址,修复了无法访问的包地址
git clone https://github.com/tutumcloud/ngrok.git ngrok
export GOPATH=~/goproj/src/github.com/inconshreveable/ngrok

修改源代码中库引用的错误
由于google code的关闭,所以我们要把作者代码中的库引用地址修改一下
修改src/ngrok/log/logger.go文件
log "code.google.com/p/log4go" 改为log "github.com/alecthomas/log4go"
注:最新github.com上的代码这个问题已修复
生成自签名证书

使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,我们需要生成自己的证书,并提供携带该证书的ngrok客户端。生成并替换源码里默认的证书,注意域名修改为你自己的。(之后编译出来的服务端客户端会基于这个证书来加密通讯,保证了安全性)

证书生成过程需要一个NGROK_DOMAIN。以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_DOMAIN就是”ngrok.com”,如果你要提供服务的地址为”example.tunnel.imike.me”,那NGROK_BASE_DOMAIN就应该是”tunnel.imike.me”。

cd ngrok
NGROK_DOMAIN="tunnel.imike.me"
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

执行完以上命令,在ngrok目录下就会新生成6个文件

ls -lt                           
总用量 56
-rw-r--r-- 1 root root  973 3月  23 11:23 server.crt
-rw-r--r-- 1 root root   17 3月  23 11:23 base.srl
-rw-r--r-- 1 root root  891 3月  23 11:23 server.csr
-rw-r--r-- 1 root root 1675 3月  23 11:23 server.key
-rw-r--r-- 1 root root 1115 3月  23 11:23 base.pem
-rw-r--r-- 1 root root 1679 3月  23 11:23 base.key

Ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的(因此这一步务必放在编译可执行文件之前)

cp base.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
编译Linux服务端和客户端
make release-server release-client

编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。

编译Linux客户端
make release-client
编译window版本客户端

上述编译过程生成的服务端和客户端都是linux下的,不能在windows下用。如果想编译生成windows客户端,需要重新配置环境并编译。交叉编译过程如下:

进入go目录,进行环境配置
cd  /usr/local/go/src/
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 ./make.bash  
进入ngrok目录重新编译
GOOS=windows GOARCH=amd64 make release-client
编译后,就会在bin目录下生成windows_amd64目录,其中就包含着windows下运行的服务器和客户端程序。
#以上GOARCH=amd64指的是编译为64位版本,如需32位改成GOARCH=386即可
编译arm客户端
cd /usr/lib/golang/src/
sudo GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash
sudo GOOS=linux GOARCH=arm make release-client
编译mac版本客户端
GOOS=darwin GOARCH=amd64 make  release-client

设置域名解析

添加两条A记录:tunnel.imike.me和*.tunnel.imike.me,指向所在的Ngrok服务器ip。

运行Ngrok

服务端启动
nohup ngrokd -domain="onlineweifu.cn" -httpAddr=":8888" &   #后台运行

指定证书、域名和端口启动它(证书就是前面生成的,注意修改域名)

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="tunnel.imike.me" -httpAddr=":8081" -httpsAddr=":8082"
[14:54:30 CST 2016/03/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[14:54:30 CST 2016/03/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
[14:54:30 CST 2016/03/23] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8081
[14:54:30 CST 2016/03/23] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:8082
[14:54:30 CST 2016/03/23] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443

到这一步,ngrok 服务已经跑起来了,可以通过屏幕上显示的日志查看更多信息。httpAddr、httpsAddr 分别是ngrok用来转发http、https服务的端口,可以随意指定。ngrokd还会开一个4443端口用来跟客户端通讯(可通过-tunnelAddr=”:xxx” 指定),如果你配置了iptables 规则,需要放行这三个端口上的TCP协议。

现在通过http://tunnel.imike.me:8081https://tunnel.imike.me:8082就可以访问到ngrok提供的转发服务。

设置开机自动启动ngrok服务
vim /etc/init.d/ngrok_start:
cd /root/goproj/src/github.com/inconshreveable
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="tunnel.imike.me" -httpAddr=":8081" -httpsAddr=":8082"
chmod 755 /etc/init.d/ngrok_start
客户端启动
使用默认配置文件启动

对默认设置文件 ~/.ngrok 进行编辑:

server_addr: tunnel.imike.me:4443
trust_host_root_certs: false
tunnels:
    #http:subdomain: "test"
    web:
        #auth: "AuthUser:AuthPassWord"
        proto:
            http: 80
    ssh:
        remote_port: 12222
        proto:
            tcp: 22

从命令行运行:

./bin/ngrok start web ssh

当客户端使用http/https协议连接,可指定一个二级域名,服务端会分配该二级域名给客户端作为入口,比如web.tunnel.imike.me;

当客户端使用tcp 协议连接,则服务端不会分配二级域名,改为监控一个随机端口,比如 tunnel.imike.me:12345,remote_port可由客户端对该端口进行指定,比如tunnel.imike.me:12222。

使用自定义配置文件

创建一个配置文件ngrok.cfg,内容如下:

vim ngrok.cfg:
server_addr: tunnel.imike.me:4443
trust_host_root_certs: false
映射HTTP
#启动ngrok客户端
#指定子域、要转发的协议和端口,以及配置文件,运行客户端:
#注意:如果不加参数-subdomain=test,将会随机自动分配子域名。
./bin/ngrok -subdomain web -proto=http -config=ngrok.cfg 80

#客户端ngrok正常执行显示的内容
ngrok                                                  (Ctrl+C to quit)

Tunnel Status     online
Version           1.7/1.7
Forwarding        http://web.tunnel.imike.me:8081 -> 127.0.0.1:80
Web Interface     127.0.0.1:4040
# Conn            0
Avg Conn Time     0.00ms

打开浏览器,分别在地址栏中输入http://localhosthttp://web.tunnel.imike.me:8081,如果后者正常显示并且和http://localhost显示的内容相同,则证明我们已经成功了。

映射TCP

有时候,我们使用远程桌面功能,或者在linux中进行SSH连接,对于处在内网环境中的计算机,我们可以对该端口进行TCP映射。

#这里以SSH连接Linux时的22端口为例
./bin/ngrok -config=ngrok.cfg -proto=tcp 22
映射成功的话,会显示如下内容:
#客户端ngrok正常执行显示的内容

ngrok                                                  (Ctrl+C to quit)

Tunnel Status     online
Version           1.7/1.7
Forwarding        tcp://imike.me:12222 -> 127.0.0.1:22
Web Interface     127.0.0.1:4040
# Conn            0
Avg Conn Time     0.00ms

现在,在putty等ssh工具中即可连接imike.me。切记端口是号12222,是随机分配的一个端口号,而不是默认的22端口了。Windows的远程桌面可以将其映射到3389端口来实现。同理,如果要做MySQL的远程连接,只需映射3306端口即可。FTP可映射21端口。

注意:客户端必须使用自己编译的ngrok文件

管理界面

Ngrok客户端运行后,有一个Web Interface地址,这是ngrok 提供的监控界面。通过这个界面可以看到远端转发过来的http 详情,包括完整的request/response 信息,可以不刷新页面通过replay按钮重新发出请求,非常方便。

访问管理界面:http://127.0.0.1:4040

后续定制及优化

通过以上操作,我们的ngrok服务器就已经成功搭建了,客户端也成功的跑了起来。但是,如果我们想要对ngrok进行一些定制和优化,可以参考这些后续定制及优化的方法。

为什么在启动服务端的时候,端口不指定为80

很遗憾,因为这台vps不是只用来做ngrok服务的,我博客还在上面呢,80端口已经被nginx占用了。
那怎么办?不得不提nginx是个牛逼的软件,我们可以在nginx中配置一个server,就绑定web.tunnel.imike.me域名,然后将所有请求转发到后端:8081端口上,这就是反向代理。我发一下自己的nginx配置:

#ngrok.imike.me.conf
upstream ngrok {
    server 127.0.0.1:8888;
    keepalive 64;
}

server {
    listen 80;
    server_name *.onlineweifu.cn;
    access_log /var/log/nginx/ngrok_access.log;
    location / {
        proxy_set_essay-header X-Real-IP $remote_addr;
        proxy_set_essay-header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_essay-header Host  $http_host:8081;
        proxy_set_essay-header X-Nginx-Proxy true;
        proxy_set_essay-header Connection "";
        proxy_pass      http://ngrok;

    }

}
修改客户端ngrok默认服务地址

客户端每次还需要加载配置文件,这样显得有些麻烦。能不能像官方服务那样直接执行命令 ngrok 80就能使用呢?我们只需要在编译客户端之前,稍作修改即可。同样,如果需要指定域名可以执行命令 ngrok -subdomain=test 80来运行客户端。

修改默认服务地址
vim ./src/ngrok/client/model.go
找到第23行,将 defaultServerAddr = "ngrokd.ngrok.com:443"
修改为defaultServerAddr = "tunnel.mydomain:4443" 即可。
修改客户端ngrok左上角蓝色文字logo

运行客户端后,我们会发现在客户端左上角会有一个蓝色字体的”ngrok”字样的文字logo,如果觉得不太喜欢,或者想修改一下的话,可以在编译客户端之前,作如下修改。

修改客户端蓝色文字logo
Vim ./src/ngrok/client/views/term/view.go
找到第100行,将
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
修改为
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
即可。
修改客户端帮助信息

Ngrok客户端默认的帮助信息很少,我们可以在编译客户端之前,自己定制帮助内容。

修改客户端默认帮助信息
vim ./src/ngrok/client/client/cli.go
找到第14行,修改 const usage2 string的值即可。
客户端程序加壳优化

编译好的Windows客户端ngrok.exe大小为10MB,感觉有点大,这样加载到内存中,需要读取硬盘的内容也相对较多,影响速度。所以,我们来给客户端程序加个压缩壳,对程序进行压缩。
这里采用mpress进行加壳,先从网上下载mpress.exe,之后将ngrok.exe拖放到mpress.exe的图标上,就能完成加壳操作。我们可以看到,加壳后的程序只有1.94MB,压缩率不到20%,大大节省了磁盘空间。同时小文件加载起来,速度会更快。

常见错误

在编译ngrok的时候,安装yaml的时候不能下载,无反应
gopkg.in/inconshreveable/go-update.v0  (download)
或者
gopkg.in/yaml.v1 (download)
原因git版本太低,需>= 1.7.9.5,通过RPMForge源安装最新版本git解决:
yum --enablerepo=rpmforge-extras install git
把编译出来的32位客户端放在64位上运行时会报错
/lib/ld-linux.so.2: bad ELF interpreter

#解决方法
yum install -y glibc.i686
在ngrok目录下执行如下命令,编译ngrokd
$ make release-server

出现如下错误:
GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/client/assets/assets_release.go \
        assets/client/…
make: bin/go-bindata: Command not found
make: *** [client-assets] Error 127
go-bindata被安装到了$GOBIN下了,go编译器找不到了。修正方法是将$GOBIN/go-bindata拷贝到当前ngrok/bin下。

$cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin
客户端ngrok.cfg中server_addr后的值必须严格与-domain以及证书中的NGROK_BASE_DOMAIN相同,否则Server端就会出现如下错误日志
[03/13/15 09:55:46] [INFO] [tun:15dd7522] New connection from 54.149.100.42:38252
[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Waiting to read message
[03/13/15 09:55:46] [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate
[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Closing


服务器启动ngrok:nohup ngrokd -domain="onlineweifu.cn" -httpAddr=":8888" -httpsAddr=":8889" &

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Linux的ngrok命令是一种用于将本地服务器映射到公共互联网的工具。ngrok可以实现将本地的Web服务器、SSH服务器以及其他TCP流量通过ngrok服务公开,从而允许外部用户访问本地服务器提供的服务。ngrok使用非常简单,以下是ngrok命令的相关参数和用法: 1. 下载ngrok二进制文件: 在ngrok官方网站上下载适用于Linux系统的ngrok二进制文件。 2. 解压缩二进制文件: 使用tar命令解压缩下载的ngrok二进制文件。 3. 验证授权: 运行./ngrok authtoken [your_auth_token]命令,将[your_auth_token]替换成在ngrok官方网站创建的ngrok帐户的认证令牌。 4. 启动ngrok: 在命令行中运行./ngrok [options] [port]命令,将[options]替换为ngrok的参数选项,[port]替换为要暴露的本地服务器的端口号。例如,./ngrok http 80将本地的Web服务器映射到ngrok服务。 5. 访问公开地址: ngrok命令运行后,会显示生成的公开URL。将该URL共享给外部用户,他们就可以通过该URL访问本地服务器提供的服务。 ngrok命令帮助开发者轻松公开本地服务器,方便测试和调试。但需要注意的是,ngrok在生产环境中不建议使用,因为其性能和安全性可能不如其他专门的部署工具。 ### 回答2: ngrok是一个开源的跨平台的内网穿透工具,也是一种将本地端口映射到公网上的穿透技术。它能够将本地主机部署在NAT之后的内网通过反向代理的方式映射到公网上,使得外网用户可以通过指定的域名或者临时生成的URL来访问内网服务。 通过ngrok,可以很方便地在本地搭建web服务器或其他需要对外提供服务的应用,并能够直接通过外网访问,从而方便进行调试、演示或与外部系统交互。 ngrok命令的基本用法如下: 1. 下载和安装ngrok: 可以上ngrok的官方网站下载适用于你的操作系统版本的ngrok,并解压到合适的目录。 2. 注册ngrok帐号: 在ngrok官网注册一个帐号,登录后可以获取认证令牌,用于配置ngrok。 3. 配置ngrok: 在ngrok的根目录下创建一个名为ngrok.yml的配置文件,并在其中填入你的认证令牌。 4. 启动ngrok: 在终端中进入ngrok的根目录,使用`./ngrok [参数] 本地端口号`命令启动ngrok,将本地端口号替换为你想要映射的本地服务的端口号。 启动后,ngrok会为你的本地服务生成一个临时的公网URL或者自定义的域名,你可以通过这个URL来访问你的本地服务。ngrok还提供了丰富的配置选项,可以通过`./ngrok help`命令来查看详细的使用文档和参数选项。 总之,ngrok是一个非常方便的工具,能够快速建立起内网和外网之间的通道,使得内网的服务可以对外部用户可见,为开发和测试带来了很大的便利。 ### 回答3: Linux ngrok 命令是一个用于将本地主机或局域网服务映射到公网的工具。它借助于ngrok.com提供的服务,通过穿透内网的方式,使得外网可以访问到本地的服务。 使用ngrok命令,你可以很方便地将本地的Web服务器、SSH服务或其他TCP协议的服务暴露到互联网上,方便你与他人共享和测试。 使用ngrok命令,首先需要下载并安装ngrok客户端。下载地址可以从ngrok官网获取。安装完成后,使用以下命令将ngrok客户端进行配置: ./ngrok authtoken 你的认证token 认证token可以在ngrok官网的个人控制台中找到。完成认证后,你就可以使用ngrok来映射你的服务了。 下面是一些常用的ngrok命令: 1. ngrok http 80 :将本地80端口的Web服务映射到公网。 2. ngrok tcp 22 :将本地22端口的SSH服务映射到公网。 3. ngrok start appname :启动名为appname的配置文件中的服务映射。 4. ngrok status :查看当前的ngrok连接状态。 5. ngrok help :获取帮助文档,查看更多可用的命令选项。 值得注意的是,ngrok为了安全考虑,默认会随机分配一个二级域名。如果你需要使用自定义的域名,可以通过配置文件来进行设置。 总而言之,ngrok是一个非常实用的工具,可以帮助你轻松地将本地的服务映射到公网,方便与他人共享和测试。同时,它还提供了丰富的命令选项,可以满足不同场景下的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值