El asunto de conectar una red a internet de modo que uno de los equipos trabaje como un servidor de conexión compartida con tareas de proxy/cache de páginas web y cortafuegos (firewall) de seguridad entre la red interna y externa es un asunto complejo que escapa al objetivo de este documento y que ya han tratado de forma fantástica otros documentos «Como» similares a este. Al final de este documento se pueden encontrar referencias y enlaces.
Aquí tan solo se va a tratar de configurar Diald suponiendo que
el equipo ya hace IP-Masquerading, tiene un proxy como Squid o
similar trabajando, una conexión con un ISP configurada correctamente y
que la seguridad de acceso a puertos TCP/UDP ha sido revisada (fichero
/etc/inetd.conf
y algunos otros como securetty
,
host.allow
, etc).
Básicamente, se trata de reconfigurar las reglas de enmascaramiento/filtrado/acceso cada vez que cambia el conjunto de interfaces del equipo, es decir, cuando se establece el interface ppp0 y cuando deja de existir. Un buen sitio para hacer esto son los scripts de ip-up e ip-down de pppd.
En Debian, basta con montar el paquete ipmasq y durante su
configuración indicar que se desea que se cambien las reglas de forma
sincronizada con pppd. De esta manera, se crean scripts en los
directorios /etc/ppp/ip-up.d
y /etc/ppp/ip-down.d
que
llaman a /sbin/ipmasq
, un script que analiza las interfaces
actuales y hace una configuración sencilla valida en muchos casos, aunque
se puede personalizar con facilidad revisando los ficheros de reglas de
/etc/ipmasq/rules
.
Tan solo es necesario realizar una corrección tras la instalación de este
paquete. Se trata de cambiar el orden de ejecución del script de
lanzamiento de ipmasq durante el arranque del equipo, eliminandolo
del directorio /etc/rcS.d
y poniendolo para que se ejecute
despues de S20diald
en /etc/rc2.d
de modo que ya exista la
interface sl0
. S90ipmasq
es un lugar valido para el enlace
simbólico a /etc/init.d/ipmasq
.
En Debian no es necesario preocuparse de la version del kernel, ya que el
script /sbin/ipmasq
usa ipfwadm
o ipchains
según corresponda.
Este ejemplo se debe a Mr Cornish Rex,
troll@tnet.com.au
.
Los comandos de control de ip-masp y routing que se presentan a continuación son para kernels de la versión 2.2, mediante ipchains, pero no son válidos para kernels de las versiones 2.0. Para estos ultimos habría que traducir dichos comandos a su equivalente en el antiguo comando ipmasq.
Además, vamos a suponer que la interface ethernet del equipo tiene la dirección 192.168.1.1 con máscara de 16 bits, es decir, 255.255.0.0.
El fichero /etc/ppp/ip-up
sería valido de la siguiente forma:
#!/bin/sh
# $1 = Interface
# $2 = Tty device
# $3 = speed
# $4 = local ip
# $5 = remote ip
# $6 = ipparam
/sbin/ipchains -F input
/sbin/ipchains -P input DENY
/sbin/ipchains -A input -j ACCEPT -i eth0 -s 192.168.0.0/16 -d 0.0.0.0/0
/sbin/ipchains -A input -j DENY -p udp -i $1 -s 0.0.0.0/0 -d $4/32 0:52 -l
/sbin/ipchains -A input -j DENY -p udp -i $1 -s 0.0.0.0/0 -d $4/32 54:1023 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 0:112 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 114:1023 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 6000:6010 -l
/sbin/ipchains -A input -j DENY -p icmp --icmp-type echo-request \
-i $1 -s 0.0.0.0/0 -l
/sbin/ipchains -A input -j DENY -p icmp -f -i $1 -s 0.0.0.0/0 -l
/sbin/ipchains -A input -j DENY -p udp -i $1 -s 0.0.0.0/0 -d $4/32 5555 -l
/sbin/ipchains -A input -j DENY -p udp -i $1 -s 0.0.0.0/0 -d $4/32 8000 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 8000 -l
/sbin/ipchains -A input -j DENY -p udp -i $1 -s 0.0.0.0/0 -d $4/32 6667 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 6667 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 4557 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 4559 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 4001 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 2005 -l
/sbin/ipchains -A input -j DENY -p tcp -i $1 -s 0.0.0.0/0 -d $4/32 6711 -l
/sbin/ipchains -A input -j DENY -i $1 -s 192.168.0.0/16 -d 0.0.0.0/0 -l
/sbin/ipchains -A input -j ACCEPT -i $1 -s 0.0.0.0/0 -d $4/32
/sbin/ipchains -A input -j ACCEPT -i lo -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/ipchains -A input -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 -l
/sbin/ipchains -F output
/sbin/ipchains -P output DENY
/sbin/ipchains -A output -j ACCEPT -i eth0 -s 0.0.0.0/0 -d 192.168.0.0/16
/sbin/ipchains -A output -j DENY -i $1 -s 192.168.0.0/16 -d 0.0.0.0/0 -l
/sbin/ipchains -A output -j ACCEPT -i $1 -s $4/32 -d 0.0.0.0/0
/sbin/ipchains -A output -j ACCEPT -i lo -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/ipchains -A output -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/ipchains -F forward
/sbin/ipchains -P forward DENY
/sbin/ipchains -M -S 120 120 120
/sbin/ipchains -A forward -j MASQ -s 192.168.1.0/24
/sbin/ipchains -A forward -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0
exit 0
El fichero /etc/ppp/ip-down
sería valido de la siguiente forma:
#!/bin/sh
# $1 = Interface
# $2 = Tty device
# $3 = Speed
# $4 = Local ip
# $5 = Remote ip
/sbin/ipchains -F input
/sbin/ipchains -F output
/sbin/ipchains -F forward
/sbin/ipchains-restore < /etc/ppp/orig.chains
Y el fichero que aparece al final del script anterior, orig.chains, es el siguiente (el estado original de la configuración de ipchains):
# orig.chains
# creado con: ipchains-save > orig.chains
:input ACCEPT
:forward ACCEPT
:output ACCEPT
-A input -s 0.0.0.0/0.0.0.0 -d 192.168.1.1/255.255.255.255
-A output -s 192.168.1.1/255.255.255.255 -d 0.0.0.0/0.0.0.0
Este ejemplo se debe a Hoo Kok Mun,
hkmun@pacific.net.sg
.
Este es el ejemplo más sencillo que he visto, aunque perfectamente
funcional. Desde el principio establece la norma de enmascaramiento, antes
de que exista la interface sl0
, y no cambia cuando se establece
ppp0
. Si son necesarias medidas de seguridad, probablemente quede un
poco limitado.
#/etc/rc.d/rc.local
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
Como se puede ver, es para kernels de la versión 2.0.