Skip to content

Shorewall en Ubuntu | firewall, QoS, NAT

ACTUALIZACIÓN: Instalación muy similar pero en shorewall 4.4

He realizado unas cuantas instalaciones de shorewall 4.2 en ubuntu server 8.04-LTS y están funcionando muy bien, lo recomiendo. Aún no he probado la última versión de shorewall 4.4 pero cuando lo haga lo publicaré. Tras un par de intentos fallidos de utilizar los repositorios PPA de Ubuntu creo que es mejor no utilizarlos, instalar el paquete es muy fácil y no requiere demasiadas actualizaciones.

El objetivo de una instalación de este tipo es mantener una buena calidad de conexión para todos los equipos en una red local, para evitar que ninguno de los ordenadores acapare la conexión (ni con p2p, http, ftp,…). En definitiva, QoS (Quality of services).

Antes de que alguien me meta caña por lo que voy a decir, puntualizo que esto es para una red de ordenadores, no para servidores. Si alguien quiere montar un firewall con QoS para servidores debe tomar en cuenta otras cosas como ataques DDoS, flush control, etc.. etc.. largo etc..

Instalar Ubuntu Server 8.04 (o el LTS del momento)

En la instalación solo hace falta OpenSSH (ni escritorio, ni apache, ni nada..)

* Definición de la red

eth1 Tarjeta ethernet que va a internet
eth2 Tarjeta ethernet que va al switch de la red local

* A partir veremos lo que es la instalación

Una vez instalado descargamos shorewall-comon y shorewall-perl

1
2
wget http://slovakia.shorewall.net/pub/shorewall/4.2/shorewall-4.2.11/shorewall-perl-4.2.11.1.tar.bz2
wget http://slovakia.shorewall.net/pub/shorewall/4.2/shorewall-4.2.11/shorewall-common-4.2.11.tar.bz2

Descomprimimos

1
2
tar jxvf shorewall-perl-4.2.11.1.tar.bz2
tar jxvf shorewall-common-4.2.11.tar.bz2

Instalamos shorewall-perl

1
2
3
cd shorewall-perl-4.2.11.1
sudo ./install.sh
cd ..

Instalamos shorewall-common

1
2
3
cd shorewall-common-4.2.11
sudo ./install.sh
cd ..

Editamos /etc/default/shorewall y cambiamos una variable de 0 a 1.

1
startup=1

Copiamos el fichero para que se ejecute al inciar el sistema y lo definimos en el arranque

1
2
3
sudo cp /usr/share/shorewall/init /etc/init.d/shorewall
cd /etc/init.d/
sudo update-rc.d shorewall defaults

* A partir veremos lo que es la configuración básica del firewall

Editamos /etc/shorewall/init
Con esto lo que hacemos es decir a shorewall que inicie el modulo ifb, lenbante la interface y cree un directorio donde pondrá el -PID- de shorewall

1
2
3
qt modprobe ifb numifbs=1
qt ip link set dev ifb0 up
qt mkdir -p /var/lock/subsys/

Ahora definimos las interfaces y sus funciones
Editamos /etc/shorewall/init
En este caso tenemos eth1 para internet y eth2 para la red local. En el caso de la red local yo utilizo un servidor de DHCP, que está en el mismo servidor donde instalo shorewall

1
2
3
#ZONE   INTERFACE BROADCAST OPTIONS
net   eth1
loc   eth2    detect    dhcp

Definimos las zonas.
Editamos /etc/shorewall/zones

Aquí tenemos un tema de conceptos:
fw se refiere al mismo servidor, al mismo firewall
net se refiere a internet, las conexiones desde fuera que NO la interface de conexión con internet
loc se refiere a la red local

1
2
3
4
5
#ZONE TYPE    OPTIONS   IN    OUT
fw  firewall
net ipv4
loc ipv4
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

Activamos la función de masquerading, es decir NAT (sería DNAT).
Editamos /etc/shorewall/masq

1
2
#INTERFACE  SOURCE    ADDRESS   PROTO PORT(S)
eth1    eth2

Ahora definimos las reglas generales por las que va a funcionar este firewall.
Editamos /etc/shorewall/policy
Aquí le diremos que todos las conexiones de la red local pueden ir a internet o bien lo contrario. En este caso es una red local con libre acceso a internet, pero no podrá entrar ninguna conexión desde internet. El mismo tiempo le decimos que las conexiones de internet en dirección al firewall no serán aceptadas pero si las de la red local.

1
2
3
4
5
6
#SOURCE   DEST    POLICY    LOG LEVEL LIMIT:BURST
loc   net   ACCEPT
loc   $FW   ACCEPT
$FW   loc   ACCEPT
$FW   net   ACCEPT
all   all   REJECT    info

