Я пытаюсь создать две виртуальные машины, которые подключены к одной частной сети. Я использую Linux с qemu-kvm 1.0.
Мой план атаки был таков:
brctl addbr bridge ifconfig bridge up tunctl -t tap1 tunctl -t tap2 ifconfig tap1 up ifconfig tap2 up brctl addif bridge tap1 brctl addif bridge tap2 qemu-kvm -net nic,macaddr=52:54:00:11:22:33 -net tap,ifname=tap1 disk1.img qemu-kvm -net nic,macaddr=52:54:00:44:55:66 -net tap,ifname=tap2 disk2.img
После загрузки я даю первой машине IP-адрес 192.168.100.5, а второй 192.168.100.10.
На этом этапе, когда я пытаюсь выполнить эхо-запрос одной виртуальной машины от другой, ответа на эхо-запрос нет. Однако, используя Wireshark, я вижу, что запросы ARP отправляются и на них отвечают, и я подтвердил, что кеши ARP действительно содержат информацию о других виртуальных машинах. Тем не менее, ответы на пинг не генерируются (как видно через Wireshark).
Затем я попытался присвоить мосту IP-адрес 192.168.100.1. После этого пинг между виртуальными машинами работает, но проблема все еще существует: теперь все запросы, похоже, исходят от самого моста. Например, если я подключаюсь с одной виртуальной машины к FTP-серверу другой, запуск netstat на виртуальной машине с FTP-сервером показывает, что 192.168.100.1 является источником. Соединения работают так же, как и через NAT, но, как и в случае с NAT, адрес источника не совпадает с адресом исходного компьютера. Я пробовал это с включением и выключением net.ipv4.ip_forward, а также включением и выключением маскарадинга (iptables -t nat -A POSTROUTING -j MASQUERADE) с теми же результатами.
Я действительно хочу, чтобы мои виртуальные машины работали так, как будто они подключены к коммутатору: он должен быть прозрачным. Меня больше беспокоит исходный адрес, похожий на мост, чем мост, требующий IP. Последнее несколько раздражает, но первое для меня блокирует.
Я раньше видел, как iptables мешает трафику моста (хотя это не должно быть AFAIK). Конечно, вам не нужны какие-либо правила, связанные с NAT, но я думаю, что цепочка FORWARD должна принимать пакеты. Я бы посоветовал протестировать это без правил iptables и с политикой ACCEPT по умолчанию в цепочке FORWARD.
Еще пара вещей, которые стоит проверить:
brctl show
подтвердите это tap1
и tap2
находятся в bridge
?brctl showmacs bridge
показать MAC-адреса для двух виртуальных машин?ARP также требует маршрутизации.
Распространенная проблема заключается в том, что оба IP-адреса назначены обоим интерфейсам в тем же подсеть в ядре хост-системы. Если вы сделаете это, ответы ARP будут прерваны - b / c только один интерфейс получит ответы. Убедитесь, что у вас есть чистый, единственный маршрут обратно в подсеть.
В приведенном выше примере, если tap1
и tap2
оба интерфейса имели IP-адрес в ядре хоста Linux - в тем же подсеть (192.168.100.0/24) Ответы ARP прерываются. Если виртуальная машина не требует подключения к хосту, то ни один из них не будет нуждаться в IP-адресе в ядре хоста.
Установите для ваших кранов режим неразборчивой связи.
ifconfig tap1 promisc up
ifconfig tap2 promisc up