多个接口上的IP相同

你好networking大师,

我有一个Linux(内核3.14)服务器,它作为消费电子设备(机顶盒-STB)场的TFTP,NFS和HTTP服务器。 这些设备使用TFTP从它们的内核启动,然后从我们的机器上的NFS服务器挂载它们的根FSs等。

现在,由于一个深奥的技术原因,我不打算在这里(只要相信我:),每个机顶盒必须在它自己的,物理上分开的局域网。 所以联网设置ATM的方式是:

该服务器有1个网卡用于访问世界其他地方。 它还为每个STB提供一个网卡 – 每个STB都连接到一个小型路由器,STB +一些其他设备连接到该路由器,形成一个局域网。

目前有3个机顶盒连接,局域网为172.16.50.0/24,172.16.51.0/24和172.16.52.0/24。 它的所有工作很好。

但是,我们有3个不同的局域网意味着同一个服务器必须从STB1访问172.16.50.1,从STB2访问172.16.51.1,从STB3访问172.16.52.1 – 这意味着我们有一个不同的环境每个机顶盒和每次我们说 – 上传新的RootFS用于STBs,我们需要手动编辑一些configuration文件,并把正确的IP服务器必须从这个特定的机顶盒访问。 不是很方便,容易出错!

这让我想到:如果我们简单地将这三个局域网configuration成完全相同的172.16.50.0/24,怎么办? 从机顶盒(和局域网中的其他设备)的angular度来看,一切都应该没问题,但是服务器的观点呢?

Linux服务器可以有N个不同的以太网接口,所有的接口都configuration了相同的静态IP,但是每个接口都连接到一个物理上独立的LAN上?

是的,这是可能的,使用一个很好的function称为network namespaces (见man ip-netns(8) )。 它基本上给你多个不同的networking堆栈,每个networking堆栈都有自己的一组接口,路由等。

您需要为每个STB创build一个名称空间,然后可以在每个名称空间中分别运行所需的服务。

对于命名空间,您需要按照以下步骤进行操作:

  • 创build一个名为net1的名称空间:

     ip netns add net1 
  • 将您的接口ethX分配给新的名称空间并configuration您的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> 

通过这种方式,您现在可以在每个名称空间中运行每个服务。

如果你觉得冒险,你甚至可以尝试以某种方式将所有来自机顶盒的请求redirect到中央服务。 为此,您需要从每个名称空间到默认名称空间的隧道(请参阅ip link help veth )以及相当多的iptables魔术…

您不能在多个接口上使用相同的IP地址。 它只是不能正常工作(通常它只会在分配IP的最后一个接口上工作)。

您需要将以太网接口放入网桥,并在网桥上分配IP地址。

基本上桥中的所有以太网端口将作为交换机工作。

或者,您可以删除每个STB的所有以太网卡,只需添加一个交换机(这比在您的服务器上添加新的以太网卡更具扩展性)。

但是由于每个机顶盒都有自己的广播域,所以恐怕你需要坚持你目前的设置。

或者为了简化您的设置的服务器硬件部分,请将多个以太网卡分开,然后只需添加一个pipe理型交换机,然后使用VLAN模拟仅使用一个物理以太网卡的“多个以太网卡”。

技术上你可以,但configuration将是丰富多彩的。 这将是一个混乱,它会要求每个机顶盒有一个独特的IP,而被隔离在自己的电线,以满足您的要求。 客户端上的configuration不会改变。 这是服务器上的configuration:

 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或在每个接口上运行单独的dynamicDHCP范围。 DHCP服务器可以发送任何东西,但eth0线路上的10.0.50.3将不可访问。