четверг, 21 февраля 2013 г.

libvirt firewall

Важно: это заметка, а не how-to.
Попытаюсь поделиться опытом осиливания документации на libvirt, а именно управлением правилами iptables. Всю информацию вычитал на оффициальном сайте здесь и здесь. Документация написана самими разработчиками, потому является на мой взгляд сумбурной и поверхностной в одних местах и слишком углубленной в других.
Моя задача была на первый взгляд простая: разрешить форвардинг входящих ssh-соединений в режиме nat(чит. про nat, isolated, routed...). Но ручное добавление правил быстро ломалось.


Создаем директорию и скрипт /etc/libvirt/hooks/qemu

Расскажем демону о нашем злодействе (а жутко звучит, да?)
# killall -HUP libvirtd
???
PROFIT!!!111
UPD: Ниже неправильное решение(попробуйтеи и увидите интересные оговорки про интерфейсы в создаваемых правилах), хотя информация полезная. Решил всё же оставить здесь. Все правила хранятся здесь: /etc/libvirt/nwfilter
Создаём файлик allow-forward.xml

Инициируем правило в libvirt
# virsh nwfilter-define allow-forward.xml
Команда добавит в xml ещё несколько сущностей и расскажет libvirt о новой политике.
Надо связать правило и виртуальную машину.
# virsh edit MyMachine

Сохраняем.
 # iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 9409  570K libvirt-in  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 9409  570K libvirt-out  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 9409  570K libvirt-in-post  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 154K  291M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24    state RELATED,ESTABLISHED
 106K 5647K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0
   14  5378 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0
    0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
# iptables -nvL libvirt-out
Chain libvirt-out (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 FO-vnet0   all  --  *      *       0.0.0.0/0            0.0.0.0/0           [goto] PHYSDEV match --physdev-out vnet0
 [ dedup02 /etc/libvirt/nwfilter ] # iptables -nvL FO-vnet0
Chain FO-vnet0 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW,ESTABLISHED ctdir REPLY
Ну вот, задача решена. Хоть и не лёгкий путь, но nwfilter не отключаем в libvirt. Думаю это делается с оглядкой на большие инсталяции, так что пожалуй даже оправдано.

2 комментария:

  1. > Создаем директорию и скрипт /etc/libvirt/hooks/qemu

    Не раскрыта тема с каким правами и тп, да и не запускается он, не подхватывается. Версия может новая

    ОтветитьУдалить
    Ответы
    1. история действительно древняя. Скорее всего там должно быть a+rx, не промахнёшься.

      Удалить