Páginas

jueves, 10 de diciembre de 2015

OpenBSD Soekris router

Originally written by TJ for bsdnow.tv 

Los routers domésticos para uso masivo son particularmente deficiente, son de propiedad, ofrecen muy poca flexibilidad y tienen problemas de seguridad.

Vamos a construir nuestra propia puerta de entrada basado en OpenBSD (5.7 i386), PF y Soekris net5501 para recuperar el control de la red.


Porqué Soekris?: Es compacto, bajo consumo de energía, comunicación avanzada, no utiliza partes móviles, larga vida y compatible con todos los sistemas basados en BSD (OpenBSD, FreeBSD, NetBSD, Pfsense).


Hardware:
- Soekris net5501-60 (net5501-60: 433 Mhz CPU, 256 Mbyte DDR-SDRAM, 4 Ethernet puertos)
- Cargador alimentación
- Disco duro SSD Intel 40GB serie 320 Sata II
- Tarjeta red PCI adicional (4 Ethernet puertos)
- Cables de red Cat6
- USB a serial convertidor
- null modem cable


Medios de instalación:

1. Una de los medios de instalación de OpenBSD en una Soekris utiliza un cable serie (hembra hembra) más un adaptador USB serial converter (el puerto serie ha desaparecido de los portátiles), un servidor FreeBSD con dhcp, tftp y arrancar a través de la tarjeta Ethernet (PXE).

