辅助IP(eth0:0)就像主服务器IP一样

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

问题是所有stream量都通过eth0:0(5.xx252)作为源IP,而不是eth0。
# curl ifconfig.me
5.xx252

我怎样才能解决这个问题,以便所有的stream量通过eth0,即我的主要IP?

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

提前致谢!

服务器configuration

 # ifconfig eth0 Link encap:Ethernet HWaddr 00:x:x:x:x:AE inet addr:5.xx251 Bcast:5.xx255 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.xx252 Bcast:5.xx255 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.xx253 Bcast:5.xx255 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.xx254 Bcast:5.xx255 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.xx251 [fqdn] [hostname] 

 # cat ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static ONBOOT=yes IPADDR=5.xx251 NETMASK=255.255.255.224 SCOPE="peer 5.xy82" 

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

 # cat route-eth0 ADDRESS0=0.0.0.0 NETMASK0=0.0.0.0 GATEWAY0=5.xy82 

 # netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 5.xy82 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 5.xx224 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.xy82 0.0.0.0 UG 0 0 0 eth0 

2012年8月29日更新
当我运行/etc/init.d/network restart我得到一个RTNETLINK answers: File exists错误,这导致我相信有另一个路由到另一个networking使用默认网关,在这里看到。

 # /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.xy82 dev eth0删除ip route del default via 5.xy82 dev eth0 ,然后再用.251 IP添加它,一切都按预期工作。
有没有办法将route del命令添加到ifcfg-eth0route-eth0文件中? 我可以看到,这可以用Debian( 更多信息 )上的pre-up ip addr del ...来完成,但是CentOS呢?

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

所以不要写这样的东西:

 # route-eth0 ADDRESS0=0.0.0.0 NETMASK0=0.0.0.0 GATEWAY0=5.xy82 

你可以只有这样一个文件:

 default via 5.xy82 dev eth0 src 5.xx251 

我没有一个Redhat / Redhat派生的方便testing。

如果别名IP地址不能用作非本地目标的源地址,则它们不应与默认路由的目标位于同一个子网中。 所以把他们的networking掩码改为255.255.255.255并删除他们的广播地址。

首先清除你的0.0.0.0默认网关

 route del -net default 

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

 route add -net default gw 5.xy82 dev eth0 

它应该工作。 validation

 ip ro li 

为了保存这个规则,试试这个混乱的东西:

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

结果是, network-functions脚本决定哪个设备成为默认网关。 它检查到网关IP的ip get route to GATEWAY ,使用ip get route to GATEWAY ,使用sed匹配一个设备。 eth0:0似乎每次都是一个,所以通过对GATEWAYDEV="eth0"进行硬编码,确保始终selecteth0作为网关设备。

在较旧版本的RH中,您可以编辑/etc/sysconfig/static-routesdefault via 5.xy82 dev eth0添加default via 5.xy82 dev eth0

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

因为它们都在同一个子网上,所以内核会select一个来使用..你可以通过运行来validation

  ip addr list dev eth0 

你必须做一些iptables的魔术来使它正常工作。 请参阅以下内容

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

听起来你可能是新内核环境的受害者。 启用alias promotion将会过去。

在你的/etc/sysctl.conf设置

 net.ipv4.conf.all.promote_secondaries = 1 

顺便说一句,你有任何时髦的SNAT/MASQUERADE iptables规则,正在改变出站源IP?

routeifconfig使用内核中不知道基于策略路由的旧的,不推荐使用的networking接口。 你应该使用ip命令,尤其是路由相关的信息。

也就是说, ip ro li或完整命令ip route list table main ,输出内核使用的实际路由表。 ip rule list将显示所有正在使用的路由表(应该至less有localmaindefault )。

正如您发布的(来自http://pastebin.com/A1KRiWTz ):

 # ip ro li 5.xy82 dev eth0 proto kernel scope link src 5.xx251 5.xx224/27 dev eth0 proto kernel scope link src 5.xx252 169.254.0.0/16 dev eth0 scope link metric 1002 default via 5.xy82 dev eth0 src 5.xx252 

您需要删除默认路由并使用正确的源地址重新创build它:

 ip route del default ip route add default via 2.xy82 dev eth0 src 5.xx251 scope global 

我不知道如何做到这一点RedHat的方式,虽然(哪里把它放在RedHat特定的configuration文件),使用/etc/rc.local应该工作,虽然这是有点hacky解决scheme。 你可以尝试使用system-config-network

您需要为iptable中的入站和出站stream量编写一个PREROUTING规则,您需要说任何tcp或UDPstream量或端口80或8080(仅适用于默认互联网)应该去所需的eth。