Configuracion de Red y Enmascaramiento sobre Linux

Imagen de pepo

HOla...

Este "howto" ha sido orientado para establecer un enmascaramiento entre una red interna (LAN) y un servicio de Internet de tipo aDSL, lo más interesante es que lo hice a la antigüita, sin ninguna interfaz gráfica, es por eso que puede ser de utilidad y supongo que sería eficaz en cualquier GNU/Linux independiente de sus archivos de "script"; además he agregado un pequeño filtro (firewall) para dar más seguridad a la red, pero en versiones siguientes de este documento seré más explícito en esto de la seguridad.

Gracias M@Augusta por ser todo para mí.

[color=#FF0000][size=30]Agradecimientos:.[/size][/color]

  • M@Augusta mi novia, por todo... pero más que nada por su paciencia :)
  • Bernardo por su confianza al pedirme la realización de este proyecto: "ya ves suco? Loor a Linux :)"
  • Ing. Lizandro Solano, porque además de ser un gran profesor al motivar a nuestro desarrollo, simplemente es buena gente.
  • _iam_ del canal #Linux en IRC Hispano que fue un gran guía sobre todo en el firewall.
  • slashdot del canal #Linux en IRC Freenode que fue un gran guía sobre todo en SQUID.

[color=#FF0000][size=30]Descripción:.[/size][/color]

A un amigo mio se le planteo un problema, tenía contratado un servicio de aDSL y este a su vez daba el mismo servicio a una red interna o LAN; el servicio era bueno, usaba un maquinón como proxy con las siguientes características:

  • Pentium IV 2.6GHz
  • Chorrocientos gigas en HD
  • 1Gb de Ram
  • y un montón de chucherías de hardware (tarjetas de edición de video, etc)

Ningún problema en el hardware, muy al contrario, ¿no cierto?...

En esta hermosura corría WindowsXP, y estaba probando una copia de WinProxy... he comenzado a contar las fallas => usaba porquerías de programas ;)

