ngrok服务实现内网穿透

2023-11-13

自建ngrok服务实现内网穿透

名词解释

内网穿透,又叫NAT穿透,是计算机用语,翻译过来就是你的电脑可以直接被你朋友访问。 通常我们的电脑是无法自己被访问的。因为我们的电脑缺少自己的独立的ip地址。现在ip稀缺,电信运营商已经不会随便分配固定ip给个人。

通常实现内网穿透,是通过路由器上端口映射来实现的。但是路由器通常不是每个人都有权限可以访问和设置,而且可能存在多级路由器较为复杂的网络结构。端口映射也无法实现。

这就需要ngrok来实现了。

原理

ngrok 建立一个隧道,将主机A的http请求 传递给 主机B,从而实现内网穿透。

ngrok分为client端(ngrok)和服务端(ngrokd),

实际使用中的部署如下:

图中内网主机上安装客户端。
公网主机 安装服务端。
client public 则代表 访问你电脑的用户或者朋友。

实践

现在都云时代,各种服务都能找到提供商。内网穿透也是如此。ngrok服务端相当麻烦,如果你只是简单的穿透,又不是什么敏感信息,可以找到很多服务提供商。例如https://ngrok.com/

./ngrok http 4444

ngrok by @inconshreveable                                                                                                                                                                                                     (Ctrl+C to quit)

Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://ada02116.ngrok.io -> localhost:4444
Forwarding                    https://ada02116.ngrok.io -> localhost:4444

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

如果此时访问 http://ada02116.ngrok.io 则等于访问了 localhost:4444

自建ngrok服务

使用别人的服务,存在一些限制。例如不稳定、安全问题,费用昂贵等。因此可能需要自己搭建ngrok服务端。
自建服务需要具备的条件:
1、具备独立ip的服务器。例如阿里云、腾讯云等。 我个人使用的阿里云ecs
2、需要域名。如果是国内则需要备案。我个人的域名是 xxxx.com

  • 配置域名
    增加2条A记录,指向你的服务器。这里我配置的是 ngrok.xxxx.com 和 *.ngrok.xxxx.com

     

    添加安全组。

  • 开放3个端口。这里我选择4443、4444、8081端口。
    其中4443是ngrok自身通信使用。
    4444 后面tcp端口转发使用。
    8081 则是http请求转发使用。默认是80 但是这里80端口我分配给nginx了。
    截图中少截图了4444的配置。

    编译服务端。这里采用docker镜像来实现。

  • 登录服务器,创建文件夹 ngrok-server ,包含2个文件
    文件Dockerfile 内容如下
FROM golang:1.7.1-alpine
ADD build.sh /
RUN apk add --no-cache git make openssl
RUN git clone https://github.com/inconshreveable/ngrok.git --depth=1 /ngrok
RUN sed -i "109,109s/tcp/tcp4/g" /ngrok/src/ngrok/server/tunnel.go
RUN sed -i  "57,57s/tcp/tcp4/g" /ngrok/src/ngrok/conn/conn.go
RUN sh /build.sh
EXPOSE 8081
VOLUME [ "/ngrok" ]
CMD [ "/ngrok/bin/ngrokd"]

文件build.sh内容如下

export NGROK_DOMAIN="ngrok.xxxx.com"
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
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

make release-server
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client

需要修改的地方是
export NGROK_DOMAIN="ngrok.xxxx.com"
修改为你自己的域名。

  • 构建镜像。
    运行
docker build -t ngrok .

注意 最后一个 . 别少了。

  • 启动容器
    运行
docker run -it  -p 8081:8081 -p 4443:4443 -p 4444:4444  -d ngrok /ngrok/bin/ngrokd -domain="ngrok.xxxx.com" -httpAddr=":8081"

注意修改这里的ngrok.xxxx.com为你自己的域名。

到这里ngrok服务端已经完成。

  • 下载客户端。
    进入上面启动的容器,下载对应的客户端。
    例如容器id c71b99a242fa
    运行 docker inspect c71 可以查看这个容器的具体信息。

    进入图中划线的目录下,再进入Bin下。

