Ngrok +阿里云服务器+Ubuntu18.04 内网穿透

2023-05-16

为什么要实现内网穿透

  相信大家在项目开发中总会碰到很尴尬的问题,就是外网环境无法访问内网中的web服务,这样很难将自己的项目成果展示给别人看。或者是在进行微信端开发时,需要在外网上进行项目开发,那么这样就会产生一个需求:需要将本地正在开发的服务暴露在公网上,也就是从外网直接访问我们本机上的服务。

 

一个例子

  之前看过一篇博客举得例子很好,自己理解了一下。本地主机一般都在路由器的内网中,IP地址一般都是192.168.x.x神马的,我们本身没有公网IP,那么是如何实现访问外网的呢?

  •   我们打开google,那么google与我们的主机之间是怎样实现通信的呢?假设我们的主机IP是192.168.0.0,路由器LAN IP为192.168.0.1,WAN IP为211.22.145.234(这是一个公网IP),google 服务器 IP 为74.125.204.101
  • 详细通信流程如下:
  1.   主机构建HTTP请求数据包,目标IP为74.125.204.101,目标端口是80/443,源IP为192.168.0.0,源端口随机生成,假定为5000
  2.        主机检查目标IP地址,发现不在一个网段,数据包丢给默认网关192.168.0.1
  3.        路由器LAN口收到数据包,构建NAT映射,随机生成端口,假定为5500,这样映射就是:5500->192.168.0.0:5000.WIN口收到的数据包,如果目标端口是  5500,则会转发给192.168.0.0的5000端口。
  4. 路由器修改数据包的源端口为5500,源IP地址为211.22.145.234,使用WAN口将数据包发出去
  5. google服务器收到请求,构建响应HTTP数据包,目标IP地址为211.22.145.234,目标端口是5500
  6. 路由器WAN口收到数据包,目标端口是5500,查询NAT表,发现对应的机器是192.168.0.0:5000,所以修改目标IP为192.168.0.0,目标端口为5000,并通过LAN口口发送给主机
  7. 主机收到数据包,完成一次通信  

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

Ngrok

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

简单来说,他可以代理你本地的数据,并将其转发到外网。当然原理没有大变,都是找一个公网服务器做中介。此处成为服务器 A。流程如下。

1. 本地内网主机和服务器A构建一条连接
2. 用户访问服务器A
3. 服务器A联系本地内网主机获取内容
4. 服务器A将获取到的内容发送给用户
5. 通过上面的流程,就实现了用户访问到了我们内网的内容

那么帮助我们实现这个功能的程序就是 Ngrok 。通过在服务器上安装 Ngrok ,我们就可以和本地主机构建一条隧道。来让外网用户访问本地主机的内容。

准备工作(注意:下面做的工作是在远程主机上进行的)

安装依赖

  • 注意 golang 需要 1.8 以上,否则不能编译客户端。我的主机是ubuntu18.04,所以可以使用自带的

  

sudo apt-get install build-essential golang mercurial git

  如果本地有git就不用配置git了,至于git是什么,我就不多说了,相信大家都懂。

获取Ngrok源码

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

  下面用的是非官方地址,修复了一些无法访问的包地址,推荐使用这个

shell进入ngrok文件夹中:

不出意外,进入到ngrok中会看到这些

生成自签名证书

使用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”。这里呢,我替换成自己的域名 “lishanlei.cn”
这个地方大家也要提前准备好自己的域名,没有多余域名的同学呢,就可以给自己的域名添加一个二级域名来解决.

生成并替换源码里默认的证书,注意域名修改为你自己的

 

NGROK_DOMAIN="lishanlei.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

 编译服务端

sudo make release-server release-client

  如果一切正常,我们将会在ngrok/bin文件夹下发现有ngrok和ngrokd两个可执行文件,其中ngrokd是服务器端运行的,ngrok是linux客户端运行的。

服务端

  • 前面生成的 ngrokd 就是服务端程序了,指定证书、域名和端口启动它(证书就是前面生成的,注意修改域名):
sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="lishanlei.cn" -httpAddr=":8081" -httpsAddr=":8082"

  

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

测试连接

现在可以通过http://lishanlei.cn:8081和http://lishanlei.cn:8082就可以访问到ngrok提供的转发服务

为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。

可以看到这样一行提示

Tunnel lishanlei.cn:8081 not found

 这样子说明万事具备,只差客户端进行连接了

编译客户端

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

客户端

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

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

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

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

  其中username是远程主机的用户名,serverIp是远程主机的公网IP

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

  创建一个ngrok配置文件:ngrok.cfg,写入以下内容:

//注意域名替换成你自己的
server_addr: "lishanlei.cn:4443"
trust_host_root_certs: false
tunnels:
   ssh:
     remote_port: 2223 //暴露在公网服务器上的端口
     proto:
        tcp:22 //内网端口       

  注意:这里的server_addr换成前面配置的自签名证书中的域名,服务器中的4443和2223端口需要开放

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

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

sudo ./ngrok -config=ngrok.cfg start ssh
#如果需要在后台长期运行用下面的命令
nohup sudo ./ngrok -config=ngrok.cfg start ssh &

 不出意外,就成功了!

参考博客链接:

