Przekazywanie portów z hosta na gościa za pomocą libvirt 0.8.3 Korzystanie z KVM na Ubuntu


14

Host ma dostępne jedno zewnętrzne IP, więc ustawiłem moich gości KVM na NAT.

Jak skonfigurować przekierowanie portów, aby przekazywać gościom niektóre żądania z zewnątrz?

Nie mogłem znaleźć żadnej dokumentacji na ten temat. Prawdopodobnie najbliższą odpowiedzią jest ta odpowiedź , ale wspomniano również, że istnieje łatwiejszy sposób na to w libvirt 0.8.3. Czy ktoś wie o bardziej aktualnym sposobie zrobienia tego?


zewnętrzne - masz na myśli Internet IP? czy tylko Twoja sieć LAN (zewnętrzna do maszyn wirtualnych)? Czy możesz przydzielić te adresy zewnętrzne do swoich maszyn wirtualnych, aby skonfigurować sieci pomostowe?
Art Shayderov,

Mogę uzyskać tylko jeden internetowy adres IP, dlatego nie korzystałem z trybu mostka sieciowego.
wei

Odpowiedzi:


12

Oto lepszy sposób skonfigurowania przekierowania portów za pomocą skryptu przechwytującego ( źródła ).

W /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

Powinieneś ustawić cztery zmienne u góry, aby pasowały do ​​twojej konfiguracji libvirt.

Będziesz musiał zrestartować libvirt-bin, który na Ubuntu odbywa się za pomocą:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

musisz ponownie uruchomić gościa. W systemie Ubuntu należy dostosować, /etc/apparmor.d/usr.sbin.libvirtdaby umożliwić wykonanie skryptu przechwytującego:

Obok

/usr/sbin/* PUx,

dodać

/etc/libvirt/hooks/* PUx,

Następnie załaduj ponownie zbroję:

sudo service apparmor reload

Prawdopodobnie istnieje sposób na automatyczną konfigurację $GUEST_IPADDRza pomocą virsh / dumpxml / iface-dumpxml, ale nie znalazłem tego. Alternatywnie adres IP można ustawić statycznie w sieci xml: dokumentacja .

O ile wiem, filtrów sieciowych można używać tylko do ograniczania tego, co dzieje się w sieci wirtualnej, i nie są one przydatne do przekierowywania portów.


1
Trusty ma /etc/libvirt/hooks/** rmix,domyślnie wiersz w pliku konfiguracyjnym apparmor i wydaje się, że ma ten sam efekt. Mógłbym uruchomić skrypt bez modyfikowania konfiguracji apparmor.
Amir Ali Akbari

2

Jestem w podobnej sytuacji. Mam Windows Server działający w KVM w prywatnej sieci NATed, która jest podłączona na hoście za pośrednictwem interfejsu virbr0. Chcę uzyskać dostęp do maszyny wirtualnej za pośrednictwem zdalnego pulpitu. Więc muszę przekierować ruch do portu 3389 (RDP) do portu maszyny wirtualnej 3389. Osiągnąłem to z pewnymi regułami iptable.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --port 3389 -j DNAT - do docelowego VM-IP: 3389

/ sbin / iptables -I DO PRZODU -m stan -d VM-NET / 24 - stan NOWY, POWIĄZANY, USTANOWIONY -j AKCEPTUJ

Oczywiście należy przyjąć HOST-IP, VM-IP i VM-NET. Jednak bałagan z iptables i libvirt jest trudny. W tej chwili szukam rozwiązania, aby uzyskać dostęp do Internetu na mojej maszynie wirtualnej, którą straciłem z powodu bałagania się regułami iptable :-(


Wiem, że ma kilka lat, ale ta odpowiedź zadziałała dla mnie. Dzięki!
mttdbrd,

1

Uważam, że odpowiedź, do której się odwołujesz, nadal pokazuje odpowiednie reguły iptables. Jednak teraz możesz użyć haka skryptu do tworzenia i niszczenia reguł podczas uruchamiania i zatrzymywania maszyn wirtualnych. Jak powiedział Izaak w poprzedniej odpowiedzi, w obecnym pakiecie libvirt są również filtry sieciowe, ale nie jestem pewien, jak, a nawet czy można ich użyć do otwarcia portów dla gości NAT.


0

jak konfigurowana jest sieć dla gości? jeśli jest zmostkowane, wystarczy przekierować porty na adresy IP gości. Jeśli twoi goście stoją za kolejnym NAT, jeden libvirt konfiguruje, to się komplikuje

ale w każdym razie tutaj traktujesz maszyny wirtualne jak maszynę fizyczną


Chyba nie powiedziałem tego jasno. Host nie znajduje się w NAT, ma zewnętrzny adres IP. Niestety, sieć gości jest za NAT ustawionym przez libvirt.
wei

ah, to inna sprawa. w zasadzie libvirt zarządza własnym rozwiązaniem NAT, które można edytować.
dyasny

tak, tak mi powiedziano, można to edytować. Ale po prostu nie mogę znaleźć na to odniesienia, pliki konfiguracyjne nwfilter xml wydają mi się dziwne, dokumentacja na stronie libvirt też nie jest zbyt pomocna.
wei

Jeśli masz pomost sieciowy, możesz po prostu zrezygnować z domyślnego NAT libvirt i skonfigurować wszystko, co chcesz. Jak powiedział dyasny, traktuj VM jak maszynę fizyczną. Mam host KVM, a interfejs z zewnętrznym adresem IP jest przypisany do maszyny wirtualnej skonfigurowanej jako brama. Jeśli Ci odpowiada, mogę opublikować konfigurację (w stylu ubuntu).
Art Shayderov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.