LINUX.ORG.RU
решено ФорумAdmin

А как это сделать-то?

 , ,


0

1

Вот есть машинка с виртуалками. На ней есть одна белая айпишка, и у виртуалок есть своя виртуальная сеть 192.168.199.0/24, допустим, через которую виртуалкам натится инет (forward type='nat').
Нет, напрямую iptables'ом - пожалуйста,

# iptables -t nat -I PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.199.254:22
# iptables -I FORWARD -m state -d 192.168.199.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

Вторая строчка нужна, потому что у либвирта захардкодено (?!) правило вида
 -A FORWARD -d 192.168.199.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
, ессно имена и адреса он подставляет, но без NEW порты не форвардятся.
Окей, подумалось мне, сейчас сохраню правила иптаблеса, ребутнусь, и все будет как надо. Ага, щаззз! После рестарта машины порты заткнуты, потому что упомянутое выше захардкоденое правило либвирт ставит выше. Все, приехали. То ли лыжи не едут, то ли асфальт без наночастиц.

Кто-нибудь решал подобную задачу?

В дополнение к этом - костыль отсюда был испытан, и оказался неприменим при наличии нескольких виртуалок - рушится нат.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от flant

Их загружает либвирт хуком для qemu. Сам скрипт для хука в сообщении выше. Файл должен лежать в /etc/libvirt/hooks, называться qemu и быть исполняемым.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от pekmop1024

хм, блин.... может тогда в этот же rc.local добавить что-то типа
iptables -D FORWARD -d 192.168.199.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -I FORWARD -m state -d 192.168.199.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT


и тогда правила будут «меняться местами». а, кстати, iptables -I это ж ЕМНИП добавление правила в самый низ... может поэтому?

flant ★★ ()
Ответ на: комментарий от flant

Не сработает. Оно правила пересоздает при каждом старт/стопе виртуалки. Потому и нужен хук: чтобы обрабатывал именно эти события. Ты б хоть в скрипт поглядел... чем он тебя кстати не устроил? Работает идеально.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от pekmop1024

Не понимаю, зачем так сложно???

Сразу скажу, я - НЕ программист ниразу!

Но мне не понятно, зачем вычислять имена виртуальных машин, зачем все эти переменные с номерами портов, адресов, именами интерфейсов? Зачем весь этот навороченный алгоритм? Разве нельзя просто внести в файл qemu нужные правила так, как пишеш эти правила напрямую в iptables, без всего этого геморроя с переменными и условиями? И не важно, запущена ли в данный момент виртуальная машина, на которую перенаправляешь какой-то порт. При старте libvirtd внесёт в iptables на хостовой машине прошитые в него правила и те, что мы внесём в файл qemu. А чтоб нужное правило всегда первым было, в файле писать «iptables -I FORWARD 1 ...» И всё. Разве так не работает?

А то сижу, колупаю этот скрипт и не пойму, чего в нём допилить, если у меня помимо _sport=( '80' '443' ), _dport=( '80' '443' ) ещё 8080 на 80 перенаправить надо... Т.е. _sport=( '8080' '80' '443' ), _dport=( '80' '443' ). Будет ли оно работать?...

roga_i_kopita ()
Ответ на: Не понимаю, зачем так сложно??? от roga_i_kopita

Нельзя проще, потому что будут дублирующиеся и пересекающиеся правила. Для того, чтобы это понять, не нужно быть программистом, нужно не быть идиотом.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от pekmop1024

Не работает...

Не работает у меня скрипт. В логе вот такая лабуда и виртуалки не стартуют: Hook script /etc/libvirt/hooks/qemu qemu failed with error code 256

roga_i_kopita ()
Ответ на: Не работает... от roga_i_kopita

Изменил в скрипте только это:

external_ifs='eth0'
external_ip='10.0.1.14'

# List the machines here
machines=( 'fedora-web-srv' )

# Machine definition block
web_hostname='fedora-web-srv'
web_ip='10.0.0.4'
web_sport=('8080' '80' '443' )
web_dport=( '80' '80' '443' )

roga_i_kopita ()
Ответ на: комментарий от pekmop1024

Угу... Совершенно точно, виртуальную машину так и зовут fedora-web-srv.
Где хоть посмотреть трассировку вывода можно? В PHP можно уровень логов debug выставить, так там строку, в которой ошибка показывает. А тут скрипт вообще на каком языке-то?

roga_i_kopita ()
Ответ на: комментарий от pekmop1024

Исправил
# Machine definition block
fedora-web-srv_hostname='fedora-web-srv'
fedora-web-srv_ip='10.0.0.4'
fedora-web-srv_sport=('8080' '80' '443' )
fedora-web-srv_dport=( '80' '80' '443' )

Всё равно ошибка, теперь с другим кодом:
error : qemuAutostartDomain:168 : Failed to autostart VM 'fedora-web-srv': Hook script execution failed: Hook script /etc/libvirt/hooks/qemu qemu failed w ith error code 32512

roga_i_kopita ()
Ответ на: комментарий от pekmop1024

Разобрался, всё работает. Под себя чуть-чуть подпилил.
Четыре предыдущих сообщения прошу удалить.

roga_i_kopita ()
Ответ на: комментарий от pekmop1024

спасибо за скрипт.

у меня правда задача чуть другая мне нужно правило форвардинга с virbro на virbr1.

я так понимаю что мне нужно прописать в него все свои виртуалки (чтобы при перезапуске все сохранялось) и поменять правило форварда ?

Andre747 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.