辅助 IP(eth0:0)充当主服务器 IP

辅助 IP(eth0:0)充当主服务器 IP

我有一台 CentOS 服务器,配置了 4 个连续的 IP:
eth0 5.xx251
eth0:0 5.xx252
eth0:1 5.xx253
eth0:2 5.xx254

问题是,所有流量都以 eth0:0(5.xx252)作为源 IP 流向互联网,而不是 eth0。
# curl ifconfig.me
5.x.x.252

我该如何修复这个问题,以便所有流量都通过 eth0(即我的主 IP)出去?

PS:我的服务器是运行在Xen dom0上的VPS,后者配置为路由模式网络。

提前致谢!

服务器配置

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.251  Bcast:5.x.x.255  Mask:255.255.255.255
          inet6 addr: fe80::x:x:x:x/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14675569 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9463227 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4122016502 (3.8 GiB)  TX bytes:25959110751 (24.1 GiB)
          Interrupt:23 

eth0:0    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE   
          inet addr:5.x.x.252  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:1    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.253  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:2    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.254  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23  

# cat /etc/hosts
127.0.0.1       localhost.localdomain localhost
5.x.x.251       [fqdn] [hostname]

# cat ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.251
NETMASK=255.255.255.224
SCOPE="peer 5.x.y.82"

# cat ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.252
NETMASK=255.255.255.224

# cat route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
5.x.y.82        0.0.0.0         255.255.255.255 UH        0 0          0 eth0
5.x.x.224       0.0.0.0         255.255.255.224 U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         5.x.y.82        0.0.0.0         UG        0 0          0 eth0

2012 年 8 月 29 日更新
当我运行时,/etc/init.d/network restart我收到一个RTNETLINK answers: File exists错误,这让我相信有另一条使用默认网关到另一个网络的路由,如下图所示这里

# /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  RTNETLINK answers: File exists
                                                           [  OK  ]

可以肯定的是,当我先删除ip route del default via 5.x.y.82 dev eth0然后使用 .251 IP 再次添加它时,一切都按预期工作。
有没有办法将route del命令添加到ifcfg-eth0route-eth0文件?我可以看到这可以在 Debian 上完成pre-up ip addr del ...更多信息),但是 CentOS 怎么样?

答案1

这个文件至少在 CentOS 5 上,我怀疑上面你可以通过简单地给出正确的 iproute2 命令参数来指定你的路由。(请参阅 部分IP Command Arguments Format

因此,不要写类似这样的内容:

# route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

你可以有一个像这样的文件:

default via 5.x.y.82 dev eth0  src 5.x.x.251

但是我手边没有 Redhat/Redhat 派生盒可供测试。

答案2

如果别名 IP 地址不用作非本地目标的源地址,则它们不应与默认路由的目标位于同一子网中。因此,请将其网络掩码更改为255.255.255.255并删除其广播地址。

答案3

首先清除你的 0.0.0.0 默认网关

route del -net default

然后将默认的 eth0 声明为默认网关设备

route add -net default gw 5.x.y.82 dev eth0

它应该可以工作。验证

ip ro li

为了将其保存为规则,请尝试以下混乱的事情:

打开/etc/sysconfig/network-scripts/network-functions,找到函数add_default_route (),并在该函数中,在调用后find_gateway_dev添加一行GATEWAYDEV="eth0"

脚本会network-functions决定哪个设备成为默认网关。它使用 来检查到网关 IP 的路由ip get route to GATEWAY,并使用 sed 匹配设备。似乎每次都是 eth0:0 成为默认网关,因此通过硬编码GATEWAYDEV="eth0"可以确保始终选择 eth0 作为网关设备。

在旧版本的 RH 中,你只需编辑/etc/sysconfig/static-routes并添加default via 5.x.y.82 dev eth0

最后的手段/etc/rc.local永远是你的朋友!

答案4

由于它们都在同一个子网上,内核将选择一个来使用。您可以通过运行来验证这一点

 ip addr list dev eth0

您必须执行一些 iptables 魔法才能使其正常工作。请参阅以下内容

当使用 IP 别名时,操作系统如何确定哪个 IP 地址将用作出站 TCP/IP 连接的源?

相关内容