Вопрос или проблема
Похоже на этот старый запрос на BugZilla для Fedora 8, я надеюсь, что что-то изменилось с тех пор или кто-то знает другой способ.
Я хочу управлять правилами iptables вручную — универсальные автоматические правила мне совсем не подходят. Эти правила, кажется, добавляются и удаляются, когда сеть запускается и останавливается. Есть ли способ либо предотвратить добавление этих правил вообще, либо подключить скрипт к запуску сети, который восстанавливает стандартные правила после этого?
На данный момент я использую очень грубый метод с cron
, но надеюсь, есть более эффективный способ:
* * * * * root iptables-restore < /etc/sysconfig/iptables
Ну, я нашел ответ, который подходит мне: я вернулся к основам и научился делать это по-старому. Нет необходимости использовать изысканные сетевые функции libvirt, так как я могу просто:
- настроить собственные мостовые сети (не привязанные к какому-либо физическому сетевому порту)
- использовать DHCP-сервер на хосте и маскировать в iptables
- редактировать файлы конфигурации гостевой системы libvirt для использования моста(ов)
- иметь полную гибкость в том, как я хочу настроить безопасность с помощью iptables
Невозможно изменить эти правила, так как они не находятся в файле конфигурации или скрипте, а в исходном коде.
Но в 2016 году был добавлен “forward mode” типа “open”. Когда это указано для сети, libvirt не генерирует никаких правил iptables для этой сети. См. ошибку 846810.
Итак, отредактируйте свою сеть (virsh net-edit
), чтобы <forward mode="open"/>
.
open
подобен route
, но не будут добавлены никакие правила брандмауэра для разрешения или предотвращения этого трафика.
См. формат Network XML для получения более подробной информации.
Согласно Red Hat Bugzilla:
Во-первых, уже возможно избежать правил iptables – просто не
запрашивайте виртуальную сеть на основе NAT. ‘Стандартная’ виртуальная сеть
специально основана на NAT. Вы можете удалить ее и использовать стандартную, которая не предоставляет NAT.
Так что, чтобы избежать задания cron:
virsh net-destroy default
virsh net-undefine default
Конечно, как написал @user83664, вам придется использовать либо мостовые, либо только хостовые сети в будущем.
Используйте хуки для восстановления ваших правил iptables:
# Папка "hooks/" по умолчанию не создается Libvirt
mkdir /etc/libvirt/hooks
# Libvirt поддерживает несколько возможных слушателей, таких как "daemon", "qemu" и т. д.
# Мы автоматически генерируем все эти слушатели за один раз.
for f in daemon qemu lxc libxl network; do
echo '#!/bin/sh
iptables-restore < /etc/sysconfig/iptables' > "/etc/libvirt/hooks/$f"
chmod +x "/etc/libvirt/hooks/$f"
done
# Перезапуск Libvirt, чтобы убедиться, что правила действительно восстановлены
service libvirtd restart
Правила iptables будут перезагружены только для определенных действий, но этого достаточно, чтобы сделать их статичными. Только перезагрузка (SIGHUP
) libvirtd перезапишет свои собственные правила, но это не инициируется никакими системными скриптами, так что это не случится, пока вы не наберете самостоятельно:
service libvirtd reload
См. https://libvirt.org/hooks.html
ОБНОВЛЕНИЕ:
В последних версиях libvirt используют свои собственные цепочки для вставки правил, и эти цепочки требуются для запуска/остановки сетей и доменов. Поэтому предыдущий способ не подойдет. Вот эти цепочки в формате iptables-restore
:
*mangle
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
*filter
:LIBVIRT_FWI - [0:0]
:LIBVIRT_FWO - [0:0]
:LIBVIRT_FWX - [0:0]
:LIBVIRT_INP - [0:0]
:LIBVIRT_OUT - [0:0]
-A INPUT -j LIBVIRT_INP
-A FORWARD -j LIBVIRT_FWX
-A FORWARD -j LIBVIRT_FWI
-A FORWARD -j LIBVIRT_FWO
-A OUTPUT -j LIBVIRT_OUT
*nat
:LIBVIRT_PRT - [0:0]
-A POSTROUTING -j LIBVIRT_PRT
Чтобы переопределить правила libvirtd, просто поставьте свои собственные правила перед правилом libvirt-jump (-j LIBVIRT_XXX). Когда libvirtd/сеть/домен запускается, она только вставляет правила-прыжки, если они не существуют. Поэтому все, что нужно, это загрузить свои правила (со всеми созданными цепочками libvirt и правильно размещенными правилами libvirt-jump) перед запуском libvirtd. С другой стороны, вам нужно будет перезапускать/перезагружать libvirtd каждый раз после изменения и загрузки ваших новых правил – чтобы дать ему вставить свои правила libvirt.
Самое простое решение в 2025 году, чтобы предотвратить изменение таблицы iptables libvirt:
выполните virsh net-edit default
и измените <forward mode="nat"/>
на <forward mode="open"/>
.
Ответ или решение
Чтобы предотвратить автоматическое добавление iptables-правил libvirt для NAT-сетей, можно воспользоваться несколькими подходами. Мы рассмотрим теорию, применим примеры и узнаем, как внедрить эти решения на практике.
Теория
Libvirt служит для виртуализации и предоставляет функционал управления виртуальными машинами и их сетями. Обычно libvirt автоматизирует процесс настройки сетевых интерфейсов и конфигурации iptables для обеспечения NAT-соединений для гостевых систем. Эти автоматически добавляемые правила могут не удовлетворять требованиям более сложной инфраструктуры или безопасности, что и вызывает необходимость в ручном управлении правилами iptables.
Процесс настройки NAT в libvirt заключается в том, что при запуске или выключении сети создаются соответствующие цепочки правил в iptables, включая такие, как LIBVIRT_FWI
, LIBVIRT_FWO
, и т.д. Автоматизация имеет свои плюсы, но для продвинутых пользователей, желающих более детально управлять сетевой политикой, это может стать помехой.
Пример
Рассмотрим конкретный пример, где пользователь хочет отключить автоматическое добавление правил iptables. Решение требует изменения конфигурации сети в libvirt, перенастройки сети в режим "open" и использования hook-скриптов для автоматического восстановления своих правил.
-
Переход на режим "open": Вместо стандартного режима
forward mode="nat"
, который автоматически управляет правилами iptables, вы можете использоватьforward mode="open"
. Это предотвратит libvirt от вмешательства в существующие настройки iptables. Для этого выполните:virsh net-edit default
Измените
<forward mode="nat"/>
на<forward mode="open"/>
. -
Ручная настройка сетей: Настройте мостовую сеть и используйте собственные решения для управления DHCP и NAT. Это позволит вам полностью контролировать процессы маршрутизации и сетевой безопасности.
-
Использование hook-скриптов: Чтобы вернуть правила iptables после изменения libvirt, вы можете использовать hook-скрипты. Создание hook-скрипта потребует следующих шагов:
# Создайте директорию для hook-скриптов libvirt, если она не существует mkdir /etc/libvirt/hooks # Создайте скрипт для различных событий libvirt for f in daemon qemu lxc libxl network; do echo '#!/bin/sh iptables-restore < /etc/sysconfig/iptables' > "/etc/libvirt/hooks/$f" chmod +x "/etc/libvirt/hooks/$f" done # Перезапустите libvirt, чтобы убедиться, что правила восстановлены service libvirtd restart
Применение
На практике, внедрение описанных выше решений требует внимания и аккуратности. Изменение сетевого режима на "open" отключает автоматическое управление firewall, в результате чего необходимо обеспечить, чтобы безопасность сети не была случайно ослаблена. Также следует помнить, что libvirt создает собственные цепочки в iptables, и просто их удаление или модификация без учета механики libvirt может привести к нестабильности системы.
Из опыта внедрения такие изменения позволят вам:
- Гибкость в настройках: Возможность применения специфичных политик iptables помогает сформировать собственные решения для различных задач, будь то расширенная маршрутизация, балансировка нагрузки или специфические правила безопасности.
- Ускорение и оптимизация: За счет уменьшения лишних операций со стороны libvirt можно сократить время выполнения некоторых операций.
- Безопасность: Позволяет строго контролировать входящие и исходящие пакеты, минимизируя потенциальные риски и уязвимости.
Следует отметить, что данное решение требует достаточного уровня компетенции в управлении сетевыми правилами и глубокого понимания работы iptables. Внедряя его, вы получаете полный контроль над сетевыми конфигурациями ваших виртуальных машин, что является ключевым аспектом для сложных и нестандартных IT-инфраструктур.