Я пытаюсь заставить две виртуальные машины (под управлением 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, когда существует мост. Это хорошо, когда мост закомментирован из интерфейсов.
Полезен ли arp_filter в этой ситуации? В документации говорится, что «вы должны использовать маршрутизацию на основе источника, чтобы это работало». Может кто-нибудь подкинет мне ссылку, объясняющую, как я настраиваю «маршрутизацию на основе источника» (я новичок в этой теме).
Можно ли использовать arptables или ebtables для управления этим поведением? Глядя на их документацию, я вижу информацию о том, как реагировать на запросы APR и когда отвечать на них, но не очень много о поведении кеша APR.
В общем, следует ли мне что-то делать с sysctl и ARP или мне следует устанавливать свои IP-адреса по-другому? Я вижу в сети руководства, в которых рассказывается, как сделать это без проблем, но все они назначают гостей в отдельную подсеть, делая мост в качестве шлюза. Для меня это не сработает - мне нужно, чтобы все устройства были в одной подсети.
Подойдет любая идея, если:
Это так называемая «проблема 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