我有一个用例,其中SaaS的用户需要来自服务器的出站连接来自与该用户相对应的自定义IP。我正在努力想办法做到这一点。
在此示例中,有3个用户,1个服务器和3个自定义IP,分别表示为0.0.0.0。每个客户的出站请求必须来自其IP,但是处理是在单个服务器上完成的:
User 1 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.1
User 2 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.2
User 3 requests --> server 1 --> outbound data to different destination in new TCP request coming from 0.0.0.3
我关于如何管理此问题的理论思想是为每个客户配置一台服务器作为转发代理,例如HAproxy或Squid。然后,当请求进入我的Nodejs应用程序时,它将选择与该用户相对应的代理,并通过该代理代理请求。
听起来不错,还是我想念的还有更好的方法?
编辑:该问题仅对正向代理感兴趣。反向代理不在此问题的范围内。
只需澄清一下:在TCP中,响应只能来自建立TCP连接的IP。因此,您还需要客户在各自客户特定的IP上执行请求:
customer1 => requests ip 0.0.0.1 => response from ip 0.0.0.1
((customer1不可能连接到0.0.0.0,然后从0.0.0.1得到响应)
然后解决方案很简单:为您的主机/节点分配几个IP地址(ip address add 0.0.0.1/32 dev eth0
该命令需要在您的Linux Shell上执行所有IP),并让node.js在所有接口0.0.0.0
上侦听(注意:这实际上叫0.0.0.0) !)。然后,Node.js应使用正确的IP地址进行响应,请求即进入系统。
Express example:
app.listen(3000, "0.0.0.0", function () {
console.log('Example app listening on port 3000 for all IP addreses !');
});
注意:如果您只有一个(!)后端服务,那么负载平衡器是没有意义的。但是,您当然可以将负载平衡器放在前面。但这是浪费资源。上面的解决方案更加有效和容易。但是,当然,您可以使用LB来做更复杂的事情。
+-------------+
| |
| Customer1 | +-----------------------+
+-------------+ | HA Proxy |
+-------------+ | listening on IPs | +-----------------+
| | | 0.0.0.1 | | Service |
| Customer2 | | 0.0.0.2 | | ip 1.1.1.1 |
+-------------+ | 0.0.0.3 | | |
+-------------+ | | +-----------------+
| | +-----------------------+
| Cusstomer3 |
+-------------+