Les*_*zek 11 linux linux-networking
网络大师您好,
我有一个 Linux(内核 3.14)服务器,它充当消费电子设备群(机顶盒 - STB)的 TFTP、NFS 和 HTTP 服务器。这些设备使用 TFTP 来引导它们的内核,然后从我们机器上的 NFS 服务器上挂载它们的根 FS,等等。
现在,出于一个深奥的技术原因,我不会在这里深入研究(相信我:),每个 STB 都必须位于自己的、物理上独立的 LAN 中。所以网络设置ATM的方式是:
服务器有 1 个网卡,用于访问世界其他地方。它还为它所服务的每个 STB 配备 1 个网卡 - 每个网卡都连接到一个小型路由器,STB + 一些其他设备连接到该路由器并形成一个 LAN。
目前连接了 3 个 STB,LAN 分别为 172.16.50.0/24、172.16.51.0/24 和 172.16.52.0/24。它的所有工作都很好。
然而:事实上,我们有 3 个不同的 LAN,这意味着必须访问相同的服务器,如来自 STB1 的 172.16.50.1、来自 STB2 的 172.16.51.1 和来自 STB3 的 172.16.52.1 - 这意味着我们有一点不同的环境每个 STB 以及每次我们 - 比如说 - 上传要在 STB 上使用的新 RootFS 时,我们需要手动编辑一些配置文件并放置正确的 IP,服务器必须从这个特定的 STB 访问。不是很方便,容易出错!
这让我想到:如果我们简单地将这三个 LAN 配置为完全相同的 172.16.50.0/24 会怎样?从 STB(以及 LAN 中的其他设备)的角度来看,一切都应该没问题,但是从服务器的角度来看呢?
Linux 服务器是否可以有 N 个不同的以太网接口,所有接口都配置相同的静态 IP,但每个接口都连接到物理上独立的 LAN?
Oli*_*ver 17
是的,这是可能的,使用称为network namespaces(请参阅 参考资料man ip-netns(8))的好功能。它基本上为您提供了多个不同的网络堆栈,每个堆栈都有自己的一组接口、路由等。
您需要为每个 STB 创建一个命名空间,然后可以在每个命名空间中分别运行所需的服务。
对于命名空间,您需要按以下步骤操作:
创建一个名为 的命名空间net1:
ip netns add net1
Run Code Online (Sandbox Code Playgroud)将您的接口分配ethX给新的命名空间并配置您的 IP 地址 172.16.50.1:
ip link set dev ethX netns net1
ip netns exec net1 ip link set dev ethX up
ip netns exec net1 ip address add 172.16.50.1/24 dev ethX
Run Code Online (Sandbox Code Playgroud)IP 地址 172.16.50.1 现在在您的默认命名空间中不可见。一个简单的ping 172.16.50.1不起作用,您首先需要切换到net1命名空间并在那里执行命令:
ip netns exec net1 <command>
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您现在可以在每个命名空间中运行每个服务。
如果您喜欢冒险,您甚至可以尝试以某种方式将来自 STB 的所有请求重定向到中央服务。为此,您需要从每个命名空间到默认命名空间的隧道(请参阅ip link help veth参考资料)和相当多的 iptables 魔法……
Cha*_*a0s -1
您不能在多个接口上使用相同的 IP 地址。它只是无法正常工作(通常它只能在分配 IP 的最后一个接口上工作)。
您需要将以太网接口放入网桥中,并在网桥本身上分配 IP 地址。
本质上,该网桥中的所有以太网端口都将充当交换机。
或者,您可以删除每个 STB 的所有以太网卡,然后简单地添加一个交换机(这比在服务器上添加新的以太网卡更具可扩展性)。
但由于每个机顶盒都需要位于自己的广播域中,因此恐怕您需要坚持当前的设置。
或者,为了至少简化设置的服务器硬件部分,放弃多个以太网卡,只需添加一个托管交换机并使用 VLAN 来模拟仅使用一个物理以太网卡的“多个以太网卡”。