Creación de una red virtual en modo NAT

Anuncio
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
Descargar