服务代理
none
- 您的应用程序正在 AWS/Azure/Google Cloud 或其他云计算服务上运行。
- 您的服务器没有固定的 IP 地址,或者您正在完全无服务器地使用AWS Lambda或谷歌云计算功能.
- 您需要连接到网络外的服务,但其安全策略要求您只能从白名单 IP 地址访问。
服务代理
大多数云计算提供商的服务器实例都有一个公共 IP 地址,通常是从提供商的 IP 地址池中随机选择的。 提供商通常会公布其 IP 地址池的范围,因此可以将整个范围列入白名单,以便访问受保护的外部服务。
但这种方法有两个问题。 首先,它会向同一云提供商的所有其他用户开放受保护的服务,使防火墙保护完全失效。 其次,IP 地址的范围可能很大,而且会随着时间的推移而变化,因此这种设置很难管理。
例如AWS 的 IP 地址范围有 1145 个 IPv4 前缀,而且经常变化。 您需要订阅有关范围变化的 SNS 通知,并在每次变化后手动或自动(如果您的应用程序支持)更新防火墙设置。
服务代理
另一种方法是为服务器手动分配静态 IP 地址,并在防火墙上仅将这几个地址列入白名单。 对于运行少量服务器且不经常更换服务器的小型应用程序来说,这种方法非常有效。 但如果你运行的是一个大型系统,需要根据工作量动态启动服务器,并且可能同时有几十个服务器在运行,那么这种设置就无法扩展了。
例如,AWS 有一个最多 5 个静态 IP 地址每个区域绕弯子使这些所谓的弹性 IP 地址与 EC2 自动缩放组配合使用。
服务代理
人们经常想到的另一种方法是使用本地运行或托管的虚拟专用网络(VPN)。 例如,你可以设置一个具有静态 IP 地址的单一实例来运行 VPN 服务器,并让所有其他实例使用 VPN 客户端通过服务器代理其网络流量。 这样,与受保护服务的网络连接将始终来自静态 IP 地址。
这种解决方案效果很好,但需要在服务器和客户端上进行非同一般的设置。 VPN 服务器是单点故障,在关键任务应用中需要加倍冗余。 应用程序需要设置本地 VPN 客户端,通常是通过安装虚拟网络接口。 不幸的是,这在使用 Docker 的环境中很成问题,而在 AWS Lambda 上则根本不可能。
服务代理
none虛擬專用網絡如果有更简单的转发网络流量的替代方法--HTTP 代理? HTTP 代理可以转发 HTTPS 和 FTP 等协议。HTTP CONNECT 隧道因此,也一定可以用它来隧道任何其他协议。
当然,我们并不是第一个提出这个想法的人。 例如,Linux 上就有一个开源工具,名为代理链可使来自任何程序的连接通过 HTTP/SOCKS 代理进行隧道传输。 它们描绘以下用例
当局域网的唯一出路是通过代理服务器时,您可能需要它。 或者要从限制性防火墙后面出去,因为防火墙会过滤外向流量中的某些端口。 而你想通过 telnet 等应用程序来实现这一目的。 事实上,如果你设置了反向代理,甚至可以通过反向代理从外部访问家庭局域网。 在任何代理/防火墙后面使用外部 DNS。 通过 SSH 和朋友使用 TOR 网络。
就我们而言,我们不想让用户安装额外的工具。 我们在想,如果能将这一功能作为 Node.js 的 NPM 软件包来提供,那将会非常好,可以帮助none.
由于我们最近在代理链NPM 软件包,我们获得了相当对 HTTP 代理有深入了解并决定将此功能添加到软件包中。 具体操作如下
- 假设用户要执行与目标服务器的 TCP 连接
none
通过运行在 - 用户调用
none
函数,在随机端口上启动本地 TCP 服务器,例如localhost:4567
- 现在,任何连接到
localhost:4567
通过 HTTP 代理以隧道方式传输到目标服务器 - 网络操作完成后,用户会调用
关闭隧道
功能
现在,您只需要一个具有静态 IP 地址的 HTTP 代理服务器。 你可以自己设置一个(例如使用鱿鱼服务器),或者从大量代理服务器供应商那里购买一个。 如果流量很大,您可以使用多个 HTTP 代理,然后随机或轮换使用。
下面是一个代码示例:
上述解决方案的最大优点是,它在 Node.js 中开箱即用。 您不需要安装任何外部工具或更改任何配置,它甚至可以在 AWS Lambda 上运行(只要您信任您的代理提供商 😀)。
下面是另一个功能齐全的代码示例,其中使用了Apify 代理:
如果你不怕写代码,并想看看我们如何使用隧道的高级真实示例,那就来看看源代码中的nonenoneGitHub. 该行为与MongoDB Atlas例如,通过重写系统主机文件并为副本集中的每个数据库打开多个隧道,使 Mongo 3.6 连接到副本集的连接字符串正常工作,但这是另一个故事了...