你好,网络专家,
我有一台 Linux(内核 3.14)服务器,它充当一组消费电子设备(机顶盒 - STB)的 TFTP、NFS 和 HTTP 服务器。这些设备使用 TFTP 启动内核,然后从我们机器上的 NFS 服务器安装它们的根文件系统,等等。
现在,出于一个深奥的技术原因,我不会在这里深入探讨(相信我吧:),每个 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?
答案1
是的,这是可能的,使用一个名为network namespaces
(请参阅man ip-netns(8)
)的出色功能。它基本上为您提供了多个不同的网络堆栈,每个堆栈都有自己的一组接口、路由等。
您需要为每个 STB 创建一个命名空间,然后在每个命名空间中分别运行所需的服务。
对于命名空间,您需要按以下步骤操作:
创建一个名为的命名空间
net1
:ip netns add net1
将您的接口分配
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
现在,IP 地址 172.16.50.1 在默认命名空间中不可见。简单的方法ping 172.16.50.1
行不通,您首先需要切换到net1
命名空间并在那里执行命令:
ip netns exec net1 <command>
通过这种方式,您现在就可以在每个命名空间中运行每个服务。
如果您喜欢冒险,甚至可以尝试以某种方式将所有请求从 STB 重定向到中央服务。为此,您需要从每个命名空间到默认命名空间的隧道(请参阅ip link help veth
)以及相当多的 iptables 魔法……
答案2
从技术上讲,您可以,但配置会很复杂。这将是一个临时解决方案,并且需要每个 STB 都具有唯一的 IP,同时在自己的线路上隔离才能满足您的要求。客户端上的配置不会改变。以下是服务器上的配置:
ifconfig eth0 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth0
route add 10.0.50.2 dev eth0
ifconfig eth1 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth1
route add 10.0.50.3 dev eth1
# ...
这应该会导致路由表中每个接口只有一个 IP。它们位于不同的线路上,因此不会发生串扰。这些设备中的每一个都会认为它们位于 2 个节点 10.0.0.0/8 上。
当服务器想要与 10.0.50.2 通信时,它会查看 ARP 表,然后查看路由表。如果 ARP 表为空,路由表会告诉它在相应的接口上发送 ARP 请求,因此它们必须具有唯一的 IP,否则服务器只能与最后添加的路由通信。
您可以将 DHCP 服务器设置为根据硬件地址分配 IP 地址,或者在每个接口上运行单独的动态 DHCP 范围。DHCP 服务器可以分发任何地址,但 eth0 线路上的 10.0.50.3 将无法访问。
答案3
您不能在多个接口上使用相同的 IP 地址。这样就无法正常工作(通常它只能在分配了 IP 的最后一个接口上工作)。
您需要将以太网接口放入网桥并在网桥本身上分配 IP 地址。
基本上,该桥中的所有以太网端口都将用作交换机。
或者,您可以移除每个 STB 的所有以太网卡并简单地添加一个交换机(这比在您的服务器上添加新的以太网卡更具可扩展性)。
但由于要求每个 STB 都在自己的广播域中,所以恐怕您需要坚持当前的设置。
或者至少简化设置的服务器硬件部分,放弃多个以太网卡,只需添加一个管理型交换机,并使用 VLAN 仅使用一个物理以太网卡来模拟“多个以太网卡”。