Jan 10,2017 in 教程 read (14235) | 百度已收录 | Author: Leonn

目录

  1. 背景
  2. NAT 穿透原理
    1. 一个栗子
  3. Ngrok
    1. 准备工作
  4. 编译服务端
  5. 服务端
    1. 测试连接
  6. 编译客户端
  7. 客户端
  8. 未完待续
  9. 参考资料

背景

  • 很多时候,我们都有这样的需求:需要将本地正在开发的服务暴露在公网上,也就是从外网直接访问我们本机上的服务。

  • 正常情况下,这是办不到的,因为我们的本机并没有公网 IP,我们的本机处在内网当中。

NAT 穿透原理

这里需要顺手提及一个知识:NAT 穿透。

一个栗子

我们的机器一般都在路由器的内网当中,IP 地址基本上都是192.168.x.x系列,我们并没有公网 IP,那么如何访问外网呢?

  • 我们打开浏览器访问 Google,Google 与我们主机之间如何通信?
    假设我们主机 IP 为192.168.0.100,路由器 LAN IP 为192.168.0.1,WAN IP 为211.22.145.234(这是一个公网 IP),Google 服务器 IP 为74.125.204.101

  • 详细通信流程如下:

    • 主机构建 HTTP 请求数据包,目标 IP 为74.125.204.101,目标端口80/443,源 IP 为192.168.0.100,源端口随机生成,假定为5000
    • 主机检查目标 IP 地址,发现不在一个网段,数据包丢给默认网关192.168.0.1
    • 路由器 LAN 口收到数据包,构建 NAT 映射,随机生成端口,假定为5500,这样映射就是 :5500 -> 192.168.0.100:5000。WAN 口收到的数据包,如果目标端口是5500,则转发给内网 IP 为192.168.0.100的机器的5000端口。
    • 路由器修改数据包的源端口为5500,源 IP 地址为211.22.145.234,使用 WAN 口将数据包发送出去。
    • Google 服务器收到请求,构建响应 HTTP 数据包,目标 IP 地址211.22.145.234,目标端口为5500
    • 路由器 WAN 口收到数据包,目标端口为5500,查询 NAT 表,发现对应的机器是192.168.0.100:5000,所以修改目标 IP 为192.168.0.100,目标端口为5000。并通过 LAN 口发送给主机。
    • 主机接收到数据包,完成这一次通信。

从上面可以看出,内网机器能够和外网通信,全靠拥有公网 IP 的路由器做交通枢纽。
路由器通过查询 NAT 表,来确定数据包该发送给内网哪台机器。
所以内网多台机器都可以通过这一台路由器和外网进行通信。这极大的节省了宝贵的公网 IP 资源。

Ngrok

  • 而 ngrok 就是利用以上原理实现了内网穿透的工具,只是稍有不同,交换的工具从路由器变成了我们具有固定 IP 的 VPS。
    当然原理没有大变,都是找一个公网服务器做中介。此处成为服务器 A。流程如下。
1. 本地内网主机和服务器A构建一条连接
2. 用户访问服务器A
3. 服务器A联系本地内网主机获取内容
4. 服务器A将获取到的内容发送给用户
5. 通过上面的流程,就实现了用户访问到了我们内网的内容。
  • 那么帮助我们实现这个功能的程序就是 Ngrok 。通过在服务器上安装 Ngrok ,我们就可以和本地主机构建一条隧道。来让外网用户访问本地主机的内容。

准备工作

安装依赖

  • 注意 golang 需要 1.6 以上,否则不能编译客户端
  • 下面是 1.7.3,其他的自己去官网下载,我使用的 Ubuntu 16,自带的即可
wget https://storage.googleapis.com/golang/go1.7.3.linux-amd64.tar.gz
tar -zxvf go1.7.3.linux-amd64.tar.gz -C /usr/local

获取 ngrok 源码

git clone https://github.com/inconshreveable/ngrok.git ngrok
## 建议请使用下面的地址,修复了无法访问的包地址
git clone https://github.com/tutumcloud/ngrok.git ngrok
cd ngrok

生成证书

  • 生成并替换源码里默认的证书,注意域名修改为你自己的
    (之后编译出来的服务端客户端会基于这个证书来加密通讯,保证了安全性)
NGROK_DOMAIN="liyuans.com"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.crtcp base.pem assets/client/tls/ngrokroot.crt

编译服务端

sudo make release-server
  • 如果一切正常,ngrok/bin 目录下应该有 ngrok、ngrokd 两个可执行文件。
    ngrokd 为服务器端使用的,ngrok 是 linux 客户端使用的

服务端

  • 前面生成的 ngrokd 就是服务端程序了,指定证书、域名和端口启动它(证书就是前面生成的,注意修改域名):
sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="liyuans.com" -httpAddr=":8081" -httpsAddr=":8082"
  • 到这一步,ngrok 服务已经跑起来了,可以通过屏幕上显示的日志查看更多信息。
  • httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。
  • ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=":xxx" 指定),如果你配置了 iptables 规则,需要放行这三个端口上的 TCP 协议。

测试连接

  • 现在,通过 http://liyuans.com:8081 和 https://blog.liyuans.com:8082 就可以访问到 ngrok 提供的转发服务。
    为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。

  • 可以看到这样一行提示:Tunnel liyuans.com:8081 not found,这说明万事俱备,只差客户端来连了。

编译客户端

#windows
GOOS=windows GOARCH=amd64 make release-client
#mac
GOOS=darwin GOARCH=amd64 make release-client

