【问题标题】:Assign IPs to programs/processes为程序/进程分配 IP
【发布时间】:2014-07-13 15:20:30
【问题描述】:

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

如何做到这一点?

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

【问题讨论】:

  • 嗨,你找到实现你想要的方法了吗?
  • @LeonardoRick 我最终设置了 nginx(反向?)代理。我的程序会调用 http://localhost:1024/proxy/for/ip1 之类的东西,而不是真正的 URL。在 nginx 方面,我使用了proxy_bind 指令,该指令允许选择用于与“后端”的传出连接的 IP 地址 - 实际上,是此设置中的外部服务器。
  • 太棒了!这样就可以保证每个进程使用一个IP?是否可以在 AWS 和类似设备上运行这种逻辑?如果你能提供一些关于这个线程的文章,我将非常感激。您可以使用该信息回答您自己的问题。提前致谢!
  • @LeonardoRick,我已经为我的原始问题添加了一个答案。如果您发现问题和答案都有用,请投票 :) 至于 AWS,如果您的虚拟机有多个公共 IP,我看不出有什么原因不能正常工作(尽管我对 AWS 不是很熟悉)。
  • 非常感谢。这将非常有帮助

标签: networking routing ip


【解决方案1】:

进程将套接字(传入和传出)绑定到一个接口(或多个接口),可通过IP 地址寻址,并具有各种端口。为了让它们可以通过不同的 IP 地址直接寻址,您必须让它们将其套接字绑定到不同的 NIC(虚拟或硬件)。

您可以将每个进程指向一个代理(将要查询的服务器的主机名配置为每个进程的不同代理),在这种情况下,外部服务器将看到代理的不同 IP。否则,如果您可以直接将进程配置为使用不同的 NIC 进行通信,那将是理想的选择。

您可能需要更改代码以使其可配置(通常,程序员使用便利函数创建传出 TCP 连接,而不指定他们将使用的 NIC,因为他们通常不关心)。在 PHP 中,您可以使用“socket_bind”将端点绑定到 nic,例如见第一个例子in the docs for socket_bind

【讨论】:

  • 情况正好相反。我没有在这台机器上运行服务器,我有连接到其他服务器的程序。这些程序应分别从不同的 IP 连接。
【解决方案2】:

根据@LeonardoRick 的要求,我将提供最终解决方案的详细信息。

假设,我有一个 IP 地址为 172.16.0.1172.16.0.2 的服务器。

我设置了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 是否有防火墙且无法从外部访问,如有必要,请添加额外的身份验证。 Especially if you are running Docker.

这个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多