Primeros pasos con NetBSD II

En el primer post vimos algunos aspectos básicos de NetBSD, suficiente como para que los curiosos se adentren a explorar este OS. En este post veremos una configuración que nos permite utilizar NetBSD como router, esta configuración no escapa de ser básica, pero puede ser muy útil.

NetBSD como router

Uno de los usos mas básicos que podemos darle a un NetBSD es utilizarlo como router. Aunque quizás  en primera instancia pensaríamos en OpenBSD o Linux para dicha tarea, puede ser que tengamos guardada alguna PC muy vieja donde es mas dificil instalar OpenBSD y muy chica para Linux. En la lista de productos basados en NetBSD que mencionamos en el post anterior, podemos encontrar algunos routers desarrollados en base a este OS.
Otra razón para hacer esto es simplemente por que podemos, y nos gusta experimentar.

Escenario:

Tenemos una pc (o cualquier bicho que pueda correr NetBSD) con dos conexiones. netbsd-router
Una de las cuales tiene conexión a la Internet y la otra a la intranet a la cual proveeremos de acceso a internet. El nombre de la interfaz conectada a internet será wm0 y la interfaz conectada a la intranet será wm1.

Consideraremos en otro momento , un escenario donde la conexión a internet se realiza mediante una conexión DSL.

Configuración de las interfaces

IP Estatica

Como ya mencionamos en el post anterior, la configuración de las interfaces es muy simple.
Para poder saber las interfaces (los nombres de las interfaces dependen del driver utilizado en los kernels *BSD) disponibles utilizamos ifconfig:

ifconfig -a

Por cada interfaz disponible obtendremos un resultado similar al siguiente:

wm0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
 capabilities=2bf80<TSO4,IP4CSUM_Rx,IP4CSUM_Tx,TCP4CSUM_Rx,TCP4CSUM_Tx,UDP4CSUM_Rx,UDP4CSUM_Tx,TCP6CSUM_Tx,UDP6CSUM_Tx>
 enabled=0
 address: 56:43:13:45:4d:af
 media: Ethernet autoselect (1000baseT full-duplex)
 status: active
wm1: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
 capabilities=2bf80<TSO4,IP4CSUM_Rx,IP4CSUM_Tx,TCP4CSUM_Rx,TCP4CSUM_Tx,UDP4CSUM_Rx,UDP4CSUM_Tx,TCP6CSUM_Tx,UDP6CSUM_Tx>
 enabled=0
 address: 03:34:31:43:55:ff
 media: Ethernet autoselect (1000baseT full-duplex)
 status: active

Al igual que en GNU/Linux y demases unix podemos configurar temporalmente la interfaz utilizando:

ifconfig wm0 10.0.0.1 netmask 255.255.255.0
ifconfig wm1 192.168.1.1 netmask 255.255.255.0

Pero para poder configurar de forma definitiva la interfaz, debemos crear (si no existe ya) el archivo /etc/ifconfig.wm0 y el /etc/ifconfig.wm1. En este archivo, simplemente añadiremos en cada linea los argumentos que queremos que ifconfig ejecute. Por ejemplo, lo primero a hacer es levantar la interfaz con un:

ifconfig wm0 up

Por lo que la primer linea del archivo será un ‘up’.
Luego configuraremos la ip y el archivo quedará de la siguiente manera:

NetBSD Lab # cat /etc/ifconfig.wm1
up
192.168.1.1 netmask 255.255.255.0
NetBSD Lab # cat /etc/ifconfig.wm0
up
10.0.0.1 netmask 255.255.255.0

De esta manera configuramos ambas interfaces de forma estatica.

DHCP cliente

En caso de que la interfaz con acceso a internet deba ser configurada con DHCP, el archivo de configuración se verá de la siguiente forma:

NetBSD Lab # cat /etc/ifconfig.wm0
up
dhcp

Donde wm0 es la interfaz que utliza dhcp.
Para utilizar DHCP en la interfaz sin reiniciar utilizar /etc/rc.d/networking stop/start, podemos utilizar:

# dhclient wm0

Packet Forwarding

Para habilitar el reenvio de paquetes, fundamental para un router ejecutamos lo siguiente:

# sysctl -w net.inet.ip.forwarding=1

Y para guardar esta configuración de forma permanente agregamos la siguiente variable a /etc/sysctl.conf:

# net.inet.ip.forwarding=1

Pero el reenvio de paquetes es sólo el primer paso, ya que necesitamos hacer NAT para que los paquetes puedan regresar correctamente, esto lo hacemos modificando el archivo /etc/ipnat.conf.
Si no existe, lo creamos de la siguiente manera:

NetBSD Lab # cat << EOF > /etc/ipnat.conf 
map wm0 192.168.1.0/24 -> 0/32 
EOF

Servicios del Router

DNS y DHCP

Para proveer un servicio de dns y dhcp a la red interna, instalaremos dnsmasq

