У меня есть физический сервер в Hetzner с двумя назначенными общедоступными IP-адресами в разные / 27 диапазонов. Один предназначен для самого сервера, а другой - для одной виртуальной машины внутри него. Хост работает под управлением CentOS 8 и libvirt.
Я создал виртуальную машину с интерфейсом macvtap, привязанным к моему физическому адаптеру, и изменил конфигурацию гостевой сети, чтобы использовать второй общедоступный IP-адрес. В результате мой гость никогда не может подключиться к внешнему миру.
Что я заметил с tcpdump, так это то, что, хотя гостевые запросы ARP достигают шлюза, ответ гостю не доставляется.
На физическом интерфейсе я вижу это:
[root@server ~]# tcpdump -i enp8s0 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:03:48.207364 ARP, Request who-has static.88-198-19-129.clients.your-server.de tell static.88.198.19.139.clients.your-server.de, length 28
14:03:48.207868 ARP, Reply static.88-198-19-129.clients.your-server.de is-at 4c:16:fc:c8:e1:24 (oui Unknown), length 46
14:03:49.301192 ARP, Request who-has static.88-198-19-129.clients.your-server.de tell static.88.198.19.139.clients.your-server.de, length 28
14:03:49.301689 ARP, Reply static.88-198-19-129.clients.your-server.de is-at 4c:16:fc:c8:e1:24 (oui Unknown), length 46
Но в интерфейсе macvtap я вижу следующее:
[root@server ~]# tcpdump -i macvtap0 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on macvtap0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:05:32.598221 ARP, Request who-has static.88-198-19-129.clients.your-server.de tell static.88.198.19.139.clients.your-server.de, length 28
14:05:33.207406 ARP, Request who-has static.88-198-19-129.clients.your-server.de tell static.88.198.19.139.clients.your-server.de, length 28
Я пытался изменить эти настройки по отдельности или все вместе, но не смог заставить их работать:
sysctl net.bridge.bridge-nf-call-iptables=0
sysctl net.ipv4.conf.all.proxy_arp=1
sysctl net.ipv6.conf.all.forwarding=1
sysctl net.ipv4.conf.all.arp_filter=1
iptables -P FORWARD ACCEPT
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
Я также попытался настроить мост для основного соединения, подключив к нему enp8s0 и подключив к нему виртуальную машину, но я вижу то же падение ответа arp.
Кто-нибудь может мне помочь?
После разговора со службой поддержки Hetzner они указали мне правильное направление. Моя конфигурация была в порядке, но у них был фильтр ARP для каждого общедоступного IP-адреса. Как только я настроил собственный MAC в интерфейсе виртуальной машины, все начало работать.