У меня есть виртуальная машина, созданная с помощью libvirt/qemu/kvm, подключенная с помощью TAP к мосту Linux (virbr1).
Внутренне виртуальная машина имеет IP-адрес 10.99.0.9
.
И имеет следующую настройку маршрутизации.
по умолчанию через 10.99.0.1 dev enp1s0 proto static onlink
10.99.0.1 через 10.99.0.1 dev enp1s0 proto static onlink
Здесь 10.99.0.1 — это IP-адрес моста.
Я хотел, чтобы весь трафик, исходящий от этой виртуальной машины, направлялся на VPN-маршрут (wg0), который я настроил, поэтому на хосте я сделал
ip route добавить по умолчанию dev wg0 таблица 42
ip правило добавить из 10.99.0.9 таблица 42
Это работало нормально, но я заметил, что внутри виртуальной машины я все еще мог пинговать IP-адрес хост-машины. 192.168.2.1
.
В конце концов я понял, что это потому, что искать местный
ip rule имеет предпочтение 0, что выше, чем у правила, которое я добавил.
Я думал, что просто поменяю местами, и все будет хорошо.
ip rule add preference 300 lookup local # 300 здесь сколь угодно больше 0
IP-правило предпочтения 0
ip правило добавить из 10.99.0.9 таблица 42 предпочтение 0
Однако после этого у меня больше нет возможности подключения к виртуальной машине.
Если я обнюхиваю мост Linux, я вижу, что он постоянно отправляет запрос ARP в поисках того, кто 10.99.0.1
, и ответа не последовало.
Я не думал, что эти решения о маршрутизации вообще должны влиять на ARP, поскольку он действует вместе с IP, поэтому это запутано.
Я подтвердил, что именно эти строки вызывают проблему
Почему ответы ARP не возвращаются к интерфейсу виртуальной машины?