NetBSD Lab # pkg_add -v dnsmasq
pkg_add: Warning: package `dnsmasq-2.67nb1' was built for a platform:
pkg_add: NetBSD/x86_64 6.0 (pkg) vs. NetBSD/x86_64 6.1.5 (this host)
Running install with PRE-INSTALL for dnsmasq-2.67nb1.
dnsmasq-2.67nb1: Creating group ``dnsmasq''
dnsmasq-2.67nb1: Creating user ``dnsmasq''
useradd: Warning: home directory `/nonexistent' doesn't exist, and -m was not specified
man/man8/dnsmasq.8
sbin/dnsmasq
share/examples/dnsmasq/dnsmasq.conf.example
share/examples/rc.d/dnsmasq
Running install with PRE-INSTALL for dnsmasq-2.67nb1.
dnsmasq-2.67nb1: copying /usr/pkg/share/examples/dnsmasq/dnsmasq.conf.example to /usr/pkg/etc/dnsmasq.conf
===========================================================================
The following files should be created for dnsmasq-2.67nb1:

/etc/rc.d/dnsmasq (m=0755)
 [/usr/pkg/share/examples/rc.d/dnsmasq]

===========================================================================
Package dnsmasq-2.67nb1 registered in /var/db/pkg/dnsmasq-2.67nb1

Luego, copiamos el script de inicio y el de configuración:

NetBSD Lab # cp /usr/pkg/share/examples/rc.d/dnsmasq /etc/rc.d/
NetBSD Lab # cp /usr/pkg/share/examples/dnsmasq/dnsmasq.conf.example /etc/dnsmasq.conf

Para activar el inicio de dnsmasq en el booteo, agregamos la siguientes lineas al /etc/rc.conf:

dnsmaq=YES
dnsmasq_flags="-C /etc/dnsmasq.conf"

Una vez hecho esto, debemos modificar las siguientes variables dentro de /etc/dnsmasq.conf

interface=wm1
bind-interfaces
expand-hosts
domain=netsecure.com.ar
dhcp-range=192.168.1.2,192.168.1.20,24h

En la variable interface utilizaremos la interfaz sobre la cual daremos internet a la red interna.
Como pueden ver, con esta simple configuración, dnsmasq brinda servicio de dns (forwarding) y dhcp.
Y comenzamos a disfrutar de los servicios de dnsmasq iniciandoló:

NetBSD Lab #  /etc/rc.d/dnsmasq start
Starting dnsmasq.

Firewall

NetBSD trae por defecto a PF como su firewall, PF (Packet Filter), es un firewall mantenido por el equipo de desarrollo de OpenBSD, uno de los sistemas mas seguros (el mas seguro?). Por esto y mucho mas, PF se ha granjeado su fama como excelente firewall, ademas de ser muy simple en su sintaxis, algo que su competencia (iptables/netfilter) no puede superar.
Para habilitar el uso de PF, modificamos el /etc/rc.conf:

pf=YES

Y luego deberemos configurar el funcionamiento en sí de pf en el /etc/pf.conf
Si bien la configuración del firewall es algo bastante personal (intimo diría yo), un ejemplo de un firewall básico podría ser el siguiente (manual de PF aquí)

#Bloqueamos todo por defecto
block in  all
block out all

#Lista de puestos permitidos para la red interna
allowed_tcp_ports = "{ 22 }"
allowed_udp_ports = "{ 53, 67, 68 }"

#Reglas para permitir el acceso a los puertos desde la red interna
pass in  on wm1 from 192.168.1.0/24 to 192.168.1.1 tcp port $allowed_tcp_ports
pass in  on wm1 from 192.168.1.0/24 to 192.168.1.1 tcp port $allowed_udp_ports
pass out on wm1 from 192.168.1.1 to 192.168.1.0/24 tcp port $allowed_tcp_ports
pass out on wm1 from 192.168.1.1 to 192.168.1.0/24 tcp port $allowed_udp_ports

Herramientas Adicionales

Finalmente, podemos instalar algunas herramientas utilizando (pkg_add) que pueden servirnos para controlar nuestra red:

  • fping (scanner icmp)
  • bmon (Para visualizar el ancho de banda en cada interfaz)
  • trafshow (Para visualizar las conexiones en tiempo real)
  • tinc (Para crear VPNs)
  • tcpdump (sniffer)

Conclusiones

Con esta configuración básica como router, tenemos la base para transformar nuestro NetBSD en un firewall bastion, en un proxy, un punto de control, etc. Una de las mayores ventajas de utilizar NetBSD como router es que puede ser instalado en muchos dispositivos, por lo que quizas puedas utilizar este OS en un router, en una PC o vaya a saber en que aparatejo. La liviandad del OS lo transforma ideal para correr en hardware reducido, pero al mismo tiempo proveer muchas funcionalidades.

Leave a Reply