Creación de una red virtual en modo NAT Licencia Usted es libre de: copiar, distribuir y comunicar públicamente la obra crear obras derivadas Bajo las condiciones siguientes: Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra). No comercial. No puede utilizar esta obra para fines comerciales. Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Para obtener más información, visite http://creativecommons.org/licenses/by-ncsa/3.0/deed.es_ES. 1. ¿Qué queremos hacer? Al usar NAT, expondremos al exterior una única dirección IP para el servidor de máquinas virtuales. El tráfico de las distintas máquinas virtuales se redirigirá a puertos asociados a esa IP. Para configurar NAT, hacen falta tres cosas: una puerta de enlace (gateway), que conectará nuestras máquinas virtuales al exterior. una receta de iptables, que determinará cómo redirigir el tráfico destinado a la IP del servidor a las distintas máquinas virtuales. un servidor DHCP, que asignará IPs a las máquinas virtuales y les proporcionará un servidor DNS. Nosotros lo configuraremos todo en ese orden. Importante: antes de continuar, deshabilitad network-manager para poder trastear a gusto con la configuración de la red. 1 2. Creación del bridge Para crear y configurar el bridge, utilizaremos el comando brctl. 1. Creamos el bridge brctl addbr kvmbr0 2. Desactivamos STP (Spanning Tree Protocol, os deberá sonar de Redes). En nuestra red virtual no habrá ciclos, por lo que no debemos preocuparnos por ellos. brctl stp kvmbr0 off 3. Configuramos el forward delay del bridge a 0 segundos (¿para qué queremos más?). brctl setfd kvmbr0 0 Una vez creado el bridge, debemos registrarlo como interfaz de red. Arbitrariamente, le asignaremos la dirección IP 192.168.77.1. Como podréis suponer, la primera máquina tendrá la IP 192.168.77.2, la segunda, 192.168.77.3, y así sucesivamente, por lo que la máscara de red debe ser 255.255.255.0. La orden que configura todo esto es ifconfig kvmbr0 192.168.77.1 netmask 255.255.255.0 up Antes de hacer todo esto, deberíamos comprobar si el bridge existe o no. Esto es bastante sencillo: brctl show | grep “^kvmbr0” > /dev/null 2> /dev/null Lo único que nos interesa saber es si esta orden falla o no, no la salida de grep. 3. Activar el encaminamiento IP El siguiente paso es activar el encaminamiento (o forwarding) IP, desactivado por defecto en todas las distros de escritorio. El comando a utilizar es echo 1 | dd of=/proc/sys/net/ipv4/ip_forward > /dev/null De manera predeterminada, este ajuste se pierde tras reiniciar. Si queréis hacerlo permanente, descomentad la línea #net.ipv4.ip_forward=1 del fichero /etc/sysctl.conf. 4. Configuración de iptables Antes de nada, es altamente recomendable que guardéis vuestra receta actual para evitar problemas. Podéis hacerlo mediante el comando iptables-save > ruta_del_fichero Para recuperar los ajustes, usad el comando 2 iptables-restore < ruta_del_fichero Ejecutad estas órdenes1 : iptables -t nat -A POSTROUTING -s 192.168.77.0/255.255.255.0 -j MASQUERADE iptables -t filter -A INPUT -i kvmbr0 -p tcp -m tcp --dport 67 -j ACCEPT iptables -t filter -A INPUT -i kvmbr0 -p udp -m udp --dport 67 -j ACCEPT iptables -t filter -A INPUT -i kvmbr0 -p tcp -m tcp --dport 53 -j ACCEPT iptables -t filter -A INPUT -i kvmbr0 -p udp -m udp --dport 53 -j ACCEPT iptables -t filter -A FORWARD -i kvmbr0 -o kvmbr0 -j ACCEPT iptables -t filter -A FORWARD -s 192.168.77.0/255.255.255.0 -i kvmbr0 -j ACCEPT iptables -t filter -A FORWARD -d 192.168.77.0/255.255.255.0 -o kvmbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t filter -A FORWARD -o kvmbr0 -j REJECT --reject-with icmp-port-unreachable iptables -t filter -A FORWARD -i kvmbr0 -j REJECT --reject-with icmp-port-unreachable Para entender estas líneas, hay que tener en cuenta que: En el caso de la tabla nat, PREROUTING indica que los datagramas entrantes se alterarán, POSTROUTING indica que los datagramas salientes se alterarán, y OUTPUT indica que los datagramas que se generan en esta máquina también se alterarán. Como podréis suponer, ACCEPT indica que hay que dejar pasar el datagrama. MASQUERADE es la dirección IP del servidor de máquinas virtuales. En el caso de la tabla filter, INPUT hace referencia a paquetes destinados a esta máquina, FORWARD hace referencia a paquetes que se enrutarán a través de esta máquina y OUTPUT hace referencia a paquetes generados en esta máquina. Las primera línea -A INPUT tiene este significado • si el datagrama va destinado a la interfaz kvmbr0, es decir, a alguna máquina virtual, • lleva datos del protocolo TCP, y • está destinado al puerto TCP 67 lo aceptamos. Las otras significan lo mismo que esta. Los puertos 67 y 53 son los utilizados por los servicios DHCP y DNS. Como habréis visto, no hemos conectado el bridge a nada. La siguiente línea permite que los datagramas generados por las máquinas virtuales pasen a través del bridge. Las siguiente línea redirige los paquetes procedentes de la red (es decir, del exterior) al bridge. La siguiente línea redirige los paquetes procedentes del bridge (es decir, generados por las máquinas virtuales) al exterior. RELATED y ESTABLISHED hacen referencia al estado de la conexión. Si queréis más detalles, consultad el fichero man iptables. Las dos últimas líneas descartan los datagramas asociados a errores ICMP. Para comprobar que la configuración es correcta, usad los comandos iptables -t nat -L -n iptables -t filter -L -n 1 De forma predeterminada, iptables trabaja con la tabla filter. Por eso, el argumento -t filter se puede omitir. 3 5. Configuración de dnsmasq Para configurar el servidor DNS, ejecutad esta orden: dnsmasq --strict-order --except-interface=lo --except-interface=eth0 --except-interface=vnet0 --interface=kvmbr0 --listen-address=192.168.77.1 --bind-interfaces --dhcp-range=192.168.77.2,192.168.77.254 --conf-file="" --dhcp-leasefile=/home/luis/kvmbr0.leases --dhcp-no-override La línea resaltada es la que nos interesa: en ese fichero, figurarán todas las asignaciones de IPs que realiza el servidor DHCP. 6. Redirección del tráfico de un puerto al servidor VNC de una máquina virtual Por ahora, el servidor VNC lo ponen KVM y Qemu, por lo que reside en el servidor de máquinas virtuales. Esto significa que, por ahora, no es necesario redirigir el tráfico de un puerto del servidor a una máquina virtual. No obstante, os pongo aquí las dos líneas que lo hacen por si más adelante es necesario hacerlo. iptables -t nat -I PREROUTING -p <tcp|udp> --dport <puerto servidor> -j DNAT --to-destination <IP VM>:<Puerto VM> iptables -A FORWARD -i eth0 -o kvmbr0 -p <tcp|udp> --dport <Puerto VM> -j ACCEPT El primer comando nos permite garantizar que no habrá problemas al crear y utilizar conexiones en las máquinas virtuales. El segundo es el que redirige todo el tráfico de cierto puerto del servidor a cierto puerto de la máquina virtual. 4