[ubuntu 16.04搭建ngrok内网穿透服务](https://www.jianshu.com/p/b413a2e18e2a)

[使用 ngrok 进行内网穿透——4 (如何穿透ssh端口)](https://blog.csdn.net/guoqian1408/article/details/105772522)

[ubuntu18.04 设置开机自启命令](https://www.cnblogs.com/qingshangucheng/p/10183583.html)

 

 

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

Ngrok +阿里云服务器+Ubuntu18.04 内网穿透 的相关文章

  • 安装YOLO_V5环境以及测试——NVIDIA Jetson Xavier AGX平台

    参考 Ubuntu 18 04 YOLOv5 ros yolo 环境配置 数据集标注 NVIDIA Jetson Xavier NX入门 xff08 3 xff09 安装miniforge和Pytorch NVIDIA Jetson Xav
  • teleop_twist_joy 游戏手柄ros使用

    参考 xff1a wiki官网链接 https github com ros teleop teleop twist joy git 查看每个按钮和轴对应的索引以及键值 span class token comment 1 通过话题查看 s
  • ROS melodic+opencv4 修改cv_bridge配置文件

    参考 xff1a Ubuntu18 04 43 ROS melodic 43 opencv4 修改cv bridge配置文件 xff0c 解决ROS使用不同版本opencv的冲突问题 Ubuntu18 04 ros melodic open
  • 使用ROS调用YOLO_V5(非darknet),利用ros-yolov5配置

    参考 xff1a 源码 安装YOLO V5环境以及测试 NVIDIA Jetson Xavier AGX平台 0 ros yolo5介绍 实现yolo作为service的server 发送sensor Imge 图片 得到yolo检测的结果
  • ROS仿真环境配置Husky+32线激光雷达+深度相机+imu+gps

    0 参考 wiki HUSKY 官网 git HUSKY HUSKY gazebo Tutorials 代码资源 husky base xff1a 与板载MCU通信的硬件驱动程序 husky bringup xff1a 调出启动文件和脚本
  • ros中使用Docker(2)VNC

    使用paopao机器人的ros vnc 镜像 dockerhub xff1a paopaorobot ros vnc网址 按照官网操作即可 下载镜像 span class token function docker span pull pa
  • winform窗体应用程序

    在C 编程环境中 xff1a winform窗体应用程序是一种客户端程序 xff0c 可以用来获取和显示数据 首先新建一个窗体应用程序项目 xff0c 在建完一个项目后可以看到有两个 cs类库文件 xff1a Form1 cs 和Progr
  • 3D目标跟踪(2)点云聚类

    点云聚类流程
  • GCAN -212(R2) can转网 使用记录

    GCAN 212 R2 使用udp模式 在配置软件进行配置 选择udp模式 xff1b 选择Remote IP 为本机PC的IP地址 xff1b 编写ROS程序 未完成 参考程序1 参考程序2 节点数据驱动 xff1a 主线程udp接收数据
  • 分卷压缩与分卷解压

    span class token comment 1 分卷压缩 span span class token function tar span cvzpf myfile span class token operator span span
  • java 域的概念_java中的域,静态域,实例域

    1 java中的域 所谓的域 xff0c 翻译成英文就是field xff0c 也就是我们常说的字段 xff0c 或者说是属性 比如类的字段 属性 xff0c 局部的 xff0c 全局的 所谓域 xff0c 其实是 field 的翻译 然后
  • mysql 字段最右匹配_【MySQL】-索引优化

    优化口诀 xff1a 全值匹配我最爱 xff0c 最左前缀要遵守 xff1b 带头大哥不能死 xff0c 中间兄弟不能断 xff1b 索引列上少计算 xff0c 范围之后全失效 xff1b Like百分写最右 xff0c 覆盖索引不写星 x
  • Meta-learning:Learn to learn

    基于李宏毅教授的ML课程做的笔记 xff0c 主要供自己复习 xff0c 所以就留下了一些自己想多看的东西 xff0c b站有全面的课程视频 引言 xff1a 为什么few shot任务常常提及元学习meta learning xff1f
  • Hadoop----hdfs dfs常用命令

    span class token operator span mkdir 创建目录 hdfs dfs span class token operator span mkdir span class token punctuation spa
  • 如何处罚被客户投诉的项目经理?

    没有被客户投诉过的项目经理很难体会到客户满意度的重要性 项目经理被客户投诉 xff0c 一定要执行合适的处罚 xff0c 否则项目管理将失去基本游戏规则 自由是有限度的 xff0c 项目经理一定不能突破客户投诉的红线 如同不断的抛接球 xf
  • k8s kube-router+ipvs pod网络分析

    集群中的每个节点上都有一个kube bridge网桥 xff0c 是部署k8s时创建的网桥 xff0c 用于pod间通信k8s 利用veth pair和网桥实现容器通信 xff0c 一端与pod绑定 xff0c 一端绑定到kube brid
  • 面试官常问的Promise问题

    1 Promise 有几种状态 xff1f 3种 pending 初始化状态 resolved 当调用成功时的状态 reject 当调用失败时的状态 2 Promise得状态是否可变 不可变 3 Promise如何解决地狱回调 xff1f
  • vnc连接linux服务器,用 TigerVNC 实现 Linux 远程桌面

    tigervnc 配置 1 确认 SSH 在运行 2 安装 TigerVNC Server yum install tigervnc server 已经安装过的 yum info tigervnc server 可以查看已安装的情况 3 配
  • 51单片机的轮胎气压监测系统_基于单片机的胎压监测设计毕业设计论文.doc

    PAGE 4 存档日期 xff1a 存档编号 xff1a 本科生毕业设计 论文 论 文 题 目 xff1a 基于单片机的胎压监测系统设计 姓 名 xff1a 学 院 xff1a 电气工程及自动化 专 业 xff1a 电气工程及其自动化 班
  • ros2foxy中gazebo11中导入soildworks中模型

    由于ros2中不能像ros1中一样使用soildworks导出urdf文件直接打开 xff0c 所以之前使用的下面的方法没有用了 https blog csdn net weixin 42454034 article details 106

随机推荐