dijous, 1 d’octubre de 2015

Bridged KVM configuration

Introducció:

L'objectiu d'aquest tutorial és entendre com funcionen les xarxes en KVM i com es configuren sense virt-manager.

Xarxes:

Per fer funcionar KVM en una màquina haurem d'instal·lar els paquets de KVM, configurar un bridge, vincular el bridge a la màquina virtual i configurar el firewall de la màquina host (on esta configurat el KVM) per a que deixe passar tot el tràfic de la màquina virtual i configurar el NAT.

La configuració de les xarxes mitjançant dispositius bridge divergeix entre els derivats de Redhat i els de Debian, en aquesta seccció descriurem com es configuren.

Primer instal·larem el següent paquet per a la gestio del bridge amb ambdues distribucions a la màquina host:
yum install bridge-utils
I en Debian/Ubuntu
apt-get install bridge-utils
Per a crear un bridge a la màquina host amb Redhat/Centos 7 procedirem com següeix, afegim la següent linia de configuració en /etc/sysconfig/network-scripts/ifcfg-enp0s3, enp0s3 es el nostre adaptador de xarxa:
...
BRIDGE=br0
...
Configurem el dispositiu br0. Afegirem la següent configuració a /etc/sysconfig/network-scripts/ifcfg-br0:
DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
Després reiniciem el procés que gestiona la xarxa.
systemctl restart network.service
Per a configurar un bridge a la màquina host amb Debian/Ubuntu procedirem com segueix, en primer lloc pararem el dimoni que gestiona la xarxa.
sudo /etc/init.d/networking stop
Afegirem al fitxer /etc/network/interfaces la següent configuració:
...
auto br0
iface br0 inet static
        address 192.168.0.1
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
...
Tornarem a arrancar el dimoni que gestiona la xarxa per a que cree el dispositiu prèviament configurat.
sudo /etc/init.d/networking restart
Si creem una màquina virtual i la associem al bridge br0 que hem creat podrem aconseguir comunicar-la amb l'exterior.

Una volta arrancada la màquina veurem com es mostra el brdige associat a les dues interficies. Aquesta es l'eixida de pantalla de Redhat/CentOS
# brctl show
bridge name bridge id  STP enabled interfaces
br0  8000.000000000000 no  vnet0
virbr0  8000.525440030d05d yes  virbr0-nic
I aquesta la d'Ubuntu/Debian
# brctl show
bridge name bridge id  STP enabled interfaces
br0  8000.c42c0329b155 no  eth0 vnet0
virbr0  8000.525400693c7b yes  virbr0-nic
Per a que funcione correctament, la taula de rutes ha d'estar correctament configurada a la màquina host. Ací teniu exemples de les dues distribucions.

Amb la distribució Ubuntu tenim la següent taula de rutes a la màquina host.
# ip route show
default via 192.168.0.1 dev ens3 
default via 192.168.0.1 dev ens3  proto static  metric 1024 
192.168.0.0/24 dev ens3  proto kernel  scope link  src 192.168.0.6 
Amb la distribució Redhat/Centos tenim la següent taula de rutes a la màquina host.
# ip route show
default via 10.100.175.254 dev wlp2s0  proto static  metric 600 
9.9.9.9 via 10.100.175.254 dev wlp2s0  proto dhcp  metric 600 
10.100.168.0/21 dev wlp2s0  proto kernel  scope link  src 10.100.174.232 
                metric 600 
192.168.0.0/24 dev br0  proto kernel  scope link  src 192.168.0.1  
               metric 425 
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1 
Si ens fixem amb les dues, les rutes importants són la 192.168.0.0/24 que comunica el bridge i la default gw que envia tot el tràfic al adaptador connectat a Internet.

