Skip to content

KVM NAT script

Create the file /etc/libvirt/hooks/qemu:

#!/bin/bash
#
# Adaptat de l'orginal disponible a:
# http://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections
#

DEBUG="/etc/libvirt/hooks/qemu: $0 $*"
logger "$DEBUG"
echo "$DEBUG"

Guest_name="${1}"
VIRSH_CMD="${2}"
PUBLIC_IP="192.168.1.30"

# afegir linies al final amb els redireccionaments.
redirecciona() {
    Host_port="${1}"
    Guest_ipaddr="${2}"
    Guest_port="${3}"
    Protocol="${4}"

    if [ "$VIRSH_CMD" = "stopped" -o "$VIRSH_CMD" = "reconnect" ]; then
        iptables -t nat -D PREROUTING -d ${PUBLIC_IP} -p ${Protocol} --dport ${Host_port} -j DNAT \
            --to ${Guest_ipaddr}:${Guest_port}
        iptables -D FORWARD -d ${Guest_ipaddr}/32 -p ${Protocol} -m state --state NEW \
            -m ${Protocol} --dport ${Guest_port} -j ACCEPT
    fi

    if [ "$VIRSH_CMD" = "start" -o "$VIRSH_CMD" = "reconnect" ]; then
        iptables -t nat -A PREROUTING -d ${PUBLIC_IP} -p ${Protocol} --dport ${Host_port} -j DNAT \
            --to ${Guest_ipaddr}:${Guest_port}
        iptables -I FORWARD -d ${Guest_ipaddr}/32 -p ${Protocol} -m state --state NEW \
            -m ${Protocol} --dport ${Guest_port} -j ACCEPT
    fi
}

# afegir el case de cada equip, i a dins una linia per cada servei.
# redirecciona  <host_port> <guest_address> <guest_port> <protocol>
case "$Guest_name" in
    vm1)
        redirecciona 2210 192.168.122.77 2210 tcp
        redirecciona 25826 192.168.122.77 25826 udp
        ;;

    vm2)
        redirecciona 2220 192.168.122.98 2220 tcp
        ;;
esac

Set exec permissions:

chmod +x /etc/libvirt/hooks/qemu

Edit /etc/apparmor.d/usr.sbin.libvirtd under the line /usr/sbin/* PUx,:

/etc/libvirt/hooks/* PUx,