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

Linux сохраняет записи кэша arp с использованием неправильного интерфейса

Я пытаюсь заставить две виртуальные машины (под управлением CentOS) разговаривать с хостом (Ubuntu 10.04), используя VDE и внешнюю сеть.

Пока что я столкнулся с проблемой ARP.

На хосте у меня есть физический интерфейс eth0 и виртуальный tap0, соединенные мостом br0. Все в одной подсети.

br0       Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.3  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:1381 (1.3 KB)

br0:1     Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.4  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.1  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:2362 (2.3 KB)
          Interrupt:33 Base address:0x6000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:778 errors:0 dropped:0 overruns:0 frame:0
          TX packets:778 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:62832 (62.8 KB)  TX bytes:62832 (62.8 KB)

tap0      Link encap:Ethernet  HWaddr b6:22:43:93:ed:60  
          inet addr:172.16.1.2  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:3 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:1980 (1.9 KB)

Когда я пингую эту машину Host Ubuntu с другой машины (или с гостя), запись кэша arp сохраняется как запись br0, поэтому машина Ubuntu никогда не отвечает на ping.

Address                  HWtype  HWaddress           Flags Mask            Iface
172.22.64.4                      (incomplete)                              eth0
172.22.64.4              ether   00:25:b3:0f:0b:14   C                     br0

Вот файл интерфейсов, который фактически работает для настройки IP-адресов на всех интерфейсах: auto lo iface lo inet loopback

auto eth0
iface eth0 inet manual
        address 172.16.1.1
        netmask 255.0.0.0
        gateway 172.16.1.255
        post-up ifconfig eth0 172.16.1.1 netmask 255.0.0.0

auto tap0
iface tap0 inet static
        address 172.16.1.2
        netmask 255.0.0.0
        gateway 172.16.1.255
        pre-up vde_tunctl -t $IFACE
        post-up ifconfig tap0 172.16.1.2 netmask 255.0.0.0
        post-up vde_switch -t $IFACE -s /tmp/vde-$IFACE -d -g rhuser -m 664
        post-down vde_tunctl -d $IFACE

auto br0
iface br0 inet static
        address 172.16.1.3
        netmask 255.0.0.0
        gateway 172.16.1.255
        post-up ifconfig br0 172.16.1.3 netmask 255.0.0.0
        post-up ifconfig br0:1 172.16.1.4 netmask 255.0.0.0
        bridge_ports eth0 tap0

Я пробовал отключить ARP на br0 с помощью ip link set br0 arp off. Я также пробовал устанавливать такие вещи, как arp_ignore для br0. В обоих случаях Ubuntu никогда не отвечает на запросы ARP. И это мой первый вопрос - почему eth0 не отвечает на запросы ARP, когда существует мост. Это хорошо, когда мост закомментирован из интерфейсов.

  1. Полезен ли arp_filter в этой ситуации? В документации говорится, что «вы должны использовать маршрутизацию на основе источника, чтобы это работало». Может кто-нибудь подкинет мне ссылку, объясняющую, как я настраиваю «маршрутизацию на основе источника» (я новичок в этой теме).

  2. Можно ли использовать arptables или ebtables для управления этим поведением? Глядя на их документацию, я вижу информацию о том, как реагировать на запросы APR и когда отвечать на них, но не очень много о поведении кеша APR.

  3. В общем, следует ли мне что-то делать с sysctl и ARP или мне следует устанавливать свои IP-адреса по-другому? Я вижу в сети руководства, в которых рассказывается, как сделать это без проблем, но все они назначают гостей в отдельную подсеть, делая мост в качестве шлюза. Для меня это не сработает - мне нужно, чтобы все устройства были в одной подсети.

Подойдет любая идея, если:

  • ВМ находятся в той же подсети, что и внешняя сеть.
  • Виртуальные машины могут общаться с хостом, чтобы иметь NFS и т. Д.
  • Хосту не обязательно разговаривать с внешней сетью.

  • Это так называемая «проблема arp».

    http://www.ssi.bg/~ja/#arp_announce

    Дополнительную информацию о флагах устройства arp_announce и arp_ignore см. В файле linux / Documentation / network / ip-sysctl.txt.

    Я думаю, вам нужен arp_announce = 1 для всех интерфейсов.

    См. Также (в целом):

    http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.arp_problem.html