将IP分配给程序/进程

时间:2014-07-13 15:20:31

标签: networking routing ip

我需要为在我的Linux服务器上运行的不同进程(主要是PHP和Linux程序)分配不同的IP地址。他们将对各种服务器进行查询,包括连接到同一外部服务器的进程应具有不同IP的情况。

如何实现这一目标?

任何选项(系统范围,或特定于PHP / Ruby,使用代理服务器等)都适合我。

2 个答案:

答案 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.1172.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 的应用程序。但是,设置某种代理的类似方法可能适用于这些情况。


(如果您不熟悉 nginx,这里有一些入门指南 herehere