2. La flexibilidad de OpenBSD es tal que puede instalar el sistema baśico (i386) en un portátil (aunque el portátil es x64 bits), reiniciar, autenticarse como root, cambiar el nombre de la tarjeta de red (en mi caso, msk0 por /etc/hostname.vr0), conectar el disco ssd a la soekris (apagada). Luego conectar el cable serie teclear en un terminal (en este caso el sistema operativo del cliente es FreeBSD 10.1 y teclear lo siguiente :

# cu -l /dev/ttyU0 -s 19200
conected

conectar la soekris y en ls terminal verá iniciar el sistema de la soekris. Antes de terminar la cuenta atrás de 5 segundos teclear Ctrl + p luego teclear:

> boot
> stty com0 19200
> set tty com0
> intro

Verá el proceso de arranque, veremos la IP asignada a la tarjeta de red vr0 (externa), por el router ADSL (192.168.1.139). Abrir otra terminal y entrar vía ssh desde una estación de trabajo. Nos ponemos en la misma red, conectando un cable directamente al router. Esto porque?,  la interfaz LAN (192.168.3.1) aún no ha sido creada.

Las tarjetas de red se muestran como vr0, vr1, vr2, vr3, sis0, sis1, sis2, sis3, La primera (vr0) será la interfaz externa y las tres siguientes como interfaces internas de la LAN. El resto de interfaces (sis0, sis1, sis2, sis3) se agrega al conectar más equipos. La interfaz ath0 es la inalámbrica.

Proveedor y producto integrado en la imagen de la BIOS

# sysctl hw.vendor && sysctl hw.product
hw.vendor=Soekris Engineering
hw.product=net5501

RED:

La reducción de las tarjetas de red internas con la interfaz Ethernet virtual permite a las máquinas cliente conectar directamente a la puerta de entrada, sin la necesidad de un interruptor (switch).

# echo dhcp > /etc/hostname.vr0                                               
# echo up > /etc/hostname.vr1                                                 
# echo up > /etc/hostname.vr2                                                 
# echo up > /etc/hostname.vr3                                                 
# echo 'inet 192.168.3.1 255.255.255.0 NONE' > /etc/hostname.vether0 
# echo 'up'>>/etc/hostname.vether0

Usando la opción blocknonip se puede evitar que cuele tráfico no IP. Los puentes de red funcionan para todo tipo de tráfico no solo IP. Requiere que los NIC esten en modo PROMISCUO (a la escucha para todo el tráfico de red, no solo para la interfaz redireccionada).

# cat /etc/hostname.bridge0

add vether0
add vr1
add vr2
add vr3
blocknonip vether0
blocknonip vr1
blocknonip vr2
blocknonip vr3
up

Reiniciar interfaces de red:
# sh /etc/netstart vether0 vr1 vr2 vr3 bridge0

# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.ip.redirect=0
kern.bufcachepercent=50
net.inet.ip.ifq.maxlen=1024
net.inet.tcp.mssdflt=1440


DHCP

Los clientes de LAN necesitan una ip, vamos a configurar un servidor dhcp e iniciarlo al arranque:

# echo 'dhcpd_flags="vether0"' >> /etc/rc.conf.local

# cat /etc/dhcpd.conf
subnet 192.168.3.0 netmask 255.255.255.0 {
        option domain-name "unix.bcn";
        option domain-name-servers 192.168.3.1, 208.67.220.220;
        option routers 192.168.3.1;
        range 192.168.3.2 192.168.3.100;
        default-lease-time 3600;
        max-lease-time 1200;
}


DNS

Un servidor de almacenamiento en caché de DNS local es bastante fácil utilizando unbound, que es parte del sistema base, junto con DNSCrypt para mantener nuestras búsquedas en privado.

# echo 'unbound_flags=""' >> /etc/rc.conf.local
# ee /var/unbound/etc/unbound.conf

# wget ftp://FTP.INTERNIC.NET/domain/named.cache -O \

/var/unbound/etc/root.hints


## Simple recursive caching DNS
## /var/unbound/etc/unbound.conf
#
server:
    # log verbosity
    verbosity: 1

    interface: 192.168.3.1
    interface: 127.0.0.1
    do-ip6: no
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.3.0/24 allow


# file.  get one from ftp://FTP.INTERNIC.NET/domain/named.cache
    root-hints: "/var/unbound/etc/root.hints"

# nombre de usuario por defecto
    username: "_unbound"

# enable to not answer id.server and hostname.bind queries.
    hide-identity: yes

# enable to not answer version.server and version.bind queries.
    hide-version: yes

    do-not-query-localhost: no

    do-ip4: yes
    directory: "/var/unbound/etc"

forward-zone:
      name: "."
      forward-addr: 127.0.0.1@40

# rcctl enable unbound
# rcctl start unbound
unbound(ok)
unbound(ok)





dnscryp-proxy

Vamos a configurar dnscryt-proxy, se instala desde ports o paquetes:

# export PKG_PATH="http://ftp.eu.openbsd.org/pub/OpenBSD/5.7/packages/`machine -a`/"

# echo 'pkg_scripts="dnscrypt_proxy"' >> /etc/rc.conf.local
# echo 'dnscrypt_proxy_flags="-l /dev/null -R dnscrypt.eu-nl -a \
127.0.0.1:40"' >> /etc/rc.conf.local
# echo 'nameserver 127.0.0.1' > /etc/resolv.conf


Crear el archivo log y hacer al usuario _dnscrypt-proxy propietario del archivo

# touch /var/log/dnscrypt-proxy.log
# chown _dnscrypt-proxy:_dnscrypt-proxy /var/log/dnscrypt-proxy.log

Lo siguiente es iniciar dnscrypt-proxy como usuario _dnscrypt-proxy. La opción -l /var/log/dnscrypt-proxy.log permite monitorear errores. La opción por defecto es -l /dev/null.

# /usr/local/sbin/dnscrypt-proxy -d --user=_dnscrypt-proxy -l \
/var/log/dnscrypt-proxy.log -R dnscrypt.eu-nl -a 127.0.0.1:40

Visualizar el registro



# tail -n 20 /var/log/dnscrypt-proxy.log  
[NOTICE] Starting dnscrypt-proxy 1.4.3
[INFO] Initializing libsodium for optimal performance
[INFO] Generating a new key pair
[INFO] Done
[INFO] Server certificate #808464433 received
[INFO] This certificate looks valid
[INFO] Chosen certificate #808464433 is valid from [2015-09-11] to [2016-09-10]
[INFO] Server key fingerprint is E7AC:5C21:A4E6:6A90:B254:DD73:5229:3BA1:5BE9:8EB3:4E8F:E538:52DE:A2FB:DDB6:1357
[NOTICE] Proxying from 127.0.0.1:40 to 176.56.237.171:443                                                              
[INFO] Generating a new key pair
[INFO] Done
[NOTICE] Starting dnscrypt-proxy 1.4.3
[INFO] Initializing libsodium for optimal performance
[INFO] Generating a new key pair
[INFO] Done

Puede editar /etc/dhclient.conf por lo que no sobrescribe el servidor de nombres local.
# echo 'ignore domain-name-servers;' >> /etc/dhclient.conf

o evitar cambios en el fichero /etc/resolv.conf
# chflags schg /etc/resolv.conf

# /etc/rc.d/dhcpd start

Archivo /etc/resolv.conf cliente freebsd

$ cat /etc/resolv.conf
# /etc/resolv.conf
search unix.bcn
nameserver 192.168.3.1

Impedir cambios en el archivo /etc/resolv.conf
# chflags schg /etc/resolv.conf

NTPD

ntpd OpenBSD archivo de configuración:
# cp /etc/examples/ntpd.conf /etc



# echo 'ntpd_flags="-s"'>>/etc/rc.conf.local

# ntpctl -sa

Redirigir a la fuerza las peticiones de todos los clientes LAN al servidor ntpd que se está ejecutando en la máquina soekris con una línea como esta en /etc/pf.conf:

pass in quick on $int_if proto udp from any to ! 192.168.3.1 \ port 123 rdr-to 192.168.3.1

Sincronizar la hora de un cliente de la red:

# ntpdate -u 192.168.3.1
9 Dec 07:51:41 ntpdate[1548]: step time server 192.168.3.1 offset -3557.387959 sec

PF /etc/pf.conf

# cat /etc/pf.conf                                                             
#       $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $
#
# See pf.conf(5) and /etc/examples/pf.conf
int_if="{ vether0 vr1 vr2 vr3 }"
ext_if="vr0"
int_net="192.168.3.0/24"
broken="224.0.0.22 127.0.0.0/8 192.168.0.0/16 172.16.0.0/12, \
        10.0.0.0/8 169.254.0.0/16 192.0.2.0/24, \
        198.51.100.0/24, 203.0.113.0/24, \
        169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32"
set block-policy drop
set loginterface egress
set skip on lo0
# scrub proporciona una medida de protección contra ciertos tipos
# de ataques basados en la manipulación incorrecta de fragmentos
# de paquetes .
match in all scrub (no-df max-mss 1440)

block return    # block stateless traffic
pass            # establish keep-state

# Por defecto, no permita conexiones remotas a X11
block return in on ! lo0 proto tcp to port 6000:6010

# Dejar pasar todo el tráfico en las interfaces internas
# vether0 es necesario aquí, pero no bridge0
# pass quick on { vether0 vr1 vr2 vr3 }
pass quick on $int_if

# permitir ICMP entrante sobre todas las interfaces
pass in inet proto icmp all icmp-type echoreq

# Traduccion de direcciones de red
match out on egress inet from !(egress:network) to any nat-to (egress:0) 

# Es recomendable desactivar el filtrado en las interfaces de
# loopback, pero esto se convierte en necesidad cuando se utilizan
# reglas contra  falsificaciones: antispoof for vr0 inet
antispoof quick for ($ext_if) inet

# bloquear todo el trafico IPv6 evaluar y soltar, sin perder el tiempo
block return out quick inet6 all
block in quick inet6 all

# fuerza redireccion de toda la LAN al servidor ntpd que corre en soekris
pass in quick on $int_if proto udp from any to ! 192.168.3.1 port 123 \
rdr-to 192.168.3.1

# Asegurese de que usted no esta realmente utilizando estos rangos de 
# direcciones o puede romper la conectividad.
block in quick on egress from { $broken no-route urpf-failed } to any

# Estas reglas se evaluan de una forma algo diferente. Si un paquete
# concuerda con la linea block, debido a la naturaleza de la opcion
# quick, se bloquea el paso a dicho paquete y se ignora el resto
# del grupo de reglas.
block in quick on $ext_if proto tcp to port ssh
pass in all

# permitir conexiones ssh desde la red interna
# pass in quick on $int_if proto tcp to port ssh



Traceroute

# traceroute www.google.es



Ajustes disco duro SSD:
Para minimizar el número de escrituras en el disco SSD vamos a el flag noatime al punto de montaje y habilitar soft updates:


SONIDO

El servidor de sonido no tiene utilidad en un router, vamos a desactivarlo:

# echo 'sndiod_flags=NO'>>/etc/rc.conf.local

CREAR ARCHIVO /etc/boot.conf antes del primer reinicio:

# echo 'stty com0 19200'>/etc/boot.conf
# echo 'set tty com0'>>/etc/boot.conf
# chmod 644 /etc/boot.conf
# reboot

APMD (net5501 no lo soporta)

También es posible habilitar apmd para ahorrar energía si el hardware lo soporta. La CPU hacia abajo en momentos de inactividad hacia arriba cuando la carga alcanza un cierto punto.

# echo 'apmd_flags="-A"' >> /etc/rc.conf.local
# /etc/rc.d/apmd start

USB SERIE NULL MODEM

Reinicio alternativo - sin archivo /etc/boot.conf

Por último vamos a detener el sistema, conectar el cable USB serial converter + null modem a una estación de trabajo (portátil FreeBSD 10.2) reiniciar y visualizar la secuencia de arranque. Conectar el cable USB serial convert y teclear en la primera terminal (1):

cu -l /dev/ttyU0 -s 19200
Conected

En una segunda terminal (2):
# ssh 192.168.3.1
# halt -p

En la terminal 1 verá - "Sistema halt teclee cualquier tecla para reicinicar". 
Siga el proceso:

- Ctrl+P
> boot
> stty com0 19200
> set tty com0
> Intro

# dmesg
...
ugen4.3: at usbus4
uftdi0: on usbus4
...

Abrir otra terminal entrar en el dispositivo via ssh y apagar. En la primera terminal saldrá un mensaje que dice el sistema fué apagado presione cualquier tecla para reiniciar.


PRUEBA MD5
A partir de la versión 5.2 de OpenBSD añade soporte a la escala de frecuencia SpeedStep.

El índice de referencia a tener en cuenta utiliza el comando md5 (1), y time trial test:

# md5 -ttt

Se puede apreciar que estoy recibiendo aproximadamente 34 Mbytes/segundo. La velocidad contratada con el proveedor ISP es de 30 MB/s.



Archivo para cambiar nivel de seguridad (securelevel)


Instalar vim no_x11 OpenBSD:

Archivo de inicialización personal ~/.vimrc:


$ cat ~/.vimrc                                                                  
set nocompatible
set et
set sw=4
set smarttab
set number

filetype plugin on
syntax on

set background=dark
colorscheme desert


Bibliografía:

http://www.tw.openbsd.org/faq/es/faq6.html
http://bodgitandscarper.co.uk/
http://www.openbsd.org/faq/

OpenBSD es genial!.

No hay comentarios:

Publicar un comentario