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.libvirtd
aby 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_IPADDR
za 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.