També ens assegurem que en la màquina host el "ip forwarding" estiga configurat i tinga el valor 1.
# sysctl -a |  grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
Ens assegurem que tinguem dos dns configurats que funcionen correctament a la màquina virtual.
# cat /etc/resolv.conf 
; generated by /usr/sbin/dhclient-script
nameserver 8.8.8.8
nameserver 8.8.4.4 
Configurem el firewall amb la següent configuració en la màquina host, on tenim el KVM funcionant, per a ubuntu utilitzarem la següent configuració:
INPUT

iptables -A INPUT -p tcp --dport 53 -i br0 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -i br0 -j ACCEPT
iptables -A INPUT -p tcp --dport 67 -i br0 -j ACCEPT
iptables -A INPUT -p udp --dport 67 -i br0 -j ACCEPT

OUTPUT

iptables -A OUTPUT -p udp --dport 68 -o br0 -j ACCEPT

FORWARD

iptables -A FORWARD -o br0 -d 192.168.0.0/24 -m conntrack \
         --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i br0 -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i br0 -o br0 -j ACCEPT
iptables -A FORWARD -i br0 -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -o br0 -j REJECT --reject-with icmp-port-unreachable

POSTROUTING

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 224.0.0.0/24 -j RETURN
iptables -t nat -A POSTROUTING \
         -s 192.168.0.0/24 -d 255.255.255.255 -j RETURN
iptables -t nat -A POSTROUTING -p tcp \
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE \
         --to-ports 1024-65535
iptables -t nat -A POSTROUTING -p udp \ 
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE \
         --to-ports 1024-65535
iptables -t nat -A POSTROUTING \
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE 
Amb Redhat/Centos utilitzarem la següent configuració, es la mateixa que abans pero utilitzarem include -I en lloc de append -A ja que al tenir preconfigurat un firewall volem que les regles es carreguen amb l'ordre correcte.
INPUT
iptables -I INPUT -p udp --dport 67 -i br0 -j ACCEPT
iptables -I INPUT -p tcp --dport 67 -i br0 -j ACCEPT
iptables -I INPUT -p udp --dport 53 -i br0 -j ACCEPT
iptables -I INPUT -p tcp --dport 53 -i br0 -j ACCEPT

OUTPUT

iptables -I OUTPUT -p udp --dport 68 -o br0 -j ACCEPT

FORWARD

iptables -I FORWARD -o br0 -j REJECT --reject-with icmp-port-unreachable
iptables -I FORWARD -i br0 -j REJECT --reject-with icmp-port-unreachable
iptables -I FORWARD -i br0 -o br0 -j ACCEPT
iptables -I FORWARD -i br0 -s 192.168.0.0/24 -j ACCEPT
iptables -I FORWARD -o br0 -d 192.168.0.0/24 -m conntrack \
         --ctstate RELATED,ESTABLISHED -j ACCEPT

POSTROUTING

iptables -t nat -I POSTROUTING \
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE 
iptables -t nat -I POSTROUTING -p udp \
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE \
         --to-ports 1024-65535
iptables -t nat -I POSTROUTING -p tcp \
         -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE \
         --to-ports 1024-65535
iptables -t nat -I POSTROUTING \
         -s 192.168.0.0/24 -d 255.255.255.255 -j RETURN
iptables -t nat -I POSTROUTING \
         -s 192.168.0.0/24 -d 224.0.0.0/24 -j RETURN
Una volta tenim tot açò configurat ja som capaços de realitzar pings desde la màquina virtual a Internet

Enllaços

http://www.tecmint.com/kvm-virtualization-basics-and-guest-administration/
https://help.ubuntu.com/community/KVM/Networking
http://jensd.be/?p=207
http://vitobotta.com/setting-up-kvm-lvm-virtual-machine-host/
http://www.dedoimedo.com/computers/kvm-bridged.html
http://www.linux-kvm.com/content/using-bridged-networking-virt-manager
http://askubuntu.com/questions/574548/ubuntu-kvm-guest-dns-problems
http://www.charleslabri.com/installing-and-working-with-centos-7-x64-and-kvm/

Cap comentari:

Publica un comentari a l'entrada