10 de Abril, 2005

Redirección de un puerto con Packet Filter

Depués de explicar cómo hacer para que Gnomemeeting reciba llamadas estando detrás de un cortafuegos con PF y NAT, puede parecer que las reglas son confusas. Y nada más lejos de la realidad.

Aunque también redirigí un rango de puertos para tener algo de compatibilidad con los viejos Netmeeting de Microsoft (debe funcionar, el viernes me llamó un cliente desde un XP :o), vamos a centrarnos solo en la redirección del puerto TCP número 1720, que nos permite recibir llamadas VoIP con h.323.

Lo que se busca conseguir con una redirección de puerto es que cuando una estación conecta a nuestro enrutador/cortafuegos, éste se encarga de pasar la petición a una máquina designada dentro de nuestra red local, que no es accesible desde el exterior. El proceso es (debe ser) transparente para los extremos, de forma que ninguna de las dos estaciones involucradas en la comunicación sepan que hay un cortafuegos en medio.

Las reglas de PF empleadas son las siguientes:

# ext_if -> tarjeta a inet
# lan_if -> tarjeta a lan
# homeworld: IP de la mi máquina en la LAN

# en la zona de redirecciones dentro de /etc/pf.conf
rdr on $ext_if proto tcp from any to $ext_if port 1720 \
 -> $homeworld port 1720

# en la zona de filtrado para LAN
pass out on $lan_if proto tcp from any to $homeworld port 1720

# en la zona de filtrado para INET
pass in on $ext_if proto tcp from any to $homeworld port 1720 keep state

En primer lugar comentar que he empleado macros, que se identifican por el $ delante, que sirven para emplear símbolos en lugar de sus valores originales. Esto es cómodo porque si $homeworld es 192.168.0.2 y pasa a valer otra cosa, no hay que cambiar todas la ocurrencias de esa IP y basta con modificar la linea en la que se hace la declaración de la macro ($homeworld=192.168.0.2).

Además sabiendo qué es cada macro, no es importante conocer su valor para comprender las reglas.

También me refiero a zonas. Esto es porque Packet Filter define un orden lógico para introducir las reglas. Primero la colas de prioridades, luego redirecciones y NAT, y por último filtrado. Yo además ordeno las reglas de filtrado por zonas correspondiendo con las tarjetas de red. Luego es más fácil volver a tocar el pf.conf una vez pasado el tiempo ;).

Bien, una vez explicado esto solo falta tener en cuenta que hay, básicamente, dos grandes tendencias configurando el cortafuegos: abrirlo todo y cerrar lo que no queremos abierto o cerrarlo todo y abrir lo que necesitamos abierto. Para empezar es mejor el primer caso, pero en blackshell trabajo con un block all por ser más seguro, y por eso tengo que poner explícitamente algún pass más que con el otro sistema.

Tampoco hay que preocuparse. Al bloquearlo todo tenemos un poco más para jugar. Vamos a emplear un diagrama que nos ayude a comprender el paso de un paquete por la redirección:

Diagrama de red
El cortafuegos en blackshell

Está también la interfaz que da a elxwifi, aunque para el caso no nos afecta. He representado los block all con un muro de ladrillos, y las flechas son nuestros paquetes afectados por una de las reglas del cortafuegos.

El recorrido del paquete sería el siguiente:

  1. Una estación en Internet intenta conectar al puerto 1720.
  2. Entra en acción el rdr que dice que los paquetes a ese puerto deben ir al mismo puerto pero en homeworld, pero para que eso sea posible hay que dejar entrar el paquete por ext_if.
  3. La redirección es efectiva. Los paquetes van al interfaz adecuado para llegar a su destino.
  4. Necesitamos una regla que deje salir el paquete redirigido de la tarjeta de lan_if.
  5. El paquete llega a homeworld.

En el esquema se ve perfectamente qué es in y qué es out, dependiendo de la tarjeta que sea y según la dirección del paquete. Esto a veces resulta confuso y hacer el dibujo suele facilitar las cosas mucho.

Los paquetes de vuelta no tendrán problemas porque permito a las máquinas de la red local acceder a cualquier puerto de cualquier estación en Internet, siempre que origen de la comunicación sea la red local (esto es seguro).

No era tan complicado, ¿verdad? Eso espero :D.

Se puede encontrar más información en el FAQ de PF.

Anotación por Juan J. Martínez.

Hay 1 comentario

Gravatar

Ese gráfico es la clave de la explicación, sencillamente inmejorable :).

por r0sk, en 2005-04-11 14:30:08

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.