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

Как нынче за nat в libvirt правильно порты пробрасывать?

 ,


0

3

Короче, у меня имеется выделенный сервер, с белым айпишником на одном из сетевых интерфейсов. Мне надо попадать в сеть за nat, в ту, что для виртуалок. Что я пытался:

  • Пытался на хосте прям поднять openvpn скриптом. Не вышло, клиент не видит машины в той подсети. Я может что-нибудь неправильно понимаю? Разве не достаточно того, что включен форвардинг и хост знает о наличии подсети у себя? Разве он не должен сам перенаправить все пакеты в нужную подсетку? Не сработало короче.

  • Пытался через iptables решить вопрос, но там libvirt какие-то свои цепочки создаёт, перетирает правила, да и в целом оно работать не хочет.

У меня из костылей осталось разве что создать виртуалку с openvpn и на неё через haproxy или что-нибудь ещё такое на хостовой машине кидать трафик, так почему-то всё работает. Но я так делать не хочу конечно. Как сделать с правильно, с минимальным количеством костылей?

но там libvirt какие-то свои цепочки создаёт, перетирает правила, да и в целом оно работать не хочет.

Ага. libvirt закидывает кучу правил, которые блокируют трафик.

Я создаю свой бридж для виртуалок, т.к. устал бороться с libvirt.

Вообще, я разрешал хождение трафика даже с правилами от libvirt.

Сейчас сразу не вспомню, но нужно правила разрешающие FORWARD втыкнуть до правила от libvirt, запрещающего этот FORWARD.

Коряво выразился, но надеюсь вы поняли.

Вроде можно прибить прибить правила:

iptables -D LIBVIRT_FWO -i virbr0 -j REJECT --reject-with icmp-port-unreachable
iptables -D LIBVIRT_FWI -o virbr0 -j REJECT --reject-with icmp-port-unreachable
HighMan
()
Последнее исправление: HighMan (всего исправлений: 2)
Ответ на: комментарий от HighMan

Вот я почти с этим разобрался, я только не могу понять какая из кучи xml-ек отвечает за цепочки LIBVIRT_FWI и LIBVIRT_FWO, греп не помог.

Пока костыль выглядит вот так:

#!/bin/bash

CHAIN=LIBVIRT_FWI
IPTCMD="iptables -L $CHAIN -vn"
FILTERCMD="grep -v -e Chain -e pkts -e reject-with -e DNAT"

while $IPTCMD | grep ESTABLISHED | grep -v DNAT >/dev/null
do
    IF=$($IPTCMD | $FILTERCMD | awk '{print $7}' | head -n1)
    NET=$($IPTCMD | $FILTERCMD | awk '{print $9}' | head -n1)
    iptables -D $CHAIN -o $IF -d $NET -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -I $CHAIN 1 -o $IF -d $NET -m conntrack --ctstate DNAT,RELATED,ESTABLISHED -j ACCEPT
done


if ! iptables -t nat -C PREROUTING -i enp4s0 -p tcp --dport 11223 -j DNAT --to-destination 192.168.122.2:22 &> /dev/null; then
    iptables -t nat -A PREROUTING -i enp4s0 -p tcp --dport 11223 -j DNAT --to-destination 192.168.122.2:22
fi
Pierre_Dolle
() автор топика
Последнее исправление: Pierre_Dolle (всего исправлений: 1)
Ответ на: комментарий от Pierre_Dolle

Я блин не понимаю, я через virsh nwfilter-undefine удалил вообще все правила, но чуда не случилось. Они где-то внутри libvirt что ли прописаны?

Я доже ковырялся и пытался отучить libvirt своевольничать с iptables. Ни чего годного не нашел и просто удалил их сеть. Дальше создал bridge и забыл об их глюках как о страшном сне.

Но, как ни странно, мне теперь понадобилось создать нечто похожее на virbrX для nat и что-то не соображу как сделать.

HighMan
()

Короче объединил все ответы и накидал на питоне небольшой скриптик, который пробрасывает мне порты и занимается остальной сетевой фигнёй по запросу, но уже на отдельном бридже.

Pierre_Dolle
() автор топика