同一主机上同一子网内的多个IP地址

是否有可能(真正的措辞应该是“是正确的”)在相同的主机上拥有多个属于同一子网的IP地址?

这里是一个例子:

#Host 1 eth0 -> 10.0.0.1/24 eth1 -> 10.0.0.2/24 eth1:1 -> 10.0.0.3/24 

我有直觉,由于路由问题,这不能工作,但我无法解释为什么我这么认为。

那么这种模式是否正确? 如果是的话,这是常见的吗? 关于这样的configuration有什么问题?

是的,确实,这样做完全没有问题 – 可能需要小心一点,你如何设置你的默认网关,但它确实不是一个问题。 如果事实是如此,那么你就必须设置多站点的web服务器(我们很久以前就在讨论)。

在这种types的设置中,人们的期望有一个普遍的问题。 在同一子网上分配多个地址就像通常所有​​的传出通信似乎来自单个地址一样。

所以对传入连接的响应应该没问题。 回复应该来自传入连接的地址。 但是,如果您期望某个进程,那么将会进行传出连接,要使用除第一个之外的特定地址,则需要确保您可以专门configurationIP以在应用程序中进行绑定。

这是完全正确的,但是按照您的要求 – 在同一个子网中连接到同一个交换机的多个物理接口 – 不build议使用。 一般来说,Linux对付它,但是一些操作系统(例如Solaris)真的不喜欢它。

把所有的地址放在一个物理接口(eth0,eth0:0,eth0:1等)上,只连接它,如果你想连接多个接口来提高性能,查看绑定,然后重载bonded接口(bond0 ,bond0:0,bond0:1等等)。

不,这个configuration不被推荐,尽pipestream行的信念。

在与物理networking相同的子网(例如:eth1)中有虚拟接口 (例如:eth1:1)是非常常见和有用的configuration,不会造成任何问题。

但是,在同一子网中(或最差的,在不同的子网中,但在同一个广播域中)具有不同的物理接口可能会导致由于非确定性ARP条目引起的问题。 这至less适用于Solaris和Linux。 如果出于某种原因需要这样做,则build议或要求调整ARP行为,即在其中一个接口上禁用ARP,或configurationARP以将其从物理接口的回复限制为与其匹配的IP地址。 在http://www.mjmwired.net/kernel/Documentation/networking/ip-sysctl.txt中查找arp_filter。 另一种方法是将networking掩码设置为/ 24,而不是其中一个接口。

在Solaris上,支持在同一子网上configuration多个接口的方法是使用IPMP(IP多path)。

最后,如果物理接口不共享相同的IP协议栈(例如:Solaris专用IP区域),或者被802.1Q VLAN标记隔离,则此限制不适用。

这是可能的。 我以前用过。

我有一个应用程序连接到远程服务器时需要使用不同的源IP地址。 在我的情况下,这对于克服远程服务器施加的每个IP所允许的连接数量的限制是非常重要的。

我在同一个接口上configuration了多个IP地址,我的应用程序被configuration为以循环方式使用这些IP。

是的,这将工作。

正如其他答案所暗示的,这样做的真正目的是在不同的IP地址上提供不同的服务。

如果你在同一台机器上安装了IIS和Apache,并且希望在端口80上运行它们,则需要在10.0.0.1上设置一个,而在10.0.0.2上设置另一个,因为它们都不能在端口80相同的IP地址。

它实际上不是路由的问题,因为只有那台机器才能从networking浏览器,ping等通用程序伸出到networking上。在这种情况下,总是要使用相同的地址,因为它的来源。

在路由表中,路由指定了要使用的接口,因此,无论哪个地址绑定到合格路由。

我将在这里抛出一些警告。 也就是说,通常的Linux工具会给你带来麻烦。 他们根本不处理多个接口。 要做到这一点,你必须使用iproute2 。 与通常的ifconfig / route方法相比,这是一个不太常用的工具。 没有它,你会看到奇怪的和不正确的行为,如一个网卡响应其他stream量。

– 克里斯托弗·卡雷尔

我有一个复杂的设置,使用这种types的networking。 我有两个内部接口和一个到Internet的外部接口。 (这是即将改变到两个外部接口在不同的子网和内部接口分裂为两个内部接口,但它沿着相同的路线)反正 – 在答案!

假设您有两个内部接口:

 eth0 192.168.1.2 eth1 192.168.1.3 

您使用192.168.1.1的Internet(路由器)的内部上行链路

所以你的默认路由表看起来像(命令: netstat -rn

 Dest Gw Genmask Flags ... ... Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG eth0 192.168.1.0 0.0.0.0 255.255.255.0 U eth0 192.168.1.0 0.0.0.0 255.255.255.0 U eth1 

这是你的问题,所有的输出将通过eth0因为它是你的路由表上的第一个命中。 所以,如果你使用另一台计算机(甚至是同一个盒子)ping 192.168.1.3eth1 ),你将不会得到回应? 为什么? 因为它来自192.168.1.2

您必须使用iproute2为每个设备设置单独的路由表。 这种方式,当一个设备获得INPUT链上的东西,它通过同一个设备回复。

编辑/etc/iproute2/rt_tables添加:

 1 my_eth0 2 my_eth1 

然后执行以下操作:

 ip route add 192.168.1.0/24 dev eth0 table my_eth0 ip route add default via 192.168.1.1 dev eth0 table my_eth0 ip route add 192.168.1.0/24 dev eth1 table my_eth1 ip route add default via 192.168.1.1 dev eth1 table my_eth1 

现在通过执行以下内容添加要使用的表的规则:

 ip rule add from 192.168.1.2 table my_eth0 ip rule add from 192.168.1.3 table my_eth1 

这将告诉你的系统,当它在eth0上得到一个请求时,使用my_eth0路由表来回复。 当它在eth1上收到请求时,使用my_eth1路由表进行回复。 当你得到这些命令时,把它们放在你的/etc/rc.local文件中,通过执行sudo chmod u+x /etc/rc.local来使rc.local可执行,这样你的路由在重启的时候就不会被清除了。 玩的开心!