利用ngrok实现内网穿透

原文地址:https://blog.qjm253.cn/?p=395

包含依赖包的项目(可直接编译):https://github.com/SunnyQjm/ngrok

实现内网穿透紫ngrok无法通过天墙之后,国内也出现了一批成熟的商业化实现方案,诸如花生壳、net123、Sunny-ngrok等。不过免费的极不稳定还有流量带宽限制,最后还是决定自己搭一个。本文利用ngrok搭建一个用于内网穿透的环境。需求是通过一层反向代理,实现通过一个外网域名访问一个部署在局域网上的服务。

准备

  • 一个公网服务器(Linux系统) ==> 阿里云,腾讯云之类的都行
    • 这个公网服务器主要用作反向代理,我们在本文中称之为VPS服务器
  • 一个独立的域名
  • 一个用于提供服务的本地PC

步骤

  • GO语言环境搭建

    ngrok项目是用GO语言实现的,需要先安装GOLANG开发环境,系统不限,因为GO语言是跨平台的!安装过程很简单,参考官网的教程即可!

  • 获取ngrok源码

    # 下面是直接去ngrok的github地址下载(待会儿make的时候还会需要装几个其它的依赖,可能会出现很多问题)
    git clone https://github.com/inconshreveable/ngrok.git
    
    # 下面是笔者将代码clone下来,并添加了相应依赖之后的地址,如果用上面的方式出现错误,可以clone下面的地址
    git clone https://github.com/SunnyQjm/ngrok.git
    
  • 解析域名

    因为我们自己搭建,需要使用自己的域名(以 test.j.cn )为例,我们需要做以下解析:

    test.j.cn    ------------> A记录到你的VPS服务器的IP
    
    # ngrok可以指定子域名,下面的解析方式可以让任意子域名都能得到正确的解析
    *.test.j.cn  ------------> CNAME记录到 test.j.cn
    
  • 生成签名证书

    • 因为我们是自己搭建,就不能用ngrok官方的SSL证书,需要自己生成
    • 下面生成证书在编译项目的时候要用到,所以务必要在编译之前生成
    • 需要注意的是,客户端和服务器的证书必须是同一份,这样在程序在认证的时候才能正确解析
    # 首先导出环境变量,将下面的值替换成你的域名
    export NGROK_DOMAIN="test.j.cn"
    
    #先进入到ngrok的根目录,生成证书的操作需要在根目录下进行
    cd ngrok
    
    # 下面的命令用于生成证书
    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
    
    # 下面的命令用于将我们生成的证书替换ngrok默认的证书
    cp rootCA.pem assets/client/tls/ngrokroot.crt
    cp device.crt assets/server/tls/snakeoil.crt
    cp device.key assets/server/tls/snakeoil.key
    
  • 编译运行

    • 服务端(VPS服务器一端)

      • 首先指定一下环境变量,在不同的操作系统下需要指定不同的环境变量,才能正确编译(默认是Linux 64位的配置,如果你的服务器是64位的Linux系统,也可以不指定,直接用默认的就行)

          GOOS=linux GOARCH=amd64
          #如果是32位系统,这里 GOARCH=386
          #如果是windows系统,GOOS=windows
        
      • 然后make出服务端程序

        make release-server
        
      • 如果编译成功,你会在bin目录下看到ngrokd程序

        cd bin
        
        # 查看使用帮助
        ./ngrokd -h
        
      • 查看使用帮助

        # 查看使用帮助
        ./ngrokd -h
        -domain string
            Domain where the tunnels are hosted (default "ngrok.com")
        -httpAddr string
            Public address for HTTP connections, empty string to disable (default ":80")
        -httpsAddr string
            Public address listening for HTTPS connections, emptry string to disable (default ":443")
        -log string
            Write log messages to this file. 'stdout' and 'none' have special meanings (default "stdout")
        -log-level string
            The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG")
        -tlsCrt string
            Path to a TLS certificate file
        -tlsKey string
            Path to a TLS key file
        -tunnelAddr string
            Public address listening for ngrok client (default ":4443")
        
      • 启动服务端

        # 如果不能执行,你可能需要用 sudo chmod +x ngrokd 给它执行权限
        # domain域输入之前生成证书时指定的域名
        # httpAddr 指定转发http协议的哪个端口
        # httpAddrs 指定转发https协议的哪个端口(如果不需要可以省略)
        ./ngrokd  -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":4433"
        
      • 如果执行成功,你会看到类似以下界面:

        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:9748
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
        [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
        
      • 自此,服务端算是配置好了

    • 客户端(部署了服务,需要内网穿透访问的主机)

      客户端要做的事情就是指定把本机的那个端口暴露给VPS服务器,客户端要在该端口上部署了服务(web服务或者tomcat服务等),这样VPS就能够将请求转发到该端口对应的服务上了

      # 因为前面说过,服务端和客户端的证书要是同一份,这样认证才能通过,所以好的解决方案是在服务端上把客户端程序也编译出来,然后通过scp命令拷贝到客户端
      # 假设我要在mac上运行客户端,需要在编译命令前加上一些参数(如果客户端服务器也是Linux 64位,则不用指定环境变量)
      GOOS=darwin GOARCH=amd64 make release-client
      make release-client
      
      # 编译好后scp到本地
      scp xxx xxx
      
      # 下面开始本地配置(下面的配置在客户端进行)
      
      # 新建一个配置文件(在ngrok/bin目录下)
      vim ngrok.cfg
      
      # 添加一下两行
      # 第一行是将要绑定的域名+4443端口(因为ngrok服务端默认有一个服务是坚挺在4443端口的,客户端会通过这个端口与之相连)==> 记得将域名换成自己在生成证书时指定的
      server_addr: "test.j.cn:4443"
      trust_host_root_certs: true
      
      # 帮助信息
      ./ngrok -h
      Examples:
          ngrok 80
          ngrok -subdomain=example 8080
          ngrok -proto=tcp 22
          ngrok -hostname="example.com" -httpauth="user:password" 10.0.0.1
      
      # 80就是我们要转发的端口了
      ./ngrok -config=./ngrok.cfg 80
      
      # 指定协议和端口,不指定默认是 http+https
      ./ngrok -config=./ngrok.cfg -proto=tcp 22
      
      # 指定子域名,不指定就会随机生成
      ./ngrok -config=./ngrok.cfg -subdomain=test 80
      
      • 连接成功会显示如下状态:
        image
      • 在浏览器中输入http://127.0.0.1:4040 就可以看到请求的具体信息了!是不是很神奇!

注意

上文中所有出现域名的地方都要统一,客户端和服务端的证书要是同一份,否则在连接的时候会出现bad certification

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 需要先安装go环境设置环境变量12345 # 可以根据自己需要调整路径 echo 'export GORO...
    加菲猫Jack阅读 1,952评论 3 1
  • 你对我再好怎有我亲妈带我好,为什么我们不感激妈妈对我们的点点滴滴的好呢,是因为妈妈总在为我们着想,我们习惯了这份爱...
    钰丹庭阅读 148评论 0 1
  • 半绘山河半民生 文光熠熠射苍穹, 矢志师摹唐宋韵, 弘扬文化唱大风。
    湘水碧波阅读 445评论 1 1
  • 真心的,别跟我说BIM,我反应大 老板说了,给我学习BIM去 听着感觉不学就要失业的赶脚,肿么办? 老板的话谁敢质...
    图驴阅读 440评论 0 0