我有一个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-eth0或route-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-routes并default 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?
route和ifconfig使用内核中不知道基于策略路由的旧的,不推荐使用的networking接口。 你应该使用ip命令,尤其是路由相关的信息。
也就是说, ip ro li或完整命令ip route list table main ,输出内核使用的实际路由表。 ip rule list将显示所有正在使用的路由表(应该至less有local , main和default )。
正如您发布的(来自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。