有可能(实际上应该是“它正确吗”)在同一台主机上拥有属于同一子网的多个 IP 地址吗?
以下是一个例子:
#Host 1
eth0 -> 10.0.0.1/24
eth1 -> 10.0.0.2/24
eth1:1 -> 10.0.0.3/24
我直觉地认为由于路由问题这无法工作,但我无法解释为什么我这么认为。
那么这种模式正确吗?如果正确,它常见吗?这种配置可能存在哪些问题?
答案1
是的,当然,这样做完全没有问题 - 可能需要稍微小心设置默认网关,但这实际上根本不是问题。如果事实上你必须这样设置多站点网络服务器(我们很久以前就说过了)。
答案2
在这种设置中,人们的期望存在一个相当常见的问题。在同一个子网上分配多个地址,通常所有外发通讯看起来是来自一个地址。
因此对传入连接的响应应该没问题。回复应该来自传入连接的地址。但是如果您希望某个将进行传出连接的进程使用除第一个地址之外的特定地址,那么您需要确保您可以在应用程序中专门配置要绑定的 IP。
答案3
我在某个地方设置了复杂的网络,使用了这种类型的网络。我有两个内部接口和一个外部接口,连接到互联网。(这将更改为不同子网上的两个外部接口,并将内部接口拆分为两个内部接口,但它沿着相同的路线前进)无论如何 - 继续回答!
假设您有两个内部接口:
eth0 192.168.1.2
eth1 192.168.1.3
您使用内部上行链路(路由器)连接到互联网192.168.1.1
因此,您的默认路由表将如下所示(命令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.3
( eth1
),您将得不到响应?为什么?因为它来自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
文件中,并rc.local
通过执行使之可执行sudo chmod u+x /etc/rc.local
,这样您的路由在您重新启动时就不会被清除。玩得开心!
答案4
这完全没问题,但不建议按照你现在的做法(同一子网中的多个物理接口连接到同一交换机)。Linux 通常可以很好地应对这种情况,但有些操作系统(例如 Solaris)确实不喜欢这种情况。
将所有地址放在一个物理接口(eth0、eth0:0、eth0:1 等)上,并且仅连接该接口。如果您想要连接多个接口以提高性能,请研究绑定,然后使绑定接口过载(bond0、bond0:0、bond0:1 等)。