我有一个Linux(内核3.14)服务器,它充当一个消费电子设备(机顶盒 – 机顶盒)农场的TFTP,NFS和HTTP服务器.设备使用TFTP从其引导内核,然后从我们机器上的NFS服务器等安装它们的根FSes等.
现在,由于一个深奥的技术原因,我不打算在这里钻研(只相信我:),每个STB必须在它自己的,物理上分开的局域网.
因此,建立网络的方式是ATM:
服务器有1个网卡,用于访问世界其他地方.
它还为每个服务的STB提供1个网卡 – 每个STB都连接到一个小型路由器,STB其他设备连接到该路由器并形成LAN.
目前有3个STB连接,局域网为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访问.不是很方便,容易出错!
这让我想到:如果我们简单地将这三个局域网配置为完全相同的172.16.50.0/24怎么办?从STB(以及局域网中其他设备)的角度来看,一切都应该没问题,但服务器的观点呢?
Linux服务器可以有N个不同的以太网接口,所有接口都配置了相同的静态IP,但是每个接口都连接到物理上独立的LAN?
解决方法
您需要为每个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魔术……