В виртуалке, MAC-адрес определяется тот же самый, но ip-адрес у гостевой машины ipv6 (с хоста не пингуется) притом, что в настройке моста у хоста проиписано, что требует ipv4. Кроме того, на хосте появляется устройство tap0 c ip-адресом, а у хоста, хоть и состояние UP, ip-адреса нет. И у моста в качестве интерфейса команда brctl show показывает tap0, а не сетевой интерфейс хоста.
Я не разобрался, как настроить мост, но понял, почему он здесь не нужен.
В virt-manager изначально есть два подключения, system и session.
В первом есть сеть default 192.168.122.0/24, а во втором нет ничего. Виртуальные машины во втором подключении, настроенные через "Пользовательский режим сети" могут подключаться к интернету, но получают какие-то произвольные ip-адреса в какой-то автоматически созданной сети.
Кстати, если создавать виртуальные машины в system, то не обязательно хранить образы диска в /var/lib/libvirt/images. Можно создать пул дисков в любой удобной папке.
Так вот, если у виртуальной машины в подключении system выбран тип сети NAT, она автоматически получает ip, выделенный DHCP из дефолтной сети.
Если гостевая система с DE, просто в NetworkManager'е прописываем у текущего подключения статический ip из этой же подсети, после чего переподключаем сеть иконкой в трее.
Теперь всё зависит от настроек файрволов.
Если ICMP-пакеты файрволом не блокируются, гостевая система должна пинговаться с хоста. Если вообще все файрволы выключены и у хоста, и у гостя, можно с хоста обращаться к сервисам гостя напрямую без пробрасывания портов, т.к. у хоста есть интерфейс (virbr0), находящийся в той же подсети.
У меня был чуть более сложный случай. До настройки виртуалок, я настроил у хоста iptables с достаточно простыми правилами, примерно такими, даже еще проще. Тем не менее, там была дефолтная политика INPUT DROP и не фигурировал virbr0.
При старте libvirtd дописывал в правила, что ему там не хватало для выхода в интернет, но вот ответ от 22 порта у меня обратно на хост не приходил.
Решилось добавлением в скрипт такой команды:
iptables -A INPUT -i virbr0 -m state --state ESTABLISHED,RELATED -j ACCEPT
Т.е. разрешить получение ответов через интерфейс virbr0.
После ручной перенастройки iptables (вызова shell-скрипта, который сбрасывает все настройки), надо перезапускать сервис libvirtd, чтобы он снова дописал свои.
Должен также заметить, что net.ipv4.ip_forward у меня остаётся в состоянии 0.