Назад | Перейти на главную страницу

Почему Linux выбирает неправильный IP-адрес источника

и что делать, чтобы он выбрал правильный?

Все это происходит внутри контейнера 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>