У меня proxmox 4 на основе debian 8 на двух хостах A и B. Оба имеют по два сетевых адаптера. Одна сетевая карта от каждого хоста подключается через перекрестный кабель.
Host A:
eth0: public IP
eth1: 10.0.0.2/24
vmbr1: 10.0.0.1/24
Host B:
eth0: public IP
eth1: 10.0.1.2/24
vmbr1: 10.0.1.1/24
На vmbr1 к каждому хосту прикреплен контейнер с 10.0.x.10. Я буду обозначать это так:
Host A:
veth100i1@if12: 10.0.0.10/24 (IP only visible inside container on eth0)
Host B:
veth100if1@if30: 10.0.1.10/24 (IP only visible inside container on eth0)
Хост таблицы маршрутизации A:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 X.X.X.X 0.0.0.0 UG 0 0 0 eth0
X.X.X.0 X.X.X.X 255.255.255.224 UG 0 0 0 eth0
X.X.X.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr1
10.0.1.0 10.0.0.2 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
Хост таблицы маршрутизации B:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 Y.Y.Y.Y 0.0.0.0 UG 0 0 0 eth0
Y.Y.Y.0 Y.Y.Y.Y 255.255.255.224 UG 0 0 0 eth0
Y.Y.Y.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.0.0.0 10.0.1.2 255.255.255.0 UG 0 0 0 eth1
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr1
С хоста A я могу пинговать
С хоста B я могу пинговать
Когда я пытаюсь выполнить эхо-запрос 10.0.1.10 с хоста A в контейнере на хосте B, я вижу следующее на eth1 хоста B:
tcpdump -nni eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
12:42:48.567438 ARP, Request who-has 10.0.1.10 tell 10.0.0.2, length 46
На vmbr1 хоста B tcpdump ничего не показывает.
Как направить пакеты в контейнеры другого хоста?
Попробуйте настроить интерфейсы eth1 на адреса в третьей подсети, например 10.0.3.0/24. Вероятно, вам также потребуется добавить пересылку, как указано ниже.
Или попробуйте проксировать запрос ARP для доступных серверов. Вы можете включить это вручную с помощью такой команды, как.
systctl -w net.ipv4.conf.eth1.proxy_arp=1
После того, как он заработает, вы можете заставить его задерживаться после перезагрузки, добавив файл в /etc/sysctl.d
содержащий строку вроде:
net.ipv4.conf.eth1.proxy_arp = 1
Вам также может потребоваться включить пересылку с помощью любого из этих параметров:
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.eth1.forwarding = 1
Альтернативный подход - включить eth1 в определение vmbr1. В долгосрочной перспективе это может быть лучшим подходом.