Port Forwarding: accediendo a las máquinas de una intranet desde una sóla máquina pública.
Las redes de los clientes son celosas y normalmente sólo se puede acceder a las máquinas de su red desde dentro de la red misma. Lo que viene a llamarse una intranet.
Pero muchas de mis tareas de mantenimiento requieren acceso a varias máquinas de una intranet y desplazarme al cliente no lo veo una opción factible ni acorde con nuestros tiempos.
Una de las soluciones que más me ha gustado es pedirle al cliente un sólo acceso, una sola máquina con IP pública.
Para dar seguridad se puede configurar para que sólo se pueda acceder desde la IP estática de tu oficina, y, para ofrecer flexibilidad, que también se pueda acceder desde la IP estática de tu servidor en un datacenter. Pero bueno todo este párrafo te lo puedes saltar si no hay mucho inconveniente con la seguridad.
La máquina con la IP pública mola que sea linux, más que nada porque si no lo es ya no hace falta que sigas leyendo pues el resto del artículo sobreentiende esta premisa.
Lo que vamos a hacer es lo que se ve en la ilustración.
Aquí me ves a mí con más pelo y sin barba deseando acceder a todos los servicios de las máquinas de la intranet 10.10.10.* y sin embargo sólo pudiendo acceder a la máquina con la IP pública 205.205.205.205.
Lo que necesito tiene un nombre y este es Port Forwarding, y la implementación de esto más sencilla que he visto se hace mediante IP Tables.
Va a ser más rápido escribir los comandos que hay que ejecutar para que esto funcione que toda la charla previa que te he contado.
Mi máquina con acceso público tiene la distribución de linux Gentoo así que los ejemplos son para esta distro pero no deberían variar mucho para otras distros.
Instalamos iptables (si no está ya)
# emerge iptablesLe decimos al kernel que permita ip-forwarding
# echo 1 > /proc/sys/net/ipv4/ip_forwardFlasheamos toda la configuración de iptables que haya por defecto
# iptables -F # iptables -t nat -F
Permitimos el forward desde iptables (eth0 es la interface pública)
# iptables -A FORWARD -i eth0 -j ACCEPT # iptables -A FORWARD -o eth0 -j ACCEPT
Esto hace que las ips se enmascaren para no liar a los routes y saltarse posibles filtros de seguridad por IP
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEY aquí por fín las reglas del Port Forwarding
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 213306 -j DNAT --to-destination 10.10.10.21:3306 # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2180 -j DNAT --to-destination 10.10.10.21:80 # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2280 -j DNAT --to-destination 10.10.10.22:80 # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2221 -j DNAT --to-destination 10.10.10.22:21 # iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2322 -j DNAT --to-destination 10.10.10.23:22
Guardamos la configuración de iptables actual para que no haya que reescribirla al reiniciar
# /etc/init.d/iptables savePonemos el servicio de iptables para que arranque al inicio
# rc-update add iptables defaultCreo que esto también hay que hacerlo
# vim /etc/sysctl.confAñadir/descomentar las siguientes líneas:
net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1
Y ya debería funcionar. Si me voy a mi máquina en mi oficina y accedo a:
$ mysql -h205.205.205.205 -P 213306
Me encontraré con la mysql de la máquina 10.10.10.21.
Si accedo con un navegador a:
http://205.205.205.205:2280
Me encuentro con el Apache de la máquina 10.10.10.22.
Si no te funciona revisa la linkografía:

September 18th, 2008 at 9:24 pm
¿No sería mejor tener acceso a la máquina por ssh, ftp y vnc; y desde la máquina local acceder al resto de servicios?
September 19th, 2008 at 11:01 am
@Neko: Así es como lo tenía antes, y así lo sigo usando en caso de necesidad. Pero la configuración actual es mucho más fluida y la agilidad con la que trabajas es infinitamente mayor.
Imagínate tener que acceder a una aplicación web alojada en la máquina 10.10.10.22. ¿Qué haces? ¿Accedes por ssh a la 205.205.205.205 y luego a la aplicación web mediante links y otro navegador de consola? Un poco infierno ¿no?.. aunque aveces lo hago, o ¿te conectas mediante VNC al 205.205.205.205 y desde las Xs exportadas navegas? Otro infierno esta vez por la latencia de respuesta.
Mucho mejor es acceder desde tu máquina local directamente desde tu navegador y que los datos que viajen sean puramente http y no píxeles. Ademas del plus añadido de poder gestionar los upload/download directamente desde tu máquina local.
Lo mismo para una conexión ftp o mysql que habría que hacer saltos ssh/scp al 205.205.205.205 y luego conectar a las máquinas interiores.
Como digo, tu opción es posible, pero el túnel es una puta pasada de agilidad.
f.
September 19th, 2008 at 11:34 am
Y no sería mucho mejor que te dieran acceso mediante VPN, sería igual o más rápido sin dejar al descubierto el servidor de mysql o la aplicación interna, etc…
September 19th, 2008 at 11:37 am
@NeKo: Es también una buena alternativa pero cuando intentamos esto resultaba que su proveedor de VPN sólo tenía cliente para windows y nosotros éramos de linux.
En cualquier caso es una muy buena alternativa.
November 9th, 2008 at 10:48 pm
con los tuneles ssh es la mar de sencillo (aquí explico si usas mac o leenucs):
- basta con tener a una maquina cualquiera abierto el puerto 22 de ssh
- abres una consola: escribes ssh -D 1080 root@mimaquina -p 22
- en firefox o safari, configuración de proxy, lo configuras: localhost:1080
- tecleas: http://10.10.10.22 y voilà! estás como si estuvieras dentro de la red local
o si quieres ahorrarte problemas, una vpn pptp, es una maravilla!
November 9th, 2008 at 11:29 pm
Gracias @Adrián.. super útil.
November 9th, 2008 at 11:32 pm
un detalle: el proxy tiene que ser socks, talqueasí: http://d.imagehost.org/view/0324/Imagen_20.png
December 19th, 2008 at 1:03 pm
Nota mental: siguiendo la explicación de @Adrián tengo esto:
mi.local$ ssh user@server.es -L 1680:ip.destino:1680
Gracias