Activamos la función de masquerading, es decir NAT (sería DNAT).
Editamos /etc/shorewall/masq

1
2
#INTERFACE  SOURCE    ADDRESS   PROTO PORT(S)
eth1    eth2

* A partir de aquí empieza todo lo referente a QoS

Definimos las interfaces que estarán en las reglas de QoS.
Editamos /etc/shorewall/tcdevices
En este caso tenemos 350kbit de subida y 6000kbit de bajada

Aquí esta todo en OUT-BANDWIDTH porque lo que hacemos realmente es redirigir todo el tráfico entrante de eth1 ha ifb0 para que esta pueda rechazar paquetes simulando que no tiene ancho de banda suficiente. Esto no se puede hacer directamente sin ifb ya que no podemos decir al driver de la tarjeta que rechace determinados paquetes.

1
2
3
4
5
#NUMBER:  IN-BANDWITH OUT-BANDWIDTH OPTIONS   REDIRECTED
#INTERFACE              INTERFACES
1:eth1    -   350kbit   classify
2:ifb0    -   6000kbit  -   eth1
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Definimos las class para la red.
Editamos /etc/shorewall/tcclasses

Las clases son colas, igual que al llegar a aduanas. Una cola para personas del mismo país, otra para extranjeros, etc.. etc.. Pero al tratarse de una red lo que encolamos son paquetes. Con otro archivo diremos en que cola debe entrar cada tipo de conexión pero en este creamos los niveles. (más info)

1
2
3
4
5
6
7
8
9
10
11
12
#INTERFACE:CLASS  MARK  RATE    CEIL    PRIORITY  OPTIONS
1:110     - 5*full/10 full    1   tcp-ack,tos-minimize-delay
1:111     - 5*full/10 full    2   tos-minimize-delay
1:120     - 4*full/10 8*full/10 3
1:130     - 2*full/10 6*full/10 4   default
1:140     - 2*full/10 4*full/10 5
2:110     - 5*full/10 full    1   tcp-ack,tos-minimize-delay
2:111     - 5*full/10 full    2   tos-minimize-delay
2:120     - 4*full/10 8*full/10 3
2:130     - 2*full/10 6*full/10 4   default
2:140     - 2*full/10 4*full/10 5
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Ahora definimos que paquetes van por cada class.
Editamos /etc/shorewall/tcfilters
El tráfico más importante es el de icmp para establecer las conexiones, luego los puertos de mantenimiento como SSH (DNS también está en esta clase para que no tarde en buscar el host cada solicitud), luego puertos más utilizados para la red local (web, mail, etc..) y todo lo que no coincida con lo anterior lo mandaremos a la última class, la de menos peso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#INTERFACE: SOURCE      DEST      PROTO DEST        SOURCE
#CLASS                  PORT(S)       PORT(S)
#
#         OUTGOING TRAFFIC
#
1:120   -     -     tcp -       80,443
1:111   -     -     udp -       1194
1:111   -     -     tcp -       1194
1:111   -     -     tcp -       ssh,53
1:111   -     -     udp -       53
1:110   -     -     icmp  echo-request,echo-reply
#
#         INCOMING TRAFFIC
#
2:120   -     -     tcp 80,443
2:111   -     -     udp 1194
2:111   -     -     tcp 1194
2:111   -     -     tcp ssh,53
2:111   -     -     udp 53
2:110   -     -     icmp  echo-request,echo-reply
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Y listo, ejecutamos y a probar:

1
sudo /etc/init.d/shorewall start

ACTUALIZACIÓN (13/Oct/2009): Me equivoqué en la edición de ‘/etc/shorewall/tcfilters’, como está ahora mismo es la versión correcta.


Comments (4)

  1. Excelente tutorial (Y) yo estoy armando un servidor en ubuntu 12.04 que tendra servicio de DHCP, QOS, DNS, Firewall, WatchDog IP, Captura de Paquetes (para ver a que velocidad sube y baja cada ip de la red)SSh, Dominio, Squid y añadirle algunos addons para el control de la red; nada facil pero la informacion esta solo tenemos que leer y adaptalo a nuestra necesidades. saludos

  2. @CROJAS9 Gracias!, si que te has puesto un objetivo complicado. Estos manuales que he publicado son para IPV4 y se supone que en “poco tiempo” tendremos IPV6. Con este cambio todo el tema de QoS mejora mucho ya que el propio protocolo tiene métodos de control, no hay que crear una interface intermedia por software para rechazar paquetes. Si yo hiciera un proyecto como el tuyo lo haría para IPV6 directamente.

Leave a Reply

Your email address will not be published.