客户端

  • 如果要把 linux 上的服务映射出去,客户端就是前面生成的 ngrok 文件。(在 bin 文件夹内)

  • 写一个简单的配置文件,随意命名如 ngrok.cfg:

server_addr: imququ.com:4443
trust_host_root_certs: false
  • 指定子域、要转发的协议和端口,以及配置文件,运行客户端:
./ngrok -subdomain pub -proto=http -config=ngrok.cfg 80
  • 不出意外可以看到这样的界面,这说明已经成功连上远端服务了

未完待续

参考资料

  • 搭建 ngrok 服务实现内网穿透
  • 使用 Ngrok 实现内网穿透
  • CentOS6 搭建自己的 ngrok 服务

Ngrok: 使用 Ngrok 实现内网穿透相关推荐

  1. ngrok配置信息_ngrok内网穿透服务器搭建及配置(附 frp 配置)

    12月18日更新 添加 frp 配置 前言 内网穿透,无需多言,用处多多.首先强力推荐一款Sunny大大搭建的ngrok服务好用的不行,而且有免费选项,感觉平时够用了.那么,为什么自己还要搭建一个呢? ...

  2. 搭建ngrok服务器,实现内网穿透服务,实现外网到内网的在线访问

    一:前言 场景问题: 如果本地的项目在没有服务器的情况下,需要让他人访问: 在自己的电脑上搭建一个web服务器,实现本地的访问和外部的访问.我们就要做内网穿透了,内网穿透就是别人通过外网能够访问到我们 ...

  3. Ngrok免费实现内网穿透

    1.使用场景 让本地局域网的跑的应用可以被外网访问 2.常用内网穿透工具 能实现内网穿透的工具也挺多,下面列出了几个 Ngrok 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问.安全的UR ...

  4. Flask服务部署与简单内网穿透

    前言 最近学习部署的时候,想到深度学习里面通常用的部署方法是flask做服务端,然后使用nginx做负载均衡,貌似也能做内网穿透.不过我不太懂负载均衡,只想利用本地电脑搭建一个简单的服务器,实现外部调 ...

  5. 【树莓派学习笔记】七、(免费)内网穿透将树莓派作为服务器管理网站

    目录 nginx 安装 开机自启动 测试 查看nginx安装路径 查看配置文件路径 (测试用)修改index.nginx-debian.html 内网穿透 免费方案 ngrok原版方案 下载ngrok ...

  6. 2022年分享一些好用的内网穿透软件

    概述:受疫情倒春寒的影响,很多人都开始了居家办公. 如何让任何地方都能访问自己家里的笔记本上的应用? 如何让局域网的服务器可以被任何地方访问到? 有很多类似的需求,我们可以统一用一个解决方案:内网穿透 ...

  7. 推荐几款实现内网穿透的实用工具(转载)

    推荐几款实现内网穿透的实用工具(转载) 内网穿透能够实现支付宝.微信支付的测试,能够通过暴露端口来使程序能够远程访问.在学习的过程中我选择的是免费使用的内网穿透工具,已成功使用,在此做一些小小的笔记. ...

  8. 可以实现内网穿透的几款工具

    https://blog.csdn.net/qq_36468810/article/details/109219639 me批注:现在流行使用cpolar,极客工具,HTTPS安全的隧道穿透,用它来调 ...

  9. 几种内网穿透工具使用体验

    在外网访问公司或家里的内网的电脑或设备时,都需要一个公网IP才行.比如WEB开发时.物联网设备传输测试.外网访问NAS等.但是,大家都知道IPv4时代公网IP资源紧张,大部分宽带用户都只能使用内网IP ...

  10. 内网穿透+nginx转发

    内网穿透加nginx转发实现本地服务远程访问 前言 一.关于内网穿透 介绍 内网穿透常用工具 二.安装nginx(docker方式) 拉取镜像并启动 创建文件挂载目录(老规矩了) 重新创建并启动ngi ...

最新文章

  1. 比特币现金BCH今日事件
  2. A1035. 素数之和
  3. Redis源码剖析(三)字典结构的设计与实现
  4. hibernate jpa_教程:Hibernate,JPA –第1部分
  5. java代码中发送http请求的DnsResolver使用问题
  6. python import _ssl_如何在python 2.7.6中导入_ssl?
  7. st.getParameter() 和request.getAttribute() 区别 https://terryjs.iteye.com/blog/1317610
  8. 提高网页打开速度的一些小技巧
  9. vfp保存为html,vfp向HTTP发送文件
  10. H2GIS读取GPX文件 测试 GPXRead
  11. 电信光猫获取超级账户和密码
  12. 数学分析教程(科大)——5.2笔记+习题
  13. 11月最新系统GHOST XP SP3 电脑城快速装机版 V2011.11
  14. 甲骨文总裁埃里森:我的目标是击败微软
  15. cmd.exe显示窗口大小和字体大小调整
  16. 高德地图api调用demo_高德地图定位如何调用api?
  17. 如何用手机快速图片转文字呢?2个进阶教程,详细教程教你完成
  18. oracle 数据库中order by 的一些高级用法
  19. STM32 HAL库详细介绍
  20. 谷歌浏览器不能登录同步

热门文章

  1. Windows上安装scapy
  2. ssl1236-逃亡准备【dp之多重背包】
  3. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符...
  4. linux下测试宽带速度
  5. VB6.0 怎样启用控件comdlg32.ocx
  6. mysql自增mybatis返回主键_Mybatis + mysql 返回自增主键
  7. 满足什么条件的两个量才可以被分类?
  8. 存在于实数域的微观粒子5-可分类性
  9. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集
  10. STM32 基础系列教程 42 - SDMMC+Fatfs