如何在 Ubuntu 14.04 服务器中为每个命名空间关联一个公共 IP 地址?我需要为每个命名空间启动一个特定进程,然后为每个公共 IP 地址启动一个特定进程。
我想这样做:
配置:
nameSpace1 use: publicIP1
nameSpace2 use: publicIP2
nameSpace3 use: publicIP3
终端:
nameSpace1 ffmpeg etc...
nameSpace2 ffmpeg etc...
nameSpace2 youtube-dl etc...
nameSpace2 streamlink etc...
nameSpace3 ffmpeg etc...
答案1
部分答案,基于一些可能不正确的假设:
一般来说,网络命名空间提供对哪些网络接口对哪些进程可见的控制。将网络命名空间分配给接口将确保它只能被在该命名空间中运行的进程看到。相反,在该命名空间中运行的进程只能看到其自己的命名空间中的网络接口。
因此,基本上有两种方法可以让在命名空间中运行的进程与外部进行通信:(1)使用将连接到外部的现有网络接口移动到命名空间中ip link set
,以及(2)创建虚拟以太网对(一种“管道”) "),将一端放在命名空间中,让另一端保持全局,并为其设置路由、可选的 NAT 等。
OVH似乎(至少)拥有176.31.0.0/16
,并且根据这个帮助页面经过一番whois
侦查,他们将其分为 4096 个块,每块 16 个 IP 地址,其中每个块的前四个和后四个保留供内部使用。这也意味着他们购买 RIPE 块的客户要么少于 4096 个,要么他们使用运营商级 NAT,并且您将与其他人共享您的 IP 地址。
因此,如果您购买了/28
RIPE 块并获得了该块176.31.154.160/28
,则第 15 个地址 (176.31.154.175) 用于广播,第 14 个地址 (176.31.154.174) 是网关,您可以使用地址 176.31.154.161 到 176.31。 154.171。
对于 OVH,故障转移IP通过创建 的虚拟接口来添加eth0
。所以我假设您的 11 个可用地址将以相同的方式处理。然而,有些人报告问题这样做时,这可能与他们尝试做的特定方式相关,也可能无关。您可能还需要一个麦克夫兰而不是虚拟地址接口/标签,以便能够将其移动到网络命名空间中。因此按照惯例,您可能会使用mac0
(long form mac0@eth0
) 而不是eth0:0
下面使用的。
假设这是正确的方法,无论需要什么使其工作,您最终都会得到eth0:0
每个eth0:10
可用地址的接口。然后,您可以创建一个命名空间 ( ip netns add space0
),将接口移至此命名空间 ( ip link set eth0:0 netns space0
),在命名空间 ( ) 中设置正确的路由ip netns exec space0 ip route add default via 176.31.154.174 dev eth0:0
,并在该命名空间 ( ) 内运行应用程序ip netns exec space0 ffmpeg ...
。
如果您只是使用网络空间而不是成熟的容器,那么处理 DNS 解析有点繁琐,并且根据我的经验,将其限制在名称空间并不总是有效(而且我还没有找到修复它的好方法),尽管我有一个非常不同的设置,可能不适用于您的情况。因此,如果您在应用程序中使用主机名而不是原始 IP 地址,您可能会遇到问题,但解决这个问题可能值得另一个问题。
编辑:我想得越多,就越觉得 OVH 设置具有自己的广播地址的地址块实际上是为了作为运行多个虚拟机的一种手段:每个虚拟机都应该获得自己的 IP 地址(而不是一个 IP 地址)。网络命名空间),然后您就拥有了类似于专用 LAN 的东西,您的虚拟机可以在其中相互通信。因此,我们很可能通过使用命名空间来滥用这个概念。
编辑:查看 OVH 的 VPS 提供的内容而不是帮助页面,我发现他们提供了“13 个地理位置和 16 个 IP”选项。如果那是你买了什么,这又取决于他们如何设置。我找不到任何相关帮助页面,因此我假设该信息位于您收到的电子邮件中。如果您可以直接将这些 IP 地址分配给您的eth0
接口,则过程本质上是相同的,尽管您可能需要不同的网关。
另请注意,如果您只是运行 Web 服务器,您通常可以告诉 Web 服务器仅绑定到特定 IP(甚至绑定到多个 IP,并且根据您绑定到的 IP 采取不同的操作),因此您不需要在这种情况下需要网络空间。