我需要为在我的Linux服务器上运行的不同进程(主要是PHP和Linux程序)分配不同的IP地址。他们将对各种服务器进行查询,包括连接到同一外部服务器的进程应具有不同IP的情况。
如何实现这一目标?
任何选项(系统范围,或特定于PHP / Ruby,使用代理服务器等)都适合我。
答案 0 :(得分:1)
进程将套接字(传入和传出)绑定到接口(或多个接口),可通过IP地址寻址,具有各种端口。为了使它们可以通过不同的IP地址直接寻址,您必须将它们的套接字绑定到不同的NIC(虚拟或硬件)。
您可以将每个进程指向代理(将要查询的服务器的主机名配置为每个进程的不同代理),在这种情况下,外部服务器将看到代理的不同IP。否则,如果您可以直接配置进程以使用不同的NIC进行通信,那将是理想的选择。
您可能需要对代码进行更改以使其可配置(通常,程序员使用便捷功能创建传出TCP连接,而不指定他们将使用的NIC,因为他们通常不关心)。在PHP中,您可以使用“socket_bind”将端点绑定到nic,例如请参阅第一个示例in the docs for socket_bind。
答案 1 :(得分:1)
根据@LeonardoRick 的要求,我提供了我最终得到的解决方案的详细信息。
比如说,我有一个带有 172.16.0.1
和 172.16.0.2
IP 地址的服务器。
我使用看起来有点像这样的配置设置了 nginx
(在同一台机器上):
server {
# NEVER EXPOSE THIS SERVER TO THE INTERNET, MAKE SURE PORT 10024 is not available from outside
listen 127.0.0.1:10024;
# block access from outside on nginx level as well
allow 127.0.0.1;
deny all;
# actual proxy rules
location ~* ^/from-172-16-0-1/http(s?)\:\/\/(.*) {
proxy_bind 172.16.0.1;
proxy_pass http$1://$2?$args;
}
location ~* ^/from-172-16-0-2/http(s?)\:\/\/(.*) {
proxy_bind 172.16.0.2;
proxy_pass http$1://$2?$args;
}
}
(实际上我现在不记得所有的细节(这个代码是“来自白板”,它不是一个实际的工作代码),但它应该代表所有的关键想法。在部署前检查正则表达式)。
仔细检查端口 10024 是否已设置防火墙且无法从外部访问,如有必要,添加额外的身份验证。
这个 nginx 设置使得运行 HTTP 请求成为可能,例如http://127.0.0.1:10024/from-172-16-0-2/https://example.com/some-URN/object?argument1=something
一旦收到请求,nginx 将使用相应 proxy_bind
指令指定的 IP 从请求的 URL 中获取 HTTP 响应。
然后 - 当我运行内部或开源软件时 - 我只是对其进行了配置(或更改了它的代码),因此它会执行与上述类似的请求,而不是(原始)https://example.com/some-URN/object?argument1=something
。
所有管理——目前应该使用什么 IP——也是由“我的”软件完成的,它只是根据其业务逻辑选择必要的 /from-172-16-0-XXX/
端点。
这对我最初的问题/任务非常有效。但是,这可能不适用于其他一些无法更改请求 URL 的应用程序。但是,设置某种代理的类似方法可能适用于这些情况。