这里就是客户端。对应的不同系统的版本。
我个人电脑是mac,64位系统 ,需要选择 darwin_amd64文件夹下载。
386代表是 32系统。amd64表示 64位。
linux和window无需多言。

下载命令可以通过很多方式。例如ftp或者scp命令。
我选择的是scp命令。

scp -P 你的服务端端口 -r  root@你的服务端ip地址:/var/lib/docker/volumes/6e5383924c5caf1b1b61250f31aa002308dcb371ebd9a7efad2419e20107a362/_data/bin/darwin_amd64/ngrok  ./ngrok

这里要注意下权限,如果你不是用root,可能没法子拷贝。

  • 配置客户端
    创建配置文件 config.yml,其中内容如下
server_addr: "ngrok.xxxx.com:4443"
trust_host_root_certs: false
tunnels:
  webapp:
   proto:
     http: 8081
   subdomain: test
  tcp12345:
    remote_port: 4444
    proto:
      tcp: 12345

注意修改ngrok.xxxx.com为自己的域名。
这里配置了2个隧道。一个http的请求,一个tcp转发。

  • 启动客户端
./ngrok  -config=config.yml start-all

在浏览器访问 上图中地址即可看到本地内容。

增加tcp的转发截图。

测试下12345端口的功能。

  • 监听12345端口。
    执行
nc -l 12345
  • 在其他电脑或者本地执行
 nc ngrok.xxxx.com 4444

这样就可以了。输入和输出都会显示。
如图

最后

docker真得降低了很多问题的难度。

补充

微信公众号和小程序的开发中,需要http和https。 这里的请求都携带了端口,不符合要求。
由于我的服务器 80和443都分配给了nginx容器,因此这里无法测试。

下面是本人没测试的方案,主要是替换证书。

  • 启动容器的时候指定证书路径,映射80和443端口
docker run -it  -p 80:80 -p 443:443 -p 4443:4443   -d ngrok /ngrok/bin/ngrokd -domain="ngrok.xxxx.com" -tlsKey="/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/ngrok/assets/server/tls/snakeoil.crt"

这里使用是自建证书,是不被浏览器认可的。建议去申请免费证书。
然后将证书 挂载到镜像,再启动服务端。

已知的问题

因为ngrok会默认监听IPv6端口,考虑到国内的网络环境,我们需要修改一下代码,否则将无法使用。主要修改两个地方,一个是src/ngrok/server/tunnel.go的109行net.ListenTCP后面的"tcp"改成"tcp4",另一处是src/ngrok/conn/conn.go的57行的net.Listen后的"tcp"同样改成"tcp4"。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ngrok服务实现内网穿透 的相关文章

