15 febrero, 2009

Enrutar sobre varias redes idénticas II

En capítulos anteriores, expliqué como hacer con VMWare unas redes locales virtuales idénticas y luego enrutar hacia ellas.

El problema es que usaba VMWare, que no es libre y que a mí por lo menos me ha dado siempre problemillas.
El caso es que un día VMWare me dejó de funcionar, así que encontré la excusa perfecta para pasarlo todo a software libre, concretamente con Qemu.

La idea es la misma y el script es muy parecido, los iptables son idénticos...pero había un problema y eran los "switchs" a donde las máquinas virtuales se "conectan". Con VMWare esto es trivial ya que tienes unos /dev/vmnetXX donde metes las máquinas de esa red. Pero no conocía nada parecido para Qemu.

Buscando buscando encontré vde_switch que resultó ser exactamente lo que buscaba. Gracias a eso y a las interfaces TUN/TAP pude montarlo todo con software libre, un resumen del script seria este:

#Levantamos ip pública del "router"
ifconfig eth0:1 xxx.xxx.xxx.xxx/xx

#Creamos el switch y creamos la interfaz local del "router"
vde_switch -d -s red1.sock -t tap1
ifconfig tap1 yyy.yyy.yyy.yyy/yy

#Si queremos, "abrimos" los puerto que queramos
iptables -A PREROUTING -t nat -d xxx.xxx.xxx.xxx -p tcp --dport PP -j DNAT --to jjj.jjj.jjj.jjj

#Marcamos los paquetes para saber luego redirigirlos
#marcamos los que seran de entrada para que iproute2 pueda identificarlos
iptables -A PREROUTING -t mangle -d xxx.xxx.xxx.xxx -i ! tap1 -j MARK --set-mark 1

#marcamos los que seran de salida para que iproute2 pueda identificarlos
iptables -A PREROUTING -t mangle -d ! xxx.xxx.xxx.xxx -i tap1-j MARK --set-mark 1001

#marcamos los de salida para que luego el routing sepa que direccion de origen poner
iptables -A PREROUTING -t nat -d ! xxx.xxx.xxx.xxx -i tap1 -j CONNMARK --set-mark 1001

#Creamos las tablas que luego usaremos...
echo 201 ruta1 >> /etc/iproute2/rt_tables
echo 401 salida1 >> /etc/iproute2/rt_tables

#los paquetes con marca tal, que usen la tabla cual
ip rule add fwmark 1 table ruta1
ip rule add fwmark 1001 table salida1

# la tabla tal es que sobreescribe la ruta y la envia por la interfaz correnpondiente (el replace es que si esta la machaca y sino esta la añade)
#esta es para los paquetes que entran que los meta por la interfaz que corresponde
ip route replace dev tap1 table ruta1

#esta es para los paquetes que salen, para que el siguiente salto sea la ip de salida
ip route replace via xxx.xxx.xxx.xxx table salida1

#Y la linea magica que hace NAT, los paquetes con la marca de salida que pusimos al principio, hace NAT poniendo como direccion de origen la ip publica de la tienda
iptables -t nat -A POSTROUTING -p all -m connmark --mark 1001 -o eth0 -j SNAT --to-source xxx.xxx.xxx.xxx

Y con esto y un bizcocho ya tenemos nuestras redes creadas, sólo falta lanzar Qemu y decirle que "conecte" la máquina virtual donde debe. Esto lo conseguimos con la siguiente llamada:
vdeqemu -net nic -net vde,sock=red1.sock miimagenqemu
Recomiendo muy encarecidamente que a la interfaz «nic» le indiquéis la opción «macaddr» ya que sino Qemu asigna la misma MAC a todas las máquinas de la red con los problemas que supongo todos conocéis.

Espero os sirva de ayuda, personalmente he aprendido mucho haciendo esto y es divertido ;-D