技术标签: 架构类
很多时候,我们都有这样的需求:需要将本地正在开发的服务暴露在公网上,也就是从外网直接访问我们本机上的服务。
正常情况下,这是办不到的,因为我们的本机并没有公网 IP,我们的本机处在内网当中。
这里需要顺手提及一个知识: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
。
详细通信流程如下:
74.125.204.101
,目标端口80/443
,源 IP 为192.168.0.100
,源端口随机生成,假定为5000
。192.168.0.1
。5500
,这样映射就是 :5500 -> 192.168.0.100:5000
。WAN 口收到的数据包,如果目标端口是5500
,则转发给内网 IP 为192.168.0.100
的机器的5000
端口。5500
,源 IP 地址为211.22.145.234
,使用 WAN 口将数据包发送出去。211.22.145.234
,目标端口为5500
。5500
,查询 NAT 表,发现对应的机器是192.168.0.100:5000
,所以修改目标 IP 为192.168.0.100
,目标端口为5000
。并通过 LAN 口发送给主机。 从上面可以看出,内网机器能够和外网通信,全靠拥有公网 IP 的路由器做交通枢纽。
路由器通过查询 NAT 表,来确定数据包该发送给内网哪台机器。
所以内网多台机器都可以通过这一台路由器和外网进行通信。这极大的节省了宝贵的公网 IP 资源。
1. 本地内网主机和服务器A构建一条连接
2. 用户访问服务器A
3. 服务器A联系本地内网主机获取内容
4. 服务器A将获取到的内容发送给用户
5. 通过上面的流程,就实现了用户访问到了我们内网的内容。
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
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.crt
cp base.pem assets/client/tls/ngrokroot.crt
sudo make release-server
sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="liyuans.com" -httpAddr=":8081" -httpsAddr=":8082"
现在,通过 http://liyuans.com:8081
和 https://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
文章浏览阅读1.9w次,点赞5次,收藏28次。前言上一篇文章,咱们介绍了Poco库有多牛逼,当然接下来就是要把它用起来。工欲善其事必先利其器,想让C++发挥更好的作用,就需要把一个合适的框架跟库给用起来。因为Poco官网有编译好的win64的库文件,Linux的32跟64位的库,所以这里我演示如何编译出win32的库文件工具:VS2019目标:编译出win32的库一、前期准备1.1 安装Openssl要安装openssl,不知道怎么安装的,可以参考我的文章https://blog.csdn.net/zhh76398401_poco windows编译
文章浏览阅读1.9k次,点赞2次,收藏6次。Linux系统下mock构建RPM包命令详解简介mock最常用的方式就是打RPM包,下面用实例去解析编译源码包的命令操作过程。命令操作1、初始化mock环境[mockbuild@localhost ~]$ mock -r neokylin-11-x86_64 --init2、下载安装vim编辑器[mockbuild@localhost ~]$ mock -r neokylin-11-x86_64 install vim3、将宿主机上的文件拷贝到mock环境中[mockbuild@lo_mock -r
文章浏览阅读543次。时间限制: 1 Sec 内存限制: 128 MB[提交] [状态]题目描述有两个由小写字母组成的字符串,你可以通过将字符串末尾的字母移动到开头这样的操作以使两个字符串尽可能的匹配。输出最多有几位相同。输入第一行一个正整数n(n≤1000),表示字符串的长度。接下来分别是两行字符串。输出第一行一个整数n,表示通过变换操作后两字符串最大匹配位数,没有则输出0。样例输入 Copy5..._给定两个由小写字母组成的字符串 s,t,你可以对 s 进行以下四种 操作: 1.在任意位
文章浏览阅读1.7k次,点赞10次,收藏9次。随着数字化时代的来临,个人和机构在互联网上的活动越来越频繁,对于身份认证的需求也愈发迫切。为了有效应对身份欺诈、数据泄露等问题,统一身份认证(Unified Identity Authentication)应运而生。在本文博主将介绍统一身份认证的概念、原理以及其具体的实现方案。_统一身份认证
文章浏览阅读10w+次,点赞13次,收藏34次。BET365网站websocket实时数据采集分析**前语:**本文仅用于交流学习,请勿用于非法用途,后果自负!bet365是全球顶尖的涵盖足球篮球等各项赛事的赛事信息提供网站以及博彩网站。为啥要去爬这个网站呢?因为它赛事更新快,准,专业,赛事信息丰富。国内的很多赛事网站都是直接或者间接跟bet365的赛事信息有关系。Bet365的赛事信息之所以更新快,这跟他的数据传输方式分不开,现在bet365的赛事信息更新是采用websocket的方式进行实时传输的。下图就是bet365的数据展示赛事比_365bet网站
文章浏览阅读9.5k次,点赞6次,收藏5次。做个记录终究还是自己太菜,才会出现这种错误。一开始出现问题就百度了下,看了下那些回答牛头不对马嘴,要么换路由版本,要么用捕获错误日志来避免报错,这些根本不是啥解决办法。思路百度翻译一下:vue-router 报错:Navigation cancelled from“/…“ to “/…“ with a new navigation.提取关键词,导航从“/…”取消到“/…”,根据字面意思,准备去下个页面,但是又从下个页面取消去到了另一个页面,说明重定向了两次。问题关键点就在这儿,解决重定向问题即解决了_mavigation cancelled from “/” to " /home" with a new navigation.
文章浏览阅读1.2k次。在上期的LayUI基本元素之树形菜单案例实现的博客中我们了解了关于LayUI基本元素中的树形菜单的使用,这期博客基于上一期博客的基础上我们来实现选项卡功能的实现,在项目中选项卡是我们的一个必备功能,让我们跟随这期博客一起去了解一下吧。选项卡(Tabs)是现代网络浏览器中常见的功能,它允许用户在同一个浏览器窗口中同时打开和浏览多个网页。每个选项卡都代表着一个独立的网页,在用户之间相互隔离,但仍然可以通过切换选项卡来方便地在它们之间进行导航。_layui 选项卡
文章浏览阅读1.7k次,点赞2次,收藏8次。概述Qt元对象系统是Qt最核心的一个基础特性,元对象系统负责信号和插槽对象间通信机制、运行时类型信息和Qt属性系统。为应用程序中使用的每个QObject子类创建一个QMetaObject实例,此实例存储QObject子类的所有元信息。通过元对象系统,你可以查询QObject的某个派生类的类名、有哪些信号、槽、属性、可调用方法等信息,然后可以使用QMetaObject::invokeMethod()调用QObject的某个注册到元对象系统中的方法。而这里,主要就介绍改函数的使用方法,以及大致简介。QM_qmetaobject::invo
文章浏览阅读459次。GN的效果似乎不是很好;群里面有同学说到:_gn是否容易学习
文章浏览阅读659次。简单的sql查询语句_编写sql语句,查询每个学生的id, name, 以及学生的语文chinese , 英语 english ,
计算机网络体系结构是指计算机网络各层及其协议的集合,用于解决相互通信的计算机系统的复杂协调工作。通过分层处理,将大问题转化为小问题,便于研究和处理。
文章浏览阅读2.4k次。店淘软件贴牌代理火爆招商中 由于店淘软件的开发,店淘在如今已经开始风靡淘宝网,人有多大胆,地有多大产,一块来做第一个吃螃蟹的人吧! 1、软件由专业研发团队研发,保证售后免费更新、维护; 2、售后客服一对一指导,电话、远程、直播间、多媒体教学,包教包会。 3、软件自动屏蔽易违规,易投诉盗图的商家,将其列入黑名单,采集时直接Pass 4、软件自动修改图片,包括但不限于:修改尺寸,更换主图,增..._阿里巴巴的分销模式是怎么样的