Bueno aunque ya muchas veces he publicado la direccion donde esta como hacer el DNAT (Destination NAT) para hacer Port Forwarding, ahi te va el mini jauto, lo paso solo asi porque lo tengo en mi libreta, y pues como aun ando aprendiendo latex para publicar mi info asi que me espero, ahi va: Primero que nada vamos con los requisitos: Como minimo necesitas soporta para DNAT (Destination NAT) y SNAT (Source NAT) "Full NAT" y "soporte para el MATCH STATE", el cual es requerido en la regla de FORWARD para hacer el matching de state. Esto debe de estar compilado como modulo o como estatico, yo te recomiendo que lo pongas como modulo asi te evitaras muchos problemas. *NOTA, es posible que tu kernel ya tenga ese soporte, para ver si tu kernel ya lo tiene, ve a /boot/ y busca algun archivo llamado config* y dale una buscada por las palabras NAT, STATE ( en la seccion de networking y revisa como esta compilado, [M]= Modulo <*> statico. Yo los tengo asi: CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_MATCH_STATE=m Despues debes de activar el redireccionamiento de IP: # echo 1 > /proc/sys/net/ipv4/ip_forward Lo mas seguro es que tu script de firewall ya tenga esto activado, porque me imagino que ya estas haciendo MASQUERADING o source-nat (SNAT) para compartir el Inernet. Ahora vamos a lo interesante. TABLA NAT. Debes de tener una regla en la cadena PREROUTING en la tabla nat. Para redireccionar un puerto tcp $PUERTO_EXTERNO de la ip $IP_FW_EXTERNA a la maquina interna ip:puerto $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA # /sbin/iptables -t nat -A PREROUTING -p tcp --dport $PUERTO_EXTERNO -d \ $IP_FW_EXTERNA -j DNAT --to-destination \ $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA Lo cual quiere decir: Antes de decidir a donde enviar los paquetes que llegan a la maquina (PREROUTING), netfilter agarra los paquetes que van a $IP_FW_EXTERNA:$PUERTO_EXTERNO, y reesribe la direccion de destino de los headers de esos paquetes a $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA TABLA FILTER. Para poder hacer que el Forwarding funcione debes permitirlo en la cadena FORWARD de la tabla filter: # /sbin/iptables -A FORWARD -p tcp --dport $PUERTO_MAQUINA_INTERNA -d \ $IP_MAQUINA_INTERNA -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT Esto quiere decir: Permitir redireccionar paquetes que vayan a $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA siempre y cuando sean parte de una conexion nueva, una conexion establecida, o una conexion relacionada a una ya establecida. POSTROUTING SNAT en la tabla nat (opcional). Para que esto trabaje en la red interna, es requerido una regla en la cadena POSTROUTING en la tabla nat. Sin esto,la maquina a la que se forwardea en la red interna no sabra a donde enviar las respuestas a la red interna a travez de la ip interna del firewall, $IP_FW_INTERNA. # /sbin/iptables -t nat -A POSTROUTING -p tcp -d $IP_MAQUINA_INTERNA --dport \ $PUERTO_MAQUINA_INTERNA -j SNAT --to-source $IP_FW_INTERNA Lo cual quiere decir: Antes de decidir a donde enviar los paquetes que llegan a la maquina (POSTROUTING), agarra los paquetes que van a $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA, y reescribe la direccion de destino de los headers por la ip interna del firewall, $IP_FW_INTERNA. * NOTA, sin esto no sabria como regresar los paquetes que vienen de la red interna cuando trates de entrar desde la red interna a la ip externa del firewall. OUTPUT DNAT en la tabla nat (opcional). Esta regla es necesaria para que las peticiones de el firewall hacia el firewall funcionen, para esto debes de tener soporte para hacer NAT de las conexiones generadas localmente (CONFIG_IP_NF_NAT_LOCAL) en el kernel, esto fue agregado desde el kernel 2.4.19 (revisa tu /boot/config*). # /sbin/iptables -t nat -A OUTPUT -p tcp --dport $PUERTO_EXTERNO -d \ $IP_FW_EXTERNA -j DNAT --to-destination \ $IP_MAQUINA_INTERNA:PUERTO_MAQUINA_INTERNA Esto quiere decir: Para los paquetes que son originados desde la misma maquina, el firewall (OUTPUT), netfilter agarra los paquetes que van a $IP_FW_EXTERNA:$PUERTO_EXTERNO, y reesribe la direccion de destino de los headers de esos paquetes a $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA Bien esto es todo lo que necesitas para hacer un DNAT completamente funcional, puedes hacer tu script que haga todo esto, o agregarlo en un archivo externo y cargarlo con "source" o su equivalente "." en bash, algo asi: # . script_DNAT.sh Ingue su, pues te lo voy a dar en bandeja de plata, haber si te mochas con unas birrias. ahi te va el script: IP_FW_EXTERNA=1.1.1.1 # La direccion ip de la interfaz externat del firewall ( tu ip publica) PUERTO_EXTERNO=80 # El puerto a ser forwardeado, el externo. IP_FW_INTERNA=192.168.0.1 # La direccion ip de la interfaz interna del firewall. IP_MAQUINA_INTERNA=192.168.0.2 # La direccion ip de la maquina a la cual vamos a rediriguir los paquetes. PUERTO_MAQUINA_INTERNA=80 # El puerto al que seran forwardeados ( este puede no ser un known-port). # Activar el direccionamiento IP # echo 1 > /proc/sys/net/ipv4/ip_forward # Forwardear los paquetes que vienen del Exterior # /sbin/iptables -t nat -A PREROUTING -p tcp --dport $PUERTO_EXTERNO -d \ $IP_FW_EXTERNA -j DNAT --to-destination \ $IP_MAQUINA_INTERNA:$PUERTO_MAQUINA_INTERNA # Hacer que funcione el forwardeo desde el mismo firewall. /sbin/iptables -t nat -A OUTPUT -p tcp --dport $PUERTO_EXTERNO -d \ $IP_FW_EXTERNA -j DNAT --to-destination \ $IP_MAQUINA_INTERNA:PUERTO_MAQUINA_INTERNA # Hacer que funcione el forwardeo para peticiones que vienen de la red interna. # /sbin/iptables -t nat -A POSTROUTING -p tcp -d $IP_MAQUINA_INTERNA --dport \ $PUERTO_MAQUINA_INTERNA -j SNAT --to-source $IP_FW_INTERNA # Y permitir el forwardeo en si. # /sbin/iptables -A FORWARD -p tcp --dport $PUERTO_MAQUINA_INTERNA -d \ $IP_MAQUINA_INTERNA -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT Bueno, esto ya ha sido muy probado en muchas maquinas, si tienes broncas es tu bronca, jejeje, y otra, es posible que esto pueda interferir con las politicas que tengas en tu script de firewall, asi que revisa que no hagan conflicto, o no vayas a dejar un hueco. Proximamente este jauto estara en version oficial, ya antes lo habia publicado no se donde, pero pues aqui esta de nuevo. saludos. Jorge Armando Medina. Visita la pagina del Grupo de Usuarios Linux Tijuana. http://www.linuxtj.org