前言

最近项目上线,很多功能还没来得及开发完,遂,又搭建了整套测试系统,大约17个项目,用来日常的开发和调试。但是遇到了没有互联网IP的尴尬处境,就只能在本地访问,项目之间又涉及到数据互联。前段和后端开发起来进度异常慢,两边的更新改动和数据库有时候都不是同步的,很多时候只是一个小问题,经常就跑偏了,完事就改改改,改完这个,那个又TM不行了。持续了半个月,新功能一点进度都没有,大部分时间都花在了改BUG和找BUG上面了 ,但是测试服务器互联网IP又没有。因此迫切的需要把测试系统互联网化,在网上看了一些解决方案和办法,都不太如意。用第三方的吧,不能本地化,始终觉得不安全和稳定。有些又有各种限制,要么就是满足不了需求或者后期难以维护。本着彻底解决的初心,把内外代理,内网穿透这些统统看了个遍,学习了不少新内容。在这里分享给有同样需求的同学

 

一些概念*

内网穿透

外部索引公网服务器内网NAT内网NAT转发反馈包建立通讯发通知,探测NAT客户端客户端发生反馈包建立通讯

一般个人的电脑一般处于内网环境中,能访问外部网络,但是外部网络却访问不了内部,也就是说外网ip只能识别外网ip,内网ip只能识别内网ip。如果想实现外网ip识别到内网ip,那就需要使用一种技术,内网穿透

简单来说呢,内网穿透是先让内网ip先联系上特定的外网ip,先建立固定的通道,然后在没有取消的时候一直保持这个通道。所以当前的其他的外网ip能访问到这个特定的外网ip。顺带着也可以访问到这个建立的通道,那么通过这条通道的,其他的外网ip就能访问到个人的机器中。这样就实现了其他外部ip访问到我们内部环境的功能,那么这种方式就叫做内网穿透。

但是内网穿透的概念很大,很笼统,根据应用场景的不同,所谓的穿透类型也是不一样的,下面是一些个人观点,如有不对,还请大佬留言指教

 

HTTP正向代理

请求请求请求响应响应响应HTTP1HTTP2HTTP1浏览器互联网服务器项目内网运营商防火墙内网服务器

这张网络拓扑图解释了内网代理的原理,由于内网(通常情况是家里的有线宽带)没有公网IP,无法在路由器上做端口映射,或者利用动态DNS连接回家里的设备,所以需要一个具有公网IP的设备来进行传递数据,公网IP设备和家里的能够建立一个稳定的隧道。

有公网IP的设备称为服务端,没有公网IP的内网设备称为客户端,一般是家里的设备,可能是路由器、NAS、树莓派等。

数据流的传递方向:外网设备 - 服务端 - 客户端(内网设备)

功能场景

  • 把处于内网环境的Web,在外网访问
  • 在外网远程桌面连接内网的机器

 

Socks5代理

TCP代理连接TCP代理连接ssh代理HTTP请求HTTP回应返回数据阻断阻断一面墙socks5本地代理国外服务器浏览器Google Web

功能场景

  • 将公网服务器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协议,执行更高层次的过滤(虽然通常只用于GETPOST方法,而不用于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穿透

中转中转P2P通道直连客户端A客户端B服务器NATNAT

点对点技术(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步的时候,NAT1NAT2已经打好洞了,所以此时就不用再考虑其他,直接向主机2的外网IP加经过NAT2端口转换的端口发送数据就行了(格式是“主机2外网IP”+“:”+“NAT2转换的端口”),如无防火墙的拦截,主机2就可以收到主机1发送的数据了。

功能场景

  • 客户端之间建立直接通讯,不走服务器中转,服务器只是索引
  • 大流量传输环境

 

内网共享

DHCP服务器 推送路由公网服务器网关服务器转发流量NAT转换请求请求转发流量转发流量转发流量内网设备PC移动IPAD

内网共享,介于远程组网和内网穿透之间,本质上来讲,也是把内网的环境穿透出来共享到外部网络,只不过穿透的方式类似于远程组网,属于VPN的范围了.
简单来说,你有一台在内网的机器,你可以使用技术手段或者软件来远程访问到他,比如传输文件,远程桌面什么的,但是你不能应用他的网络去访问他所处的内网资源,这个只是叫远程局域网。那么内网共享的概念就是把这台内网设备的本地网络共享出来让外网的设备应用,具体的实施方案可参考之前写的这篇文章。
整体结构就是把公网服务器用于DHCP服务器为接入的设备分配IP地址和推送路由,内网客户端用于网关NAT,对服务器传过来请求进行进行转换,虚拟一个路由器的环境出来,实现远程接入的设备提供内网客户端同样的网络环境。

功能场景

  • 远程局域网
  • 把处于内网环境中的设备本地的网络环境共享到外部
  • 远程访问内网资源

 

工具对比和选择

从是否有API,客户端单独key,本地化,收费模式,开发语言,github stars多个维度比较了几款内网穿透工具

地址名称API单独key本地化收费开发语言github
官网ngrok支持未知支持按数量go16K
官网frp不支持统一支持免费go26K
官网lanproxy不支持单独未知免费java3K
官网goproxy支持未知未知API收费go6K
官网nps支持单独支持免费go6K
官网神卓互联未知未知不支持收费未知未知
官网花生壳未知未知不支持收费未知未知
官网Natapp未知未知不支持收费未知未知

 

我的方案

代理请求HTTP响应HTTP响应HTTP请求HTTP请求请求应用服务器应用服务器应用服务器应用服务器应用服务器NGINX反向代理浏览器HTTP正向代理响应请求响应公网服务器能访问互联网纯内网环境

在对比了一圈后,选用了NPS来搞,上面这个拓扑图就是整个方案,整个内网环境的设备只需要有一台服务器能访问互联网就行,并把这台服务器做nginx反向代理做其他服务器的出口,然后找一台有公网IP的服务器部署nps,做HTTP正向代理,映射到nginx的端口。这样就最低限度的,低维护的可以把整个后端服务公网化。

安全性

  • 这种结构既可以把后端服务器全部公网化,又不直接暴露服务器在互联网上,后端服务器还是处于纯内网的环境,物理隔绝
  • 防攻击,服务器全部在后端,就算前面的公网服务器被DDOSCC攻击,也影响不到后端,因为NGINX这层只是单向连接
  • 防渗透,只要项目本身没有什么漏洞,黑客几乎不可能找的到源地址

适用性

  • 低要求,采用这种结构,就算本地机房没有互联网IP也可以,只要随便一台设备能访问互联网就可以
  • 接入方便,就算是多个机房,多个地域的内网,也可以全部代理出来

 

NPS部署和使用

releases 下载对应的系统版本即可,服务端和客户端是单独的

其他内容请看官方使用手册,写的很详细了,这里就不搬运了

 

其他应用场景探索

(实验后补充完善)

  • 代理本地项目
  • UDP代理
  • p2p穿透
  • 远程连接
  • API
最后修改:2024 年 05 月 06 日
钥匙你想请我喝酱香拿铁的话!