我有一个带有子接口的 Centos 5 盒子:
ifconfig eth0 10.1.1.1 255.255.255.255
ifconfig eth0:1 10.1.1.2 255.255.255.255
该服务器所处的环境中的网络掩码需要是 32 位。因此,为了指定默认路由,我们让服务器知道网关在哪里,然后将默认路由到它:
Destination Gateway Genmask Flags MSS Window irtt Iface
10.1.1.10 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
0.0.0.0 10.1.1.10 0.0.0.0 UG 0 0 0 eth0
因此 10.1.1.10 是默认网关,它是出接口 eth0
但是,离开服务器的所有数据包都具有与 eth0:1 关联的 IP 地址。它们需要在 eth0 上具有 IP。
路由在route-eth0中定义:
10.1.1.10/32 dev eth0
default via 10.1.1.10
我尝试强制解决 ifcfg-eth0 中的 GATEWAY 和 SRCADDR 问题:
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.1.1.1
SRCADDR=10.1.1.1
NETMASK=255.255.255.255
GATEWAY=10.1.1.10
ifcfg-eth0:1中没有定义网关:
DEVICE=eth0:1
IPADDR=10.1.1.2
NETMASK=
eth0 IP 地址是 /etc/hosts 中用于 fqdn 的 IP 地址。如果我 ping fqdn,则会得到 eth0 IP 地址。
有人可以告诉我如何强制传出数据包使用绑定到 eth0 的 IP 而不是绑定到 eth0:1 的 IP 作为源 IP。
答案1
如果在 ifcfg-eth0:1 文件中未设置网络掩码,Linux 默认为 255.0.0.0,因为它是旧式 A 类,并且它将能够到达该子接口上的网关。
答案2
您需要为 eth0 上的 IP 设置至少一个 /28 前缀掩码,以便与默认网关位于同一子网中(对于您描述的网关位于 .10 上的情形)。将 eth0 的网络掩码更改为 255.255.255.240,看看是否可以 ping 默认网关,然后您可以向该设备添加任何其他具有 /32 前缀(255.255.255.255)的 IP 地址,而不会出现问题。
答案3
正如问题所述,访问默认网关的方法不是通过广播域,每个 IP 地址应该是仅主机的,因此具有 32 位掩码。
访问网关需要通过两个静态路由条目。第一个是主机路由,用于描述网关的出接口,第二个用于将默认路由定义为该网关。
如果您明确说明网关在路由表中的位置,则不需要少于 32 位的网络掩码。
这里的问题是,子接口没有指定网络掩码,因此默认为 /24。这意味着虽然 eth0 接口是 32 位的,并且实际上没有连接到 IP 网络,但 eth0:1 接口位于 10.1.1.0/24 中,因此是连接到网关 IP 所在网络的接口。连接的接口路由优先于静态路由,因此被选为源 IP 地址。
正如问题所述,掩码需要为 32 位才能实现所需的行为,因此答案是将子接口的网络掩码更改为 32 位。一旦发生这种情况,唯一可用的路由就是默认路由,即到定义了其自身主机路由的网关。
对于那些不了解为什么使用此设置的人来说,它适用于需要灵活分配和保存 IP 地址的情况。使用此方法无需将地址空间划分为子网,尽管它确实会带来管理开销。如前所述,环境不受提问者的控制。