V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LuckSouth
V2EX  ›  分享发现

搭建内网穿透服务 Ngrok

  •  1
     
  •   LuckSouth · 2017-03-14 23:08:52 +08:00 · 11083 次点击
    这是一个创建于 2812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在最近的开发过程中,遇到了一个尴尬的问题,外网环境下无法访问内网(本地虚拟机)的 Ubuntu 系统中的 WEB 服务,很难将自己做好的网站和页面展示给别人看,并接受对方的意见实时进行修改.
    之前在开发参赛项目的时候有用到过 Ngrok 转发进行团队内部的交流,于是在网上搜索了几个 Ngrok 的服务,然而用起来都不尽如人意,就打算用 Qcloud 上的 Ubuntu 服务器,试着自己搭建一个 Ngrok 的服务器,用于内网穿透。

    先介绍一下 Ngrok

    Ngrok on github

    Ngrok is a tunneling, reverse proxy that establishes secure tunnels from a public endpoint to a locally running network service while capturing all traffic for inspection and replay.

    翻译一下:

    Ngrok 是一个隧道,即建立安全通道从公共端点到本地运行的网络服务,同时捕捉检查和重播所有流量的反向代理。

    简单来说,他可以代理你本地的数据,并将其转发到外网。

    闲话少许,撸起袖子加油干

    Step1:安装 git 和 Golang

    Git是啥,是干什么用的,在此我就不过多阐述了!

    # sudo apt-get install build-essential golang mercurial git
    

    Golang,Go 语言支持,因为 Ngrok 是基于 Go 语言编写的

    这里我都已经安装了,没有安装的按照提示安装即可

    Step2:获取 ngrok 源码

    此处使用非官方地址,修复了部分包无法获取

    # git clone https://github.com/tutumcloud/ngrok.git ngrok
    

    # cd ngrok

    Step3:生成自签名证书

    使用 ngrok.com 官方服务时,我们使用的是官方的 SSL 证书。自建 ngrokd 服务,如果不想买 SSL 证书,我们需要生成自己的自签名证书,并编译一个携带该证书的 ngrok 客户端。

    证书生成过程需要一个 NGROK_BASE_DOMAIN。 以 ngrok 官方随机生成的地址 693c358d.ngrok.com 为例,其 NGROK_BASE_DOMAIN 就是“ ngrok.com ”,如果你要 提供服务的地址为“ example.ngrok.xxx.com ”,那 NGROK_BASE_DOMAIN 就应该 是“ ngrok.xxx.com ”。这里呢,我替换成自己的域名 “ ngrok.mdzz2333.cn
    这个地方大家也要提前准备好自己的域名,没有多余域名的同学呢,就可以给自己的域名添加一个二级域名来解决.

    *注意:下述指令中的域名要换成大家自己的哦,不然就绑定到我的域名上去了~

    $ cd ngrok

    #NGROK_DOMAIN="ngrok.mdzz2333.cn"

    #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

    执行完后

    替换:

    # cp base.pem assets/client/tls/ngrokroot.crt
    

    Step4:编译

    # sudo make release-server release-client
    

    这一步骤等待时间较长,成功编译后,会在 bin 目录下找到 ngrokd 和 ngrok 这两个文件。

    Step5:启动服务端

    前面生成的 ngrokd 就是服务端程序了,指定证书、域名和端口启动它(证书就是前面生成的,注意修改域名):

    # sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.mdzz2333.cn" -httpAddr=":8081" -httpsAddr=":8082"
    

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

    现在,通过 http://ngrok.mdzz2333.cn:8081http://ngrok.mdzz2333.cn:8082 (大家要访问自己的域名哦) 就可以访问到 ngrok 提供的转发服务。为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。

    访问后看到提示:

    Tunnel pub.imququ.com:8081 not found

    这说明万事俱备,只差客户端来连了。

    在服务端为了保证服务的一直启动,可以使用 screen,此处略过

    Step6:客户端

    单有服务端,你转发什么捏?肯定要在你需要发布内容( web,服务)的设备上安装匹配的客户端啊。在这里,我使用的服务器是 ubuntu,而需要转发的服务器,也是 ubuntu,就省去了重新编译这一环节。

    将 /ngrok/bin 目录下的 ngrok 通过 ssh 的 scp 指令下载到当前客户端所在的系统中。

    # scp username@serverIp:/ngrok/bin/ngrok /home/ubunutu/ngrok
    

    上述指令根据服务器信息和本地路径替换

    创建一个 ngrok 配置文件:ngrok.cfg

    写入以下内容:

    server_addr: “ ngrok.mdzz2333.cn:4443"

    trust_host_root_certs: false

    注意:这里的 server_addr 换成前面配置的自签名证书中的域名

    另外,这个域名请提前解析到服务器 IP,参考如下:

    接下来只需要指定子域、要转发的协议和端口,以及配置文件,运行客户端:

    #./ngrok -subdomain pub -proto=http -config=ngrok.cfg 80
    

    如果没有错误,就会出现下面的界面

    这表示转发成功,转发后的端口号,是在服务端中设置的端口号,转发为你填写的本地端口号。

    在本地环境访问 Web Interface 也可以查看该端口转发下的请求

    一个简单的 ngrok 转发就配置好了,只需要一个外网服务器和域名,就可以轻松的将你所有的内网服务器 /虚拟主机 /SSH 转发到外网。

    本文首发 ubuntu 搭建内网穿透服务 Ngrok | Derwer 说 | 世界就在你眼前

    转载自腾讯云技术社区-腾云阁 以确认授权

    第 1 条附言  ·  2017-03-15 22:59:50 +08:00
    搭建内网穿透服务 Ngrok 之编译 Win 下客户端和相关配置
    https://www.v2ex.com/t/347763
    17 条回复    2017-10-30 17:03:26 +08:00
    LU35
        1
    LU35  
       2017-03-14 23:24:47 +08:00
    好麻烦,有个 V 友做的 frp 很不错,也非常简单.
    LuckSouth
        2
    LuckSouth  
    OP
       2017-03-14 23:45:36 +08:00
    @LU35 自己搭建其实难度也不大啊,重在动手嘛~ 用现成的当然也可以喽
    paubrk
        3
    paubrk  
       2017-03-15 05:56:11 +08:00
    请问怎么编译 windows 客户端
    我尝试了是这样的...


    # GOOS=windows GOARCH=amd64 make release-client
    bin/go-bindata -nomemcopy -pkg=assets -tags=release \
    -debug=false \
    -o=src/ngrok/client/assets/assets_release.go \
    assets/client/...
    bin/go-bindata -nomemcopy -pkg=assets -tags=release \
    -debug=false \
    -o=src/ngrok/server/assets/assets_release.go \
    assets/server/...
    go get -tags 'release' -d -v ngrok/...
    go install -tags 'release' ngrok/main/ngrok
    go install: cannot install cross-compiled binaries when GOBIN is set
    make: *** [client] 错误 1
    LuckSouth
        4
    LuckSouth  
    OP
       2017-03-15 10:08:21 +08:00
    @paubrk win 客户端参考这篇文章 https://www.derwer.com/tesh/ngrokconfig.html
    sunnywolf
        5
    sunnywolf  
       2017-03-15 10:13:49 +08:00
    好像说是开源版本的有漏洞?
    x537196
        6
    x537196  
       2017-03-15 16:45:57 +08:00
    客户端提示
    Tunnel Status reconnecting
    是什么毛病?
    googlebot
        7
    googlebot  
       2017-03-15 17:38:50 +08:00 via Android
    这种东西很危险的
    crytis
        8
    crytis  
       2017-03-15 17:39:47 +08:00 via iPhone
    好 不过用现成的最方便
    LuckSouth
        9
    LuckSouth  
    OP
       2017-03-15 18:27:06 +08:00
    @x537196 确地服务开启了吗?
    x537196
        10
    x537196  
       2017-03-15 18:34:21 +08:00
    @LuckSouth 查了日志,提示: control recovering from failure x509: certificate signed by unknown authority
    google 了一圈 ,不知道怎么解决
    LuckSouth
        11
    LuckSouth  
    OP
       2017-03-15 22:13:03 +08:00
    @x537196 问题应该出在域名自签名那里,你检查一下重新执行看看
    x537196
        12
    x537196  
       2017-03-16 09:49:38 +08:00
    @LuckSouth 好的
    wujunze
        13
    wujunze  
       2017-10-30 13:47:45 +08:00
    @x537196 #6 我也遇到了这个问题 你解决了没有 分享一下
    x537196
        14
    x537196  
       2017-10-30 16:11:38 +08:00   ❤️ 1
    wujunze
        15
    wujunze  
       2017-10-30 16:21:53 +08:00
    @x537196 #14 3Q
    wujunze
        16
    wujunze  
       2017-10-30 16:59:33 +08:00
    @LU35 #1 求 V 友做的 frp 网站 URL 稳定吗?
    LU35
        17
    LU35  
       2017-10-30 17:03:26 +08:00 via Android
    @wujunze github 上搜索 frp
    使用时间不长,还比较稳定吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4878 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:03 · PVG 18:03 · LAX 02:03 · JFK 05:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.