搭建内网穿透服务 Ngrok - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LuckSouth
V2EX    分享发现

搭建内网穿透服务 Ngrok

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

    在最近的开发过程中,遇到了一个尴尬的问题,外网环境下无法访问内网(本地虚拟机)的 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 下客户端和相关配置
    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     Solana     2786 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:40 PVG 22:40 LAX 06:40 JFK 09:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86