Linux

為什麼Linux選擇錯誤的源IP地址

  • October 25, 2013

以及如何讓它選擇正確的?

這一切都發生在 OpenVZ 容器內:

主機是帶有 Redhat/OpenVZ 核心的 Debian/Wheezy:

root@mycl2:~# uname -a
Linux mycl2 2.6.32-openvz-042stab081.5-amd64 #1 SMP Mon Sep 30 16:40:27 MSK 2013 x86_64 GNU/Linux

容器有兩個(虛擬)網路介面。一個在公共地址空間,一個在私有地址空間:

root@mycl2:~# ifconfig
lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
         inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
         UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
         RX packets:475 errors:0 dropped:0 overruns:0 frame:0
         TX packets:775 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:32059 (31.3 KiB)  TX bytes:56309 (54.9 KiB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
         inet addr:80.123.123.29  P-t-P:80.123.123.29  Bcast:80.123.123.29  Mask:255.255.255.255
         UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
         inet addr:10.0.1.29  P-t-P:10.0.1.29  Bcast:10.0.1.29  Mask:255.255.255.255
         UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

到專用網路的路由是手動設置的:

root@mycl2:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 venet0
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 venet0

嘗試在私網上ping別人導致選擇了錯誤的源地址:

root@mycl2:~# ip route get 10.0.1.26
10.0.1.26 dev venet0  src 80.123.123.29 
   cache  mtu 1500 advmss 1460 hoplimit 64

為什麼會這樣,我該怎麼辦?

編輯:

如果我創建路線(感謝 Joshua)

ip route add 10.0.0.0/8 dev venet0 src 10.0.1.29

這是工作。但是根據參數應該只在選擇這條路由man ip-route情況src下設置源IP 。但是,如果選擇了這條路線,那麼源 IP 無論如何都會是這樣。

聽起來您想指定將流量路由出特定別名介面並使用與該別名關聯的源 IP。您的路由表目前未反映該要求。也許您可以使用它來修復它:

ip route add <NET> dev <ALIAS_DEV> src <SRC_IP>

引用自:https://serverfault.com/questions/548448