随机推荐

  • docker启动MYSQL8并挂载数据目录

    1 创建需要docker挂载的数据目录 mkdir p datah mydata mysql conf mkdir p datah mydata mysql data mkdir p datah mydata mysql log mkdir
  • 解析 global-metadata.dat 文件_自己动手做简历解析工具

    当我还是一名大学生的时候 我很好奇自动提取简历信息是如何工作的 我将准备各种格式的简历 并上传到招聘网站 以测试背后的算法是如何工作的 我想自己尝试建一个 因此 在最近几周的空闲时间里 我决定构建一个简历解析器 一开始 我觉得很简单 只是用
  • 备战数学建模42-缺失值和异常值的处理方法(攻坚战6)

    在数据建模中 对给出的数据进行预测处理是很重要的 当然一般考虑有归一化或者规范化等方法对数据进行预处理 这都是在数据完整和没有异常的情况下 需要考虑的 当数据量非常大的时候 往往容易出现数据缺失或者异常的现象 如果数据有确实或者有异常值 我
  • windows xp 驱动开发(七)WDK源码 UsbSamp例子的编译及使用

    转载请标明是引用于 http blog csdn net chenyujing1234 参考文章 http msdn microsoft com zh cn library windows hardware ff544747 欢迎大家提出意
  • Ubuntu android adb环境变量配置方法AndroidStudio安装教程

    UbuntuT android adb环境变量配置方法 https wenku baidu com view 61d31d4ef6335a8102d276a20029bd64793e6275 html AndroidStudio安装教程 u
  • file_operations 结构体

    file operations 结构体中的成员函数是字符设备驱动程序设计的主体内容 这些函数实际会在应用程序进行 Linux 的 open write read close 等系统调用时最终被调用 file operations 结构体目前
  • 辐射骚扰测试软件,电磁兼容EMC测试

    1 什么是辐射 RE 测试 辐射发射 Radiated Emission 测试是测量EUT通过空间传播的辐射骚扰场强 可以分为磁场辐射 电场辐射 前者针对灯具和电磁炉 后者则应用普遍 另外 家电和电动工具 AV产品的辅助设备有功率辐射发射的
  • JAVA为什么只有一个public_浅谈为什么一个Java源文件中只能有一个public类?

    第一 只有一个public类 浅谈为什么一个java源文件中只能有一个public类 1 每个编译单元 文件 只能有一个public 类 这么做的意思是 每个编译单元只能有一个公开的接口 而这个接口就由其public 类来表示 2 java
  • 20.9.7 项目开发总结报告

    项目开发总结报告 项目总结最后价值的东西是经验 教训的总结 项目开发总结报告的编制 根据GB T 8567 2006的规定 项目总结报告应包含以下几个部分的内容 1 引言 标识 系统概述 文档概述 2 引用文件 引用文档的编号 标题 修改版
  • Coding and Paper Letter(六十四)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 资源整理 1 Coding 1 交互式瓦片编辑器 tile playground 2 R语言包autokeras autokeras的R接口 autokeras是一个开源的
  • aix date 脚本_AIX下取前一天时间

    AIX的默认dtae命令是不支持 d参数的 导致大家写脚本很痛苦 没法简单取得前一天的时间 下面有简单方式可以取得 YESTERDAY TZ aaa24 date Y m d echo YESTERDAY 或者是 bin sh TZ TZ
  • Java基础面试题

    怎么理解栈 堆 堆中存什么 栈中存什么 栈是运行时的单位 而堆是存储的单位 栈解决程序的运行问题 即程序如何执行 或者说如何处理数据 堆解决的是数据存储的问题 即数据怎么放 放在哪儿 堆中存的是对象 栈中存的是基本数据类型和堆中对象的引用
  • docker,nvidia-docker安装

    卸载先前的docker Docker 的旧版本被称为 docker docker io 或 docker engine 如果已安装 请卸载它们 sudo apt get remove docker docker engine docker
  • 操作系统笔记整理11——文件和文件系统

    点此链接可跳转到 操作系统笔记整理 目录索引页 参考书籍 计算机操作系统 第四版 汤小丹等编著 文章目录 点此链接可跳转到 操作系统笔记整理 目录索引页 数据项 记录和文件 数据项 记录 文件 文件系统 对象及其属性 对对象操纵和管理的软件
  • 【SP】SubstancePainter安装相关问题

    SP SubstancePainter安装相关问题 安装成功后主要有两个配置问题 驱动和TDR问题 GPU驱动更新 1 从设备管理器中联网搜索驱动会提示以更新至最新版本等类似话语 因此从官网下载驱动 以1050ti显卡为例 下载地址 英伟达
  • 深度学习和图像识别:使用R语言的深入指南

    目录 深度学习简介 准备工作 数据集 构建模型 训练模型 评估模型 结论
  • unity 实现多个物体或单个物体 让其单击物体让其显示再次单击让其隐藏

    unity 实现单击物体让其显示或隐藏 再次单击显示或隐藏 using System Collections using System Collections Generic using Unity Burst CompilerServic
  • SpringBoot去掉jackson并整合Gson

    SpringBoot去掉jackson并整合Gson
  • 微信公众平台——获取用户信息

    第一次握手 获取code code根据用户随机产生 在网页中缓存 注意这个code并不是微信的id 访问 https open weixin qq com connect oauth2 authorize appid redirect ur
  • ngrok服务实现内网穿透

    自建ngrok服务实现内网穿透 名词解释 内网穿透 又叫NAT穿透 是计算机用语 翻译过来就是你的电脑可以直接被你朋友访问 通常我们的电脑是无法自己被访问的 因为我们的电脑缺少自己的独立的ip地址 现在ip稀缺 电信运营商已经不会随便分配固