[color=#FF0000][size=30]El problema:.[/size][/color]

Esta hermosura de máquina estaba esclavizada a servir de proxy para la LAN, lo que es peor, cuándo se corría el programa VectorWorks® de CAD, el servicio de Internet se iba al piso, quedando toda la red sin este.

[color=#FF0000][size=30]La solución:.[/size][/color]

Pués claro: GNU/Linux

[color=#FF0000][size=30]¿Por qué Linux?:.[/size][/color]

Mi amigo me pidió una mano aquí, yo ya tengo mucha experiencia en varios trabajos (más completos) que he realizado y además aproveché para crear este bonito documento ;)

Entonces usamos una computadora con la siguiente descripción:

  • Pentium 100Mhz
  • 1Gb de HD
  • 98Mb de ram

Pero sobre esta "hermosurita" nada más que instalé un modificado Linux RedHat 9.0 (estuve buscando Debian), y el proyecto se llevó a cabo con toda exactitud; corría SQUID (un www-proxy, tal vez el mejor), y a la misma máquina (que de ahora en adelante sería un precioso gateway) le puse enmascaramiento y un firewall hecho con IPTABLES.

[color=#FF0000][size=30]Un poco de bases:.[/size][/color]

[color=#FF0000][size=22]TCP/IP:[/size][/color]

[color=#FF0000][size=15]Paquetes IP:.[/size][/color]

El término paquete se refiere a un mensaje en una red con el protocolo IP (Internet protocol). Este nombre se de la a un mensaje simple y discreto o a una pieza de información que ha sido enviada sobre una red. Estructuralmente, un paquete contiene una cabecera de información y un cuerpo con los datos que son transferidos. El cuerpo es todo o una pieza de un mensaje con un protocolo de mayor nivel.

[color=#FF0000][size=15]El mecanismo IP:.[/size][/color]

Linux soporta tres tipos de mensajes IP: ICMP, UDP y TCP. Un paquete ICMP (Internet Control Message Protocol) es un paquete de nivel de red, control IP y estatus de mensaje.

  • Los mensajes ICMP contienen información acerca de la comunicación entre dos computadoras finales.
  • Un paquete UDP (User Datagram Protocol) lleva datos entre dos programas basados en red sin ninguna garantía de que el paquete llegue bien, completo u ordenado.
  • Un paquete TCP (Transmission Control Protocol) lleva datos entre dos programas basados en red también, pero la cabecera contiene información adicional para mantener un comunicación eficiente y confiable.

La mayoría de los servicios de red usa el protocolo de comunicaciones TCP antes que UDP, en otras palabras, la mayoría de servicios están basados en la idea de una conexión continua con dos vías de comunicación entre un programa cliente y un programa servidor.

[color=#FF0000][size=22]Instalar más de una tarjeta de red en la computadora:.[/size][/color]

Las tarjetas (módulos) pueden ser cargados en el "lilo.conf" (para un kernel monolítico -> no analizado en este documento) o en el "modules.conf" (para un kernel modularizado).

En realidad los Linux actuales hacen esta tarea, pero me pareció interesante el incluir esto:

Para tarjetas ISA (/etc/modules.conf):

   alias eth0 3c509

   alias eth1 3c509

   options 3c509 io=0x300, 0x320

Para tarjetas PCI (/etc/modules.conf):

   alias eth0 3c509

   alias eth1 3c509

[color=#FF0000][size=22]Archivos para la configuración de la red:.[/size][/color]

Como dije en un principio, he usado RedHat 9.0, y en esta distribución existen archivos muy sencillos de modificar; pero me pareció más "chévere" el modificar (configurar) toda la red a pie :)

[color=#FF0000][size=22]Configuración de la red:.[/size][/color]

Los archivos para las diferentes interfaces, los pueden encontrar en: "/etc/sysconfig/network-scripts", el nombre de la interfaz comienza con "ifcfg-" seguido del dispositivo de la interfaz, no indico su contenido ya que son sumamente sencillos.

La configuración manual la hice de la siguiente manera:


# baja la interfaz eth0

/sbin/ifconfig eth0 down

# baja la interfaz eth1

/sbin/ifconfig eth1 down

# asumo que eth0 será mi conexión con Internet

# x --> la dirección que me asigna el ISP

# y --> la máscara de red de mi ISP

/sbin/ifconfig eth0 xxx.xxx.xxx.xxx netmask yyy.yyy.yyy.yyy

# asumo que eth1 será mi conexión con la LAN (tipo C)

/sbin/ifconfig eth0 192.168.0.1 netmask 255.255.255.0

# veo las tablas de configuración

/sbin/route -n

# ahora anexo que esta sea el gateway por defecto

/sbin/route add default gw 192.168.0.1

#listo el pollo!

Establezco los DNS (Domain Name Server):.

Modifico el archivo "/etc/resolv.conf" para que encuentre los DNS, y el archivo quedaría algo así:


search localdomain

nameserver direcciónIP-DNS-1

nameserver direcciónIP-DNS-2

[color=#FF0000][size=30]Asegurando un poco más a TCP/IP:.[/size][/color]

Existen ciertos valores que se agregan o modifican con el fin de establecer una mejor seguridad en la red; para esto existe generalmente tres maneras, dos necesitan el reinicio del servicio de red, y una no lo necesita; como ejemplo se debe tomar el "IPV4 forwarding", el resto de valores usados pueden ser configurados de la misma manera.

[color=#FF0000][size=22]IPV4 Forwarding:.[/size][/color]

Habilito el ipv4 forwarding para que funcione correctamente el enmascaramiento; esto lo puedo hacer de tres maneras:

1.Modifico el archivo "/etc/sysctl.conf" y agrego o descomento la siguiente línea (necesito reiniciar al servicio de red):

net.ipv4.ip_forward=1

2.Cambio el valor del archivo directamente (necesito reiniciar el servicio de red):

echo "1" > /proc/sys/net/ipv4/ip_forward

3.Uso el comando "/sbin/sysctl" (NO necesito reiniciar el servicio de red):

/sbin/sysctl -w net.ipv4.ip_forward=1

[color=#FF0000][size=22]No acepto "ping" hacia mi firewall/gateway:.[/size][/color]

Una manera (básica y poco confiable) de mantener lejos a “crackers” es hacer pseudo-invisible mi servidor.

net.ipv4.icmp_echo_ignore_all=1

[color=#FF0000][size=22]Reusar responder peticiones de "broadcast":.[/size][/color]

La red tiene un "broadcast", el cuál está presente a todos, y si un paquete es enviado a este, entonces este clona y reenvía el paquete a todas las computadoras en la red, ¿ya se dieron cuenta la posible falla, no cierto?

net.ipv4.icmp_echo_ignore_broadcasts=1

[color=#FF0000][size=22]Evitar "spoofing" en la red:.[/size][/color]

Evito posibles conexiones desde mi interfaz de Internet:

net.ipv4.conf.eth0.rp_filter=1

Existen muchísimos más parámetros para configurar la seguridad e incluso el performance de la conexión en la red, pero ya está bueno de eso, incluso para el enmascaramiento básico, solo necesitaremos dos parámetros, que veremos luego.

[color=#FF0000][size=30]IPTABLES[/size][/color]

[color=#FF0000][size=22]Filtración de paquetes:.[/size][/color]

Los "kernel" actuales soportan un nuevo y potente mecanismo para la construcción de "firewalls" llamado "network packet filtering (netfilter)"; que es mucho más sofisticado que su predecesor "ipchains".

Así, si un paquete extraño trata de entrar a la red pasando por una conexión existente, IPTABLES consulta una lista de conexiones que mantiene en memoria, y así puede impedir el paso a este paquete.

[color=#FF0000][size=22]¿Qué es el enmascaramiento?[/size][/color]

El enmascaramiento es similar al concepto de una a muchas (me parece que veo a mi profesor de Base de Datos :) ... así, si una máquina conectada al Internet está usando Linux (usando cualquier método: ppp, ethernet, etc), el enmascaramiento hace que una máquina desde una red interna (también conectada con cualquier método) pueda tener acceso a Internet; y esto se logra sin que la “máquina interna” tenga un IP definido para Internet.

El enmascaramiento (MASQ) hace que las máquinas internas permanezcan invisibles en Internet, así el trafico saliente solo tendrá una IP, que será el de la máquina que está sirviendo como gateway (enmascarando), esto logra que la seguridad sea más eficiente pues además de esta excelente característica, también podemos poner un “firewall” lo que hace más robusto el sistema de seguridad.

[color=#FF0000][size=22]¿Qué necesito para un enmascaramiento en Linux?[/size][/color]

Todos lo elementos a continuación mencionados son imprescindibles, espero que dispongan de todos y cada uno de ellos ante de comenzar:

  • Un hardware común y silvestre, si has leído desde el principio sabrías que he puesto el enmascaramiento/firewall sobre una Pentium, 1Gb HD, 98Mb RAM, de color blanco; sobre el cuál está corriendo RedHat 9.0.
  • Un kernel moderno, yo he usado "2.4.20-8" pero ya está disponible la versión 2.6.
  • Iptables 1.2.4 o más moderno.
  • Módulos del kernel cargables versión "2.1.121" o más modernos.
  • Una red bien configurada (con el script que he creado queda cubierto esto).
  • Conexión a Internet (cómo más te plasca :)
  • Dos fundas de papas fritas.
  • Agua mineral y para los que les gusta una soda o algo parecido.
  • Música: yo he usado desde "LOAHouse de KingDaemon" hasta "Sinfonia patetica: finale – adagio lamentoso de Piotr Chaikovsky".

[color=#FF0000][size=30]Diagrama:.[/size][/color]

[img_assist|nid=5257|title=Lan|desc=LAN|link=node|align=center|width=640|height=640]

Ahora está más claro todo; bueno les presento mis "scripts" además de una especificación de cada una:

[color=#FF0000][size=30]Mis scripts:.[/size][/color]

[color=#FF0000][size=22]creador.sh[/size][/color]

Este script es sumamente sencillo y lo he usado para crear una lista con todas las direcciones IP de mi red interna, claro que luego tengo que modificar los nombres:


#!/bin/sh
i=1
rm -f listadoIP
touch listadoIP
while [ "$i" -le "40" ];
do
echo "192.168.1.$i # " >> listadoIP
i=$[i+1]
done

Función: es básica, mi gateway (además también el proxy SQUID) usan listas de direcciones permitidas y negadas, así, si yo quiero que “x” usuario no pueda usar Internet (porque me da la gana, o porque no ha pagado el costo), usaré este archivo que contiene todas las direcciones para generar las distintas listas. Uso una sola vez para tener todas las direcciones IP de la red.

[color=#FF0000][size=22]creaPermitidos.sh[/size][/color]

Este “script” genera listas de IP permitidas y negadas:


#!/bin/sh
clear
LISTADO=/root/listadoIP
TEMP1=/tmp/0.0.ip
TEMP2=/tmp/0.1.ip
PERMITIDOS=/root/.my-IPs-Allow
NEGADOS=/root/.my-IPs-Deny
rm -f $TEMP1 $TEMP2 $PERMITIDOS $NEGADOS
touch $TEMP1 $TEMP2 $PERMITIDOS $NEGADOS
if [ ! -f $LISTADO ]; then
echo "Archivo $LISTADO no encontrado"
exit 1
fi
echo "LISTADO COMPLETO DE IPs"
cp -f $LISTADO $TEMP1
while [ true ];
do
less $TEMP1
echo -n "Ingresa el usuario para NO permitir acceso: "
read DENEGADO
if [ -z "$DENEGADO" ]; then
cat $TEMP1 | awk '{ print $1 }' > $PERMITIDOS
echo "Archivos creados."
rm -f $TEMP1 $TEMP2
exit 0
fi
echo "Encontrado: `grep -i $DENEGADO $TEMP1 `"
echo -n "Deseas NO PERMITIR el acceso[n]: "
read opc
if [ "$opc" = "s" -o "$opc" = "S" ]; then
grep -vi $DENEGADO $TEMP1 > $TEMP2
grep -i $DENEGADO $TEMP1 \
| awk '{print $1}' >> $NEGADOS
mv -f $TEMP2 $TEMP1
fi
done

Función: Genero listados (ficheros) que contienen solo la IP de aquellas máquinas que pueden o no usar el enmascaramiento para salir a Internet.

[color=#FF0000][size=22]fw-00.sh[/size][/color]

Por fin, este es el script que hace la magia:


#!/bin/sh
clear
echo "Inicializando mi cortafuegos..."
IPTABLES=/sbin/iptables
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe
EXTIF="ppp0" # Interfaz que se conecta con Internet
INTIF="eth0" # Interfaz de la red LAN
EXTMASK=255.255.255.248
INTMASK=255.255.255.0
DNS1=200.55.224.68
DNS2=200.55.224.67
EXTIP=200.55.229.178
INTIP=192.168.1.4
GATEWAY=200.55.229.177
IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
DENY_FILE=/root/.my-IPs-Deny
echo "CONFIGURANDO RED.-"
echo -n " Bajando interfaces:... "
$IFCONFIG $EXTIF down
$IFCONFIG $INTIF down
echo "listo"
echo -n " Interfaz externa (Internet): $EXTIF ... "
$IFCONFIG $EXTIF $EXTIP netmask $EXTMASK
echo "listo"
echo -n " Interfaz interna (local): $INTIF ... "
$IFCONFIG $INTIF $INTIP netmask $INTMASK
echo "listo"
echo -n " Configurando GateWay $GATEWAY ... "
$ROUTE add default gw $GATEWAY
echo "listo"
echo "=========================="
echo "DEPENDENCIAS.-"
echo " Probando dependencias:..."
$DEPMOD -a
echo " Cargando modulos: "
echo -en "ip_conntrack_ftp, "
$MODPROBE ip_conntrack_ftp
echo -en "ip_conntrack_irc, "
$MODPROBE ip_conntrack_irc
echo -en "ip_nat_ftp, "
$MODPROBE ip_nat_ftp
echo -en "ip_nat_irc, "
$MODPROBE ip_nat_irc
# asumo que estos modulos se cargan por sí solos
# echo -e "ipt_REJECT, "
# $MODPROBE ipt_REJECT
# echo -e "ipt_REDIRECT, "
# $MODPROBE ipt_REDIRECT
# echo -e "ipt_TOS, "
# $MODPROBE ipt_TOS
# echo -e "ipt_LOG, "
# $MODPROBE ipt_LOG
echo -e "=> listo, modulos cargados.\n"
echo "=========================="
echo "ALISTANDO TCP/IP.-"
echo -n " Habilitando forwarding... "
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "listo"
echo -n " Evito que IPs locales entren por la interfaz por defecto.."
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
echo "listo"
echo "============================"
echo "NETFILTER.-"
echo -n " Limpiando cualquier posible regla y estableciendo politicas por defecto... "
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
echo "listo"
echo " FWD: Permitir todas las conexiones hacia afuera y solo permitir la"
echo -n " entrada de conexiones existentes y/o relacionadas:... "
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
$IPTABLES -A FORWARD -j LOG
echo " listo"
echo -n " Habilitando SNAT (mascarada) sobre $EXTIF:... "
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
echo "listo"
echo -n " Negando el acceso a indeseables:... "
if [ -f $DENY_FILE ]; then
while read ip_addy
do
case $ip_addy in
*) $IPTABLES -A INPUT -i $EXTIF -s $ip_addy -j DROP
$IPTABLES -A INPUT -i $EXTIF -d $ip_addy -j DROP
$IPTABLES -A OUTPUT -o $EXTIF -s $ip_addy -j REJECT
$IPTABLES -A OUTPUT -o $EXTIF -d $ip_addy -j REJECT
;;
done < $DENY_FILE
else
echo " archivo no-encontrado"
fi
echo "Terminado"

Listo ahora tenemos nuestra máquina como un gateway además de una pequeña regla de filtrado para proteger la red, solo es cuestión de cambiar los datos por los que tú necesitarás y listo!

[color=#FF0000][size=30]Configuración de las máquina internas:.[/size][/color]

[color=#FF0000][size=22]Windows®[/size][/color]

Aunque no lo crean, aquí es donde tuve problemas, mejor dicho me olvide de configurar y pasamos momentos de no saber cuál es el problema, los programadores deben entender muy bien lo que estoy diciendo: generalmente el algoritmo de oro no funciona por la vincha de cobre perdida por allí :)

Pues es sencillo, en el dispositivo de red que sea el usado para la red, simplemente ponemos como “Propiedades”, el IP de la máquina, el IP del gateway (puerta de enlace) que será la máquina donde corrimos el script “fw-00.sh”, y por último y muy importante, deben especificar los DNS (que serán los mismos que están en el gateway).

[color=#FF0000][size=22]Linux[/size][/color]

Vamos, no deberían esperar que les diga eso, para este punto deben haber leído suficiente este documento y otros. ;-)

[color=#FF0000][size=30]¿Porque IPs estáticas en la LAN y no uso DHCP?:.[/size][/color]

Para aquellos que no están enterados el usar DHCP (no recuerdo su significado) hace que tú solo pidas te conectes al servidor y este automáticamente te asigna un IP, tu gateway, tus DNSs, etc.

Bien esto es más sencillo del lado del cliente, en especial los vagos de windou$ que como borregos no les interesa saber como es robado sino solamente la cantidad del daño, incluso el levantar este servicio en el servidor es sumamente sencillo; ok! ¿Y entonces pepo?... bueno la verdad es que la única razón por la que asigno IPs estáticas es para su control, en DHCP el IP de una máquina puede cambiar en cada conexión, cada hora, cada día, etc... pero como vieron yo uso ficheros para indicar que usuarios no pueden usar ni mi enmascaramiento, ni mi proxy-www.

[color=#FF0000][size=30]Referencias:.[/size][/color]

  • Securing Optimizin Linux – The Ultimate Solution v2.0
  • Linux IP Masquerade HOWTO
  • canal #linux en IRC Hispano
  • canal #linux en IRC Freenode
  • www.netfilter.org
  • www.google.com

[color=#FF0000][size=30]Finales:.[/size][/color]

Como verán la red está un poco más lejana de ataques, pero no mucho, en cambio el gateway/firewall acepta todo (como algun@s chic@s que conozco), pero está bastante bien para comenzar.

Bueno les quedo debiendo en otro capítulo, todo mi firewall en el cuál filtra la mayoría de cosas y muy bien; y en otra versión de este documento pondré un apéndice sobre SQUID, el cuál uso para mejorar la navegación en Internet.

Por hoy, es todo; muchos me tildarán de mala gente (es que los hay caras duras) por no poner todo, pero he hecho este documento justo entre fiestas, y ahora es hora de ir a matar neuronas ;-)

Justo cuándo iba a grabar me dí cuenta que faltaba mis sugerencias sobre el "OpenSource", pero ahora más que sugerencias solo les cuento que he usado para la realización de todo este sistemita:

Proyecto:

  • RedHat Linux 9.0
  • Squid 2.9.17
  • Iptables (netfilter)
  • bash

Este documento:

  • OpenOffice.org 1.1.0
  • extendedPDF (excelente para generar archivos PDF con hiper vínculos)

Se despide su amigo:



// Clase me sirve para comunicarse con un

// amigo en el mundo real.

class me {

  public:

    char* nick = "pepo";

    long ICQ = 337889406;

  private:

    char* RealName = "Marco Paúl Mancheno Herrera";

}

Comentarios

Páginas