Firewall en linux: IPTables

La idea era sencilla, una PC vieja haciendo de router a otras dos PCs más nuevas, algo así como mi "cyber en casa", pero... ¿como se hace? buena pregunta.
Lo primero fue recurrir a tutoriales básicos, pero hay un problema allí: hay cosas que nadie escribe en esos tutoriales.
¿Como hago para poder usar el Edonkey y poder bajar algo? fue mi dilema durante meses, hasta que encontré la forma, pero ya que estoy... les publico TODO mi script de firewalling, no es una maravilla pero con un poco de suerte tal vez les sirva. IPTables... no es fácil, pero sirve y mucho! Para el que tenga Windows, también les servirá la explicación para entender un poco, yo todavía no entiendo todo, pero mejor es tener una idea...
La premisa básica es: tengo una PC vieja, no me sirve ni para jugar al solitario (bueh, en realidad es el único juego que se bancaba), la quiero "recuperar" y utilizarla de Router.
Que tenemos para hacerlo?
- Pentium 200 con 16Mb de RAM
- Disco de 640Mb
- Dos placas de red Ethernet 10/100
- Linux Debian Woody (si, el viejísimo estable)
- Conexión ADSL por Ethernet (el USB ni idea, que lo sufra otro!)
- Hub o Switch para conectar más de 3 PCs al mismo
- Cables UTP-5 que más o menos funcionen
- Ganas de desperdiciar su tiempo en algo instructivo
Instalar Debian Woody es un parto comparado con los instaladores de Linux de las más modernas distribuciones, pero dentro de todo tiene una ventaja insuperable: se puede instalar en una PC con menos de 32Mb de RAM!!! estuve un gran tiempo buscando un puto SIMM de 32Mb que me resulte gratuito y no tuve suerte.
Luego de hacer una instalación totalmente pelada y vacía, donde lo único que instalé fue la base.
Hay que hacer un paso muy simple: pppoeconf
Esta aplicación nos permite configurar el ADSL y que salga funcionando, la mejor forma de probar si hizo bien su trabajo es con "ping www.google.com" y que responda algo.
Luego edité con "nano" el sources.conf y cambié todo a "SARGE" y listo, apt-get update, apt-get dist-upgrade y cambié todo mi sistema a una versión más actualizada, lleva una media hora si la conexión no anda muy bien (como la mía, gracias Ciudad!, peor imposible).
No voy a explicar aquí configuración de redes en Linux, eso se lo dejo para otro momento, es sobre Firewall la cosa.
Hasta ahí todo OK, pero sólo el "servidor" Linux se conecta al mundo mediante la nueva interfaz "ppp0" que me configuró el pppoeconf. ¿Como cuernos conecto al resto de las PCs?
Lo siguiente es utilizar la segunda placa de red eth0 o eth1 dependiendo cual dejaron para la red interna. La conexión de cables es sencilla: uno para el ADSL, el otro hacia el HUB.
Cada PC de la red tiene su propia placa de red que también está conectada al HUB. Así que tenemos dos redes, Internet vía el ADSL (ppp0 + eth1 en mi caso) y la red LAN interna (eth0 en mi caso, el ip del server es 192.168.0.9 porque... que se yo...)
Ahora llega el turno de IP Tables y NAT.
NAT significa Network Address Translation, es decir, el "servidor" recibe un pedido de la LAN, lo "traduce" y lo hace en Internet. Cuando llega la respuesta hace el proceso inverso, "traduce" la respuesta que viene de la web y la envía a la PC en la LAN. Muy lindo desde el punto de vista teórico, en la práctica "no todo" sigue ese camino, no todo va de un lado a otro si no tomamos en cuenta la otra parte en cuestión "IPTABLES"
IPTables permite administrar las reglas de red, es decir, que se deja pasar, entrar, mover y que no en la red del servidor. Cada PC con Linux puede tener su propio IPTables, filtrar lo que entra, lo que sale y lo que se reenvía, es practicamente la "base" de todo Firewall, aquí es donde uno decide que hacer y donde se tiene el real "control" de la situación. Si uno no controla IPTables... IPTables te controla!

Lo primero es habilitar el NAT en el kernel, todo esto lo van a ver en el script que pego más abajo, luego se comienzan a habilitar las reglas, permitiendo que entren y salgan conexiones ya establecidas, hacer NAT, luego se habilitan reglas para la LAN, para el servicio SAMBA, ICMP, SSH (para poder entrar al servidor mediante consola), Webserver, Emule y luego bloqueamos absolutamente todo lo demás.
A diferencia de otros sistemas operativos aquí tenemos un control directo sobre las conexiones que dejamos pasar y que no, desde un principio IPTables no deja pasar nada, una vez que definimos reglas ahí cambia la cosa.
Al final del script se guardan los datos y listo.
Esto lo ejecuto cada vez que inicio la PC-Server-Router, ubicado en /etc/init.d el firewall.sh como lo llamé (tiene que tener permisos de ejecución) se inicia sin problemas y funciona casi a la perfección.
Digo casi porque si ven en la parte de EMULE hay un "problemita" que no se como resolver: ruteo todo a mi PC personal, si en la segunda PC de la red quieren tener Emule... minga! no se como se hace y no tengo la más puta idea, simplemente porque nunca le dediqué mucho tiempo a esto

PROS:
- Funciona muy bien, un hardware viejo puede manejar perfectamente múltiples conexiones
- Siempre se puede modificar a gusto y bloquear lo que se desee
- Hay muchos tutoriales y scripts ya armados como el de este artículo
- La vieja PC se lo banca!!!!!!
CONS:
- Dificultoso para muchos de entender si no saben nada de redes
- Algunos servicios no funcionan de entrada, hay que "trabajar" demasiado en entender cómo funcionan
- Casos como el usar el FTP en pasivo o no funca o el Emule pueden molestar bastante porque no hay documentación específica y hay que buscar en foros
- No hace balanceo de cargas (que yo sepa), para eso hay que utilizar otros programas pero... eso para otra ocasión
y el script (si no se ve correctamente, usen Firefox):
#!/bin/bash # Configure Iptables for Firewalling and NAT echo " #######################################" echo " # Enabling Firewall #" echo " #######################################" ### Location of the iptables and kernel module programs IPTABLES=/sbin/iptables #IPTABLES=/usr/local/sbin/iptables ### declaring interfaces INET='ppp0' LAN='eth0' # disable forwarding - done for security - enabled at the end echo " - Disabling forwarding (security).." echo "0" > /proc/sys/net/ipv4/ip_forward echo " - Enabling DynamicAddr.." echo "1" > /proc/sys/net/ipv4/ip_dynaddr ### Clearing previous rules and setting default policy ### echo "Clearing previous rules and setting default policy..." $IPTABLES -F INPUT $IPTABLES -P INPUT DROP $IPTABLES -F OUTPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F FORWARD $IPTABLES -P FORWARD DROP $IPTABLES -t nat -F ### Clearing previous rules and setting default policy END ### ### FORWARD ### echo "Enabling Forwarding..." # FORWARD: Allow all connections OUT and only existing and related ones IN.. $IPTABLES -A FORWARD -i $INET -o $LAN -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i $LAN -o $INET -j ACCEPT ### FORWARD END ### ### NAT ### echo "Enabling Nat..." echo " - Enabling SNAT (MASQUERADE) functionality on internet interface.." $IPTABLES -t nat -A POSTROUTING -o $INET -j MASQUERADE ### NAT END ### ### General INPUT ### echo "Enabling General INPUT rules..." $IPTABLES -A INPUT -i $LAN -m state --state RELATED,ESTABLISHED -j ACCEPT # allow incomming replys on outgoing lan traffic $IPTABLES -A INPUT -i $INET -m state --state RELATED,ESTABLISHED -j ACCEPT # allow incomming replys on outgoing internet traffic ### General INPUT END ### ### Localhost ### echo "Localhost rules..." $IPTABLES -A INPUT -i lo -j ACCEPT # allow all incomming traffic on localhost $IPTABLES -A OUTPUT -o lo -j ACCEPT # allow all outgoing traffic on localhost ### Localhost END ### ### ICMP ### echo "ICMP rules..." $IPTABLES -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT # allow replys on outgoing icmp traffic $IPTABLES -A INPUT -i $LAN -p icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT # allow echo request comming from lan $IPTABLES -A INPUT -p icmp -j LOG --log-prefix "All other icmp:" # log all other icmp traffic ### ICMP END ### ### Samba ### echo "Samba rules..." $IPTABLES -A INPUT -i $LAN -p tcp --dport 137 -j ACCEPT # NetBIOS name service tcp $IPTABLES -A INPUT -i $LAN -p udp --dport 137 -j ACCEPT # NetBIOS name service udp $IPTABLES -A INPUT -i $LAN -p udp --dport 138 -j ACCEPT # NetBIOS datagram service $IPTABLES -A INPUT -i $LAN -p tcp --dport 139 -j ACCEPT # NetBIOS session service File/printer sharing and other operations $IPTABLES -A INPUT -i $LAN -p tcp --dport 445 -j ACCEPT # Used by Win2k/xp when NetBIOS over TCP/IP is disabled - Microsoft Common Internet File System $IPTABLES -A INPUT -i $LAN -p udp --dport 445 -j ACCEPT #$IPTABLES -A INPUT -i $LAN -p tcp --dport 901 -j ACCEPT # used by SWAT (GUI configuration tool for samba) ### Samba END ### ### SSH ### echo "SSH rules..." $IPTABLES -A INPUT -i $LAN -p tcp --dport 22 -j ACCEPT # allow ssh connections from lan ### SSH END ### ### Webserver ### echo "Webserver rules..." $IPTABLES -A INPUT -i $LAN -p tcp --dport 80 -j ACCEPT # Open Webserver to lan ### Webserver END ### ### DNAT eMULE ### echo "DNAT eMule..." $IPTABLES -A FORWARD -j ACCEPT -p tcp --dport 4545 $IPTABLES -t nat -A PREROUTING -i $INET -p tcp --dport 4545 -j DNAT --to 192.168.0.1:4545 $IPTABLES -A FORWARD -j ACCEPT -p udp --dport 4646 $IPTABLES -t nat -A PREROUTING -i $INET -p udp --dport 4646 -j DNAT --to 192.168.0.1:4646 $IPTABLES -A FORWARD -j ACCEPT -p tcp --dport 4661 $IPTABLES -t nat -A PREROUTING -i $INET -p tcp --dport 4661 -j DNAT --to 192.168.0.1:4661 $IPTABLES -A FORWARD -j ACCEPT -p udp --dport 4672 $IPTABLES -t nat -A PREROUTING -i $INET -p udp --dport 4672 -j DNAT --to 192.168.0.1:4672 $IPTABLES -A FORWARD -j ACCEPT -p tcp --dport 4662 $IPTABLES -t nat -A PREROUTING -i $INET -p tcp --dport 4662 -j DNAT --to 192.168.0.1:4662 $IPTABLES -A FORWARD -j ACCEPT -p tcp --dport 4771 $IPTABLES -t nat -A PREROUTING -i $INET -p tcp --dport 4771 -j DNAT --to 192.168.0.1:4771 $IPTABLES -A FORWARD -j ACCEPT -p tcp --dport 3306 $IPTABLES -t nat -A PREROUTING -i $INET -p tcp --dport 3306 -j DNAT --to 192.168.0.1:3306 ### DNAT eMULE END ### # block all outgoing traffic to the internet from port 0:1024 $IPTABLES -A OUTPUT -o $INET -p tcp --sport 1:1024 -j DROP $IPTABLES -A OUTPUT -o $INET -p udp --sport 1:1024 -j DROP $IPTABLES -A INPUT -i $INET -j LOG # Log all other input from internet $IPTABLES -A FORWARD -j LOG --log-prefix "Forward:" # Log all other forward $IPTABLES -A INPUT -i $LAN -j LOG --log-prefix "from LAN:" # log all other input form lan # enable forwarding - done last for security echo " - Enabling forwarding.." echo "1" > /proc/sys/net/ipv4/ip_forward # saving iptables rules (works for Redhat/Fedora) (perhaps other distributions too) /sbin/iptables-save
El script fue enteramente copypasteado de uno que no encuentro de donde cuernos era pero que estaba 10 puntos, ¿no les parece? todo explicadito, un lujo.
Categoría: GNU/Linux
Etiquetas:
Otros posts que podrían llegar a gustarte...