%20%E7%9A%84%E4%BD%9C%E7%94%A8%E9%A1%9E%E4%BC%BC%E4%B8%BB%E4%BC%BA%E6%9C%8D%E5%99%A8%20IP.png)
我有一台 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
中嗎?我可以看到這可以在 Debian 上完成(ifcfg-eth0
route-eth0
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
然後聲明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
腳本決定哪個裝置成為預設網關。它使用 sed 檢查到網關 IP 的路由ip get route to GATEWAY
並匹配設備。似乎每次都是 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 魔法才能讓它正常運作。請參閱以下內容