и что делать, чтобы он выбрал правильный?
Все это происходит внутри контейнера OpenVZ:
Хост - Debian / Wheezy с ядром Redhat / OpenVZ:
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
Попытка пинговать других в частной сети приводит к выбору неверного адреса источника:
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
Почему это так и что я могу с этим поделать?
РЕДАКТИРОВАТЬ:
Если я создам маршрут с помощью (спасибо Джошуа)
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>