前言
最近项目上线,很多功能还没来得及开发完,遂,又搭建了整套测试系统,大约17
个项目,用来日常的开发和调试。但是遇到了没有互联网IP
的尴尬处境,就只能在本地访问,项目之间又涉及到数据互联。前段和后端开发起来进度异常慢,两边的更新改动和数据库有时候都不是同步的,很多时候只是一个小问题,经常就跑偏了,完事就改改改,改完这个,那个又TM
不行了。持续了半个月,新功能一点进度都没有,大部分时间都花在了改BUG
和找BUG
上面了 ,但是测试服务器互联网IP又没有。因此迫切的需要把测试系统互联网化,在网上看了一些解决方案和办法,都不太如意。用第三方的吧,不能本地化,始终觉得不安全和稳定。有些又有各种限制,要么就是满足不了需求或者后期难以维护。本着彻底解决的初心,把内外代理,内网穿透这些统统看了个遍,学习了不少新内容。在这里分享给有同样需求的同学 。
一些概念*
内网穿透
一般个人的电脑一般处于内网环境中,能访问外部网络,但是外部网络却访问不了内部,也就是说外网ip
只能识别外网ip
,内网ip
只能识别内网ip
。如果想实现外网ip
识别到内网ip
,那就需要使用一种技术,内网穿透。
简单来说呢,内网穿透是先让内网ip
先联系上特定的外网ip
,先建立固定的通道,然后在没有取消的时候一直保持这个通道。所以当前的其他的外网ip
能访问到这个特定的外网ip
。顺带着也可以访问到这个建立的通道,那么通过这条通道的,其他的外网ip
就能访问到个人的机器中。这样就实现了其他外部ip
访问到我们内部环境的功能,那么这种方式就叫做内网穿透。
HTTP正向代理
这张网络拓扑图解释了内网代理的原理,由于内网(通常情况是家里的有线宽带)没有公网IP
,无法在路由器上做端口映射,或者利用动态DNS
连接回家里的设备,所以需要一个具有公网IP
的设备来进行传递数据,公网IP
设备和家里的能够建立一个稳定的隧道。
有公网IP的设备称为服务端,没有公网IP
的内网设备称为客户端,一般是家里的设备,可能是路由器、NAS
、树莓派等。
数据流的传递方向:外网设备 - 服务端 - 客户端(内网设备)
功能场景
- 把处于内网环境的Web,在外网访问
- 在外网远程桌面连接内网的机器
Socks5代理
功能场景
- 将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果
- 在外网环境下如同使用VPN一样访问内网设备或者资源
- 科学上网
什么是SOCKS5协议
SOCKS
是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS
是"Sockets”
的缩写。
当防火墙后的客户端要访问外部的服务器时,就跟SOCKS
代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。这个协议最初由David Koblas
开发,而后由NEC的Ying-Da Lee
将其扩展到版本4。最新协议是版本5,与前一版本相比,增加支持UDP
、验证,以及IPv6
。根据OSI
模型,SOCKS
是会话层的协议,位于表示层与传输层之间。
SOCKS5代理与HTTP代理区别
SOCKS
工作在比HTTP代理更低的层次:SOCKS
使用握手协议来通知代理软件其客户端试图进行的连接SOCKS
,然后尽可能透明地进行操作,而常规代理可能会解释和重写报头(例如,使用另一种底层协议,例如FTP;然而,HTTP
代理只是将HTTP
请求转发到所需的HTTP
服务器)。虽然HTTP
代理有不同的使用模式,CONNECT
方法允许转发TCP
连接;然而,SOCKS
代理还可以转发UDP
流量和反向代理,而HTTP
代理不能。HTTP
代理通常更了解HTTP
协议,执行更高层次的过滤(虽然通常只用于GET
和POST
方法,而不用于CONNECT
方法)
SOCKS5代理和VPN区别
virtual private network
(虚拟专网),你接入VPN
就是接入了一个专有网络,那么你访问网络都是从这个专有网络的出口出去,好比你在家,你家路由器后面的网络设备是在同一个网络,而VPN
则是让你的设备进入了另一个网络。同时你的IP
地址也变成了由VPN
分配的一个IP
地址。通常是一个私网地址。你和VPN
服务器之间的通信是否加密取决于连接VPN
的具体方式/协议。
Sock5
代理服务器则是把你的网络数据请求通过一条连接你和代理服务器之间的通道,由服务器转发到目的地。你没有加入任何新的网络,只是http/socks
数据经过代理服务器的转发送出,并从代理服务器接收回应。你与代理服务器通信过程不会被额外处理,如果你用https,那本身就是加密的。
Shadowsocks全局模式与PAC模式区别
PAC
模式就是会在你连接网站的时候读取PAC
文件里的规则,来确定你访问的网站有没有被墙,如果符合,那就会使用代理服务器连接网站,而PAC
列表一般都是从GFWList
更新的。GFWList
定期会更新被墙的网站(不过一般挺慢的)
简单地说,在全局模式下,所有网站默认走代理。而PAC
模式是只有被墙的才会走代理,推荐PAC
模式,如果PAC
模式无法访问一些网站,就换全局模式试试,一般是因为PAC
更新不及时(也可能是GFWList
更新不及时)导致的。
P2P穿透
点对点技术(peer-to-peer P2P)
又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上(这种技术可以大大减轻服务器的负担)。P2P
网络通常用于通过Ad Hoc
连接来连接节点(从而实现了节点之间的通讯),客户端二点之间直接通信,它是没有速度限制的,速度由二点之间的网络传输速度决定
穿透原理
主机1
和主机2
进行P2P
通讯的步骤
- 1.主机1和主机2首次发送数据到服务器(当发送第一次数据的时候,
NAT
上就会自动打了一个“洞”,服务器此时就把它们的外网IP
和经过NAT
端口转换的端口存储起来) - 2.数秒发送一次数据到服务器,就当作是心跳包(因为
UDP
协议的内网打洞在NAT
上的端口有生命期,一段时间没有数据通过NAT
上的“洞”这个“洞”就会自动关闭) - 3.当主机1要访问主机2的时候,主机1先向服务器发送信息要求获取主机2的外网IP和经过
NAT2
端口转换的端口 - 4.因为在第2步的时候,
NAT1
和NAT2
已经打好洞了,所以此时就不用再考虑其他,直接向主机2
的外网IP
加经过NAT2
端口转换的端口发送数据就行了(格式是“主机2外网IP”+“:”+“NAT2转换的端口”),如无防火墙的拦截,主机2就可以收到主机1发送的数据了。
功能场景
- 客户端之间建立直接通讯,不走服务器中转,服务器只是索引
- 大流量传输环境
内网共享
内网共享,介于远程组网和内网穿透之间,本质上来讲,也是把内网的环境穿透出来共享到外部网络,只不过穿透的方式类似于远程组网,属于VPN
的范围了.
简单来说,你有一台在内网的机器,你可以使用技术手段或者软件来远程访问到他,比如传输文件,远程桌面什么的,但是你不能应用他的网络去访问他所处的内网资源,这个只是叫远程局域网。那么内网共享的概念就是把这台内网设备的本地网络共享出来让外网的设备应用,具体的实施方案可参考之前写的这篇文章。
整体结构就是把公网服务器用于DHCP
服务器为接入的设备分配IP
地址和推送路由,内网客户端用于网关NAT
,对服务器传过来请求进行进行转换,虚拟一个路由器的环境出来,实现远程接入的设备提供内网客户端同样的网络环境。
功能场景
- 远程局域网
- 把处于内网环境中的设备本地的网络环境共享到外部
- 远程访问内网资源
工具对比和选择
地址 | 名称 | API | 单独key | 本地化 | 收费 | 开发语言 | github |
---|---|---|---|---|---|---|---|
官网 | ngrok | 支持 | 未知 | 支持 | 按数量 | go | 16K |
官网 | frp | 不支持 | 统一 | 支持 | 免费 | go | 26K |
官网 | lanproxy | 不支持 | 单独 | 未知 | 免费 | java | 3K |
官网 | goproxy | 支持 | 未知 | 未知 | API收费 | go | 6K |
官网 | nps | 支持 | 单独 | 支持 | 免费 | go | 6K |
官网 | 神卓互联 | 未知 | 未知 | 不支持 | 收费 | 未知 | 未知 |
官网 | 花生壳 | 未知 | 未知 | 不支持 | 收费 | 未知 | 未知 |
官网 | Natapp | 未知 | 未知 | 不支持 | 收费 | 未知 | 未知 |
我的方案
在对比了一圈后,选用了NPS
来搞,上面这个拓扑图就是整个方案,整个内网环境的设备只需要有一台服务器能访问互联网就行,并把这台服务器做nginx
反向代理做其他服务器的出口,然后找一台有公网IP
的服务器部署nps
,做HTTP
正向代理,映射到nginx
的端口。这样就最低限度的,低维护的可以把整个后端服务公网化。
- 这种结构既可以把后端服务器全部公网化,又不直接暴露服务器在互联网上,后端服务器还是处于纯内网的环境,物理隔绝
- 防攻击,服务器全部在后端,就算前面的公网服务器被
DDOS
或CC
攻击,也影响不到后端,因为NGINX
这层只是单向连接 - 防渗透,只要项目本身没有什么漏洞,黑客几乎不可能找的到源地址
- 低要求,采用这种结构,就算本地机房没有互联网IP也可以,只要随便一台设备能访问互联网就可以
- 接入方便,就算是多个机房,多个地域的内网,也可以全部代理出来
NPS部署和使用
releases 下载对应的系统版本即可,服务端和客户端是单独的
其他应用场景探索
(实验后补充完善)
- 代理本地项目
- UDP代理
- p2p穿透
- 远程连接
- API
此处评论已关闭