Páginas

sábado, 26 de diciembre de 2015

scums bruteforce OpenBSD pf


SCUMS soekris pf openbsd

IPs para las listas de bloqueo del firewall. Estas provienen de :

Redes de spam identificados por Spamhaus ( www.spamhaus.org )
Top atacantes listados por DShield ( www.dshield.org )
Abuse.ch
Más información disponible en www.emergingthreats.net

Descargar una lista.

# wget http://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt
# mv emerging-Block-IPs.txt scums
# mv scums /var/db/

Añadir entradas a /etc/pf.conf
# vim /etc/pf.conf




Recargar pf
# pfctl -f /etc/pf.conf

Comprobando si se han añadido las direcciones IP:
# pfctl -t scums -T show | wc -l
    1315

BRUTEFORCE

Este tutorial ilustra la protección de puerto 22 (SSH) a partir de los intentos no autorizados para escribir logins utilizando fuerza bruta.

Crear un archivo en el que almacenar las direcciones IP abusadoras.

# touch /var/db/bruteforce

Vamos a añadir entradas a /etc/pf.conf. max- src-conn 3 significa hasta 3 conexiones desde una sola dirección IP, -conn-tasa max-src 3/50 significa hasta 3 conexiones por dirección IP dentro de 50 segundos. El cuarto intento dentro de los 50 segundos acabará añadiendo y bloqueando la IP a la db bruteforce.

# vim /etc/pf.conf


Recargar pf

# pfctl -f /etc/pf.conf

Agregar una entrada en el crontab para añadir la IP en la tabla. Se añaden al archivo /var/db/bruteforce . ¿Cómo va a agregar la nuevoa IP Abuse?, todos los días a las 1:30 cron lo sumará a /var/db/bruteforce . ¿Por qué debería añadir IP?, para evitar perder la IP al recargar pf o reiniciar el sistema.

# crontab -e

30  7  *  *  *  /sbin/pfctl -t bruteforce -T show | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" > /var/db/bruteforce

Comprobar que todo marcha como debiera.

# pfctl -t bruteforce -T show
   60.173.26.206
   113.73.61.113
   222.186.15.200
   222.186.31.237
   222.186.52.158

Redireccionar conexiones SSH: archivo /etc/pf.conf

Cada vez que una conexión entrante desde Internet hacia el puerto TCP 22 en la interfaz de salida, redireccionar a la IP 192.168.3.130 del cliente LAN.

pass in on egress inet proto tcp to (egress) port ssh rdr-to 192.168.3.130

ARCHIVO /etc/pf.conf

Bibliografía:
http://www.tw.openbsd.org/faq/es/faq6.html
http://www.bsdweb.org/bruteforce.html

OpenBSD es genial!.

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!.

PXE Servidor FreeBSD

Instalar OpenBSD Soekris net 5501 FreeBSD.

Disco duro Intel SSD Serie 320 Sata II - 40 GB

Creación de un servidor de arranque de Red FreeBSD PXE

Necesita:
Habilitar SSH
Servidor DHCP
Servidor TFTP
Null modem cable
USB serial converter cable
Es un servidor FreeBSD con dos NIC una para el acceso desde la red externa
(em1 - WAN = 192.168.1.0/24), y otra para actuar como servidor de la red de arranque
(em0 - LAN = 192.168.3.0/24). IPFilter Firewall.
Salida VGA

Conectar al servidor para su configuración :
# ssh 192.168.3.1

Servidor dhcp

# pkg install isc-dhcp42-server
# echo 'dhcpd_enable="YES"'>>/etc/rc.conf
# echo 'dhcpd_ifaces="em0"'>>/etc/rc.conf

$ sed -e '/^[ ]*#/d' -e '/^$/d' /usr/local/etc/dhcpd.conf


Archivo /etc/rc.conf

Servidor tftpd

# sed -e '/^[ ]*#/d' -e '/^$/d' /etc/inetd.conf
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot


Archivo /etc/resolv.conf servidor

search unix.bcn
nameserver 127.0.0.1
nameserver 208.67.222.222
nameserver 208.67.220.220
options edns0

Archivo /etc/resolv.conf cliente
search unix.bcn
nameserver 192.168.1.1
lookup file bind

# sockstat -4 | grep inetd
root     inetd      702   5  udp4   *:69  *:*
# mkdir /tftpboot
# chmod 755 /tftpboot

Comprobar tftp desde el cliente:
$ hostname
openBSD.unix.bcn
$ tftp 192.168.3.1
tftp> get index.txt
Received 1380 bytes in 0.1 seconds
tftp> quit
$

Descargar archivos del servidor OpenBSD 5.7 i386 (soekris net5501)

# cd /tftpboot
# fetch http://mirror.codigo23.net/pub/OpenBSD/5.7/i386/index.txt
index.txt                                     100% of 1489  B   35 kBps 00m00s
Successfully retrieved file.

Bajar todos los ficheros listados dentro de index.txt
# cat index.txt | grep -v '.iso' | tee index.txt | while read file ;  do \
>  ftp http://mirror.roothell.org/pub/OpenBSD/5.7/i386/"$file" \
> done
100% |********************************************************************************|   106 KB    00:00  
100% |********************************************************************************| 22356       00:00  
100% |********************************************************************************|  1022       00:00  
100% |********************************************************************************| 46941 KB    00:27  
100% |********************************************************************************|  6539 KB    00:02  
100% |********************************************************************************|  6558 KB    00:03  
100% |********************************************************************************|  5461 KB    00:02  
100% |********************************************************************************|
...

Ahora crear el fichero /etc/boot.conf con este contenido:
stty com0 19200
set tty com0

Soekris utiliza esta configuración para poder acceder a la consola serie. Después de que su servidor de instalación se haya reiniciado, el proceso es el mismo que en una instalación normal.

Nota: Las tarjetas Compact Flash conectan a 115,200. Algo así:
# cu -l /dev/ttyU0 -s 115,200

Bibliografía:
http://wiki.soekris.info/Connecting_to_the_serial_console
http://dustingram.com/articles/2009/08/25/creating-a-freebsd-pxe-network-boot-server/
http://meinit.nl/install-your-soekris-or-any-other-machine-openbsd-using-openbsd

Unix es genial!.

jueves, 29 de octubre de 2015

Tráfico protegido con una VPN basada en BSD

Cuando estás en una red insegura, la última cosa que quiere es que alguien registre todo el tráfico. Hacer la mayor parte de su trabajo a través de SSH es probablemente la mejor solución, a veces desea encapsular todo su tráfico en un túnel. OpenSSH puede hacer eso con un poco de trabajo extra, pero OpenVPN es una herramienta hecha para este propósito exacto. OpenVPN funciona en todos los BSD. Vamos a utilizar FreeBSD 9 en este tutorial, pero se puede adaptar las ubicaciones de los archivos y la configuración a otros BSD muy fácilmente. Instalar OpenVPN desde ports o paquetes.

Escenario: Un servidor FreeBSD con dos tarjetas de red:
Wan -em1 (192.168.1.250)
Lan - em0 (192.18.3.1).
Dhcp - activado
Firewall - ipfilter

El ordenador cliente ejecuta openBSD 5.6, pf firewall.

se conecta a la red Lan a través de un Switch. Ahora asignamos la dirección IP y el gateway con los siguientes comandos:


Luego, añadiremos OpenVPN para los elementos de inicio, en el cliente y el servidor:

En el sevidor (FreeBSD)
# echo 'openvpn_enable="YES"' >> /etc/rc.conf
# echo 'openvpn_if="tun"' >> /etc/rc.conf

En el cliente (OpenBSD)
# echo 'openvpn_enable=YES' >> /etc/rc.conf.local
# echo 'openvpn_if=tun' >> /etc/rc.conf.local

Vamos a configurar el registro (log) adecuado:
# ssh carles@192.168.1.254
Password:

# vi /etc/syslog.conf:
Agregue al final de /etc/syslog.conf algo como esto:

!openvpn
*.* /var/log/openvpn.log
!*

Crear el archivo openvpn.log y releer el archivo de configuración:

# touch /var/log/openvpn.log
# /etc/rc.d/syslogd reload
Rotación de registro (log) para que no se quede sin espacio en disco:

# cat << END >> /etc/newsyslog.conf  \
/var/log/openvpn.log  600  30    *    @T00  ZC  \
END

Ahora vamos a crear los certs, conectando via ssh al servidor FreeBSD. El port OpenVPN instala easy-rsa, es una herramienta para generar certificados. Haremos nuestra propia copia de trabajo del directorio easy-rsa en un lugar seguro :

# pkg_add -v openvpn
# cp -r /usr/local/share/easy-rsa /root/easy-rsa
# cd /root/easy-rsa

Editar las variables en el archivo "vars" para establecer los valores predeterminados para los certificados. La mayor parte de lo que se quiere cambiar es en la parte inferior. "KEY_SIZE" y "KEY_CN" son los más utilizados, "KEY_CN" se utiliza como el nombre de host del servidor predeterminado para los certificados. No pueden estar en blanco.

export KEY_SIZE=2048
export KEY_COUNTRY="ES"
export KEY_PROVINCE="CA"
export KEY_CITY="Barcelona"
export KEY_ORG="server-carles-freebsd"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_CN="freebsdsvr.linux.bcn"
export KEY_NAME=changeme
export KEY_OU="bsdalways"

Preparar un entorno de Bourne shell para la creación de certificados:

# sh
# . ./vars
Debe ejecutar clean-all la primera vez antes de crear certificados. Si usted ya tiene algunos, serán eliminados .

# ./clean-all
Generar el CA certificado que se utilizará para firmar los otros. Basta con aceptar los valores predeterminados a menos que usted desee anularlos.

# ./build-ca
Generar el certificado de servidor utilizando un nombre de host NC 'openvpn-server'. Es conveniente utilizar el nombre de host del servidor de la NC, pero no es obligatorio. Una vez más, acepte los valores predeterminados.

# ./build-key-server openvpn-server
Generar DH claves:

# ./build-dh
Generar un certificado de cliente para cada cliente, en este caso 'openvpn-openBSD-client. Es conveniente utilizar el nombre de host del cliente de la NC, se utiliza como un identificador.

# ./build-key openvpn-client
Almacenar permanentemente las claves de servidor en un lugar seguro :

# mkdir -p /usr/local/etc/openvpn/keys
# chmod 700 /usr/local/etc/openvpn/ /usr/local/etc/openvpn/keys
# cp /root/easy-rsa/keys/ca.crt /usr/local/etc/openvpn/keys/
# cp /root/easy-rsa/keys/dh*.pem /usr/local/etc/openvpn/keys/
# cp -p /root/easy-rsa/keys/openvpn-server.crt /usr/local/etc/openvpn/keys/
# cp -p /root/easy-rsa/keys/openvpn-server.key /usr/local/etc/openvpn/keys/
En cada cliente, crear un lugar seguro para el archivo de configuración y las claves:

# mkdir -p /usr/local/etc/openvpn/keys
# chmod 700 /usr/local/etc/openvpn/ /usr/local/etc/openvpn/keys

Advertencia de Permiso denegado:
scp: /usr/local/etc/openvpn/keys/: Permission denied

Voy al cliente para cambiar los permisos "solo" para la copia de claves:
# chmod 777 /usr/local/etc/openvpn/ /usr/local/etc/openvpn/keys

Copiar de forma segura el siguiente certificado de cliente y archivos de clave de openvpn-server, en cada cliente en /usr/local/etc/openvpn/keys:

Desde el servidor teclear los siguientes comandos:
# scp /root/easy-rsa/keys/ca.crt carles@192.168.3.60:/usr/local/etc/openvpn/keys/
# scp /root/easy-rsa/keys/openvpn_openBSD_client.crt carles@192.168.3.60:/usr/local/etc/openvpn/keys/
# scp /root/easy-rsa/keys/openvpn_openBSD_client.key carles@192.168.3.60:/usr/local/etc/openvpn/keys/

No olvide revertir los cambios, en el cliente, después de realizar la copia segura (scp):
# chmod 700 /usr/local/etc/openvpn/ /usr/local/etc/openvpn/keys

Garantizar permisos de seguridad en el archivo clave del cliente :
# chmod 600 /usr/local/etc/openvpn/keys/*.key
Next, we'll edit the server configuration for openvpn.conf:

Archivo de configuracióon del servidor:
# cp /usr/local/share/examples/openvpn/sample-config-files/server.conf \
   /usr/local/etc/openvpn/openvpn.conf
# chmod 600 /usr/local/etc/openvpn/openvpn.conf
# vi /usr/local/etc/openvpn/openvpn.conf
Reemplace:

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
Por:

ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/openvpn-server.crt
key /usr/local/etc/openvpn/keys/openvpn-server.key
Luego reemplace:

dh dh2048.pem
Por:

dh /usr/local/etc/openvpn/keys/dh2048.pem
Finalmente:

comp-lzo
Por:

comp-lzo no
push "comp-lzo no"
LZO compression fue desactivado debido a posibles chosen-plaintext ataques.

Archivo de configuración del cliente - client.conf:

# mkdir /etc/openvpn
# cp /usr/local/share/examples/openvpn/sample-config-files/client.conf \
  /etc/openvpn/client.conf
# chmod 600 /etc/openvpn/client.conf
# vi /etc/openvpn/client.conf
Remplace:

remote my-server-1 1194
Por:

remote 192.168.3.1 1194
topology subnet
:
Utilice el nombre real de su servidor o IP por '192.168.3.1'. Luego, remplace

ca ca.crt
cert client.crt
key client.key  # Este archivo debe ser mantenido en secreto
Por:

ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/openvpn-client.crt
key /usr/local/etc/openvpn/keys/openvpn-client.key
Finalmente:

comp-lzo
Por:

comp-lzo no

Ahora podemos iniciar conexiones.

En el servidor, ejecute:

# service openvpn start
$ hostname
freebsdsvr.linux.bcn
$ ps ax |grep openvpn
1503 ??  Ss     0:00.30 /usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --d
4689  0  R+     0:00.00 grep openvpn

Compruebe ifconfig, debería aparecer una nueva interfaz tun. Haga lo mismo en el cliente
# ifconfig -tun0


Iniciar openvpn en el cliente openBSD:

Es necesario el archivo  /etc/rc.d/openvpn

Este es un script rc normal utilizado por openbsd. Lo encontrará en,
http://www.openbsdsupport.org/openvpn-on-openbsd56.html

#######################################
#!/bin/sh
#
# openvpn rc.d script for OpenBSD - by Chris Pfaff
#
# This script acts like normal rc script if the openvpn_flags in rc.conf.local ar
# But if openvpn_flags are set to special string "-use-etc-hostname-" then script
#  It starts the openvpns configured in /etc/hostname.if (eg in /etc/hostname.tun
#  It will start multiple openvpn - each with its own config defined in /etc/host
#  If script detects that a process is already running - it does not try to start
#  It supports usual parameters like: start, check, stop, restart, reload
#
# -d = debug mode - use to see verbose information about executed commands
#

daemon="/usr/local/sbin/openvpn"

. /etc/rc.d/rc.subr

if [ "$daemon_flags" != "-use-etc-hostname-" ]; then 
    # handle as usual
    rc_cmd $1
else
    #special unusual handling
    #start openvpns defined in /etc/hostname.*

    # Edit if necessary
    # This pattern is being used for scanning /etc/hostname.tun*
    # and for finding running openvpn processes
    # and for searching individual openvpn process - then patter is appended with: [^a-zA-Z]${hnif}([^0-9]|$)
    processpattern='openvpn.*--daemon.*'

    [ -n "${_RC_DEBUG}" ] || _n="-n"
    PGREPFLAG="-f"
    PKILLFLAG="-f"
    [ -z "${_RC_DEBUG}" ] && PKILLFLAG="$PGREPFLAG -q"  # quiet if not debug mode
    [ -z "${_RC_DEBUG}" ] && PGREPFLAG="$PGREPFLAG -q"  # quiet if not debug mode
    [ -n "${_RC_DEBUG}" ] && PGREPFLAG="$PGREPFLAG -l"  # list process name in debug mode
    case "$1" in
    start|check)
        [ "$1" == "start" ] && echo $_n "${INRC:+ }${_name} "
        if [ X"${daemon_flags}" = X"NO" ]; then
            _rc_err "$0: need -f to force $1 since ${_name}_flags=NO"
            exit 1
        fi
        allprocstatus=0
        # search all hostname.tun* files which contain openvpn startup command
        hostnamepattern="/etc/hostname.tun*"
        for hostnamefile in $hostnamepattern; do
            if [ "$hostnamefile" = "$hostnamepattern" ]; then
                [ -n "${_RC_DEBUG}" ] && echo "no files $hostnamepattern"
                [ "$2" == "quiet" ] && exit 1
                _rc_exit failed
            fi
            [ -n "${_RC_DEBUG}" ] && echo
            if grep -v "^[  ]*#" "$hostnamefile" | grep -q "$processpattern" ; then
                [ -n "${_RC_DEBUG}" ] && echo "File $hostnamefile is openvpn file - will be started/checked"
            else
                [ -n "${_RC_DEBUG}" ] && echo "File $hostnamefile is not related to openvpn - skipping"
                continue
            fi
            # extract interface name from filename
            hnif=${hostnamefile##/etc/hostname\.}
            if [ -z "$hnif" ]; then
                [ -n "${_RC_DEBUG}" ] && echo "Cannot get interface name from $hostnamefile"
                hnifstatus=1
                allprocstatus=1
                continue
            fi

            # check if process is already running for this network interface - if yes, do nothing and result is ok 
            hnifprocesspattern="${processpattern}[^a-zA-Z]${hnif}([^0-9]|$)"  # eg server_tun0.conf or client_tun0.conf or -dev tun0
            [ -n "${_RC_DEBUG}" ] && echo "Executing: pgrep ${PGREPFLAG} \"$hnifprocesspattern\""
            pgrep ${PGREPFLAG} "$hnifprocesspattern" && continue

            if [ "$1" == "check" ]; then
                [ -n "${_RC_DEBUG}" ] && echo "Missing openvpn process for ${hnif} - see $hostnamefile"
                hnifstatus=1
            else
                echo -n "$hnif "  # write name of started if
                # if process is not running for this interface - start it
                [ -n "${_RC_DEBUG}" ] && echo "Executing: /bin/sh /etc/netstart $hnif "
                /bin/sh /etc/netstart $hnif; hnifstatus=$?
                [ -n "${_RC_DEBUG}" ] && echo " status: $hnifstatus"  # etc/hostname scripts may return 0 even if error occurred
            fi
            [ $hnifstatus -ne 0 ] && allprocstatus=1
        done
        # if ANY failed then return failure - (simple exit if check in quiet mode)
        [ "$2" == "quiet" -a $allprocstatus -ne 0 ] && exit 1
        [ $allprocstatus -ne 0 ] && _rc_exit failed
        [ "$2" == "quiet" ] && exit 0
        _rc_exit ok
        ;;
    stop)
        echo $_n "${INRC:+ }${_name} "
        [ -n "${_RC_DEBUG}" ] && echo "Executing: pkill ${PKILLFLAG} \"$processpattern\""
        pkill ${PKILLFLAG} "$processpattern"
        countdown=10
        while [ "((countdown--))" -gt 0 ]; do
            pgrep ${PKILLFLAG} "$processpattern" >/dev/null || continue
            sleep 1;
        done;
        [ -n "${_RC_DEBUG}" ] && echo "Executing: $0 ${_RC_DEBUG} ${_RC_FORCE} check quiet"
        $0 ${_RC_DEBUG} ${_RC_FORCE} check quiet && _rc_exit failed
        _rc_exit ok
        ;;
    reload)
        echo $_n "${INRC:+ }${_name} "
        [ -n "${_RC_DEBUG}" ] && echo "WARNING: Reload might crash the process if process is chrooted"
        [ -n "${_RC_DEBUG}" ] && echo "Executing: pkill -HUP ${PKILLFLAG} \"$processpattern\""
        pkill -HUP ${PKILLFLAG} "$processpattern" || _rc_exit failed
        sleep 10;
        [ -n "${_RC_DEBUG}" ] && echo "Executing: $0 ${_RC_DEBUG} ${_RC_FORCE} check quiet"
        [ -n "${_RC_DEBUG}" ] && echo "WARNING: Reload might crash the process if process is chrooted"
        $0 ${_RC_DEBUG} ${_RC_FORCE} check quiet || _rc_exit failed
        _rc_exit ok
        ;;
    restart)
        $0 ${_RC_DEBUG} ${_RC_FORCE} stop &&
            $0 ${_RC_DEBUG} ${_RC_FORCE} start
        ;;
    *)
        _rc_usage
        ;;
    esac
fi
########################################


Hacer el script ejecutable:
# chmod +x /etc/rc.d/openvpn

Este script rc /etc/rc.d/openvpn sólo funciona si openvpn_flags se define en rc.conf.local

Con el fin de tener el guión openvpn rc compatible con archivos /etc/hostname.*

Añadir a /etc/rc.conf.local:
openvpn_flags = "- use-etc-hostname -"

Luego agregamos estas lineas al archivo /etc/hostname.msk0 (NIC Ethernet):
dhcp
up
!/usr/local/sbin/openvpn --config /etc/openvpn/client.conf

Puerta de enlace por defecto - gateway:
# cat /etc/mygate
192.168.3.1

Probar conexión al servidor openvpn:
# openvpn --config /etc/openvpn/client.conf


Iniciar openvpn cliente como demonio:
Añadir al archivo /etc/openvpn/client.conf

# Make the server daemonize after initialization
daemon openvpn


# ps ax | grep openvpn
 7085 ??  Ss      0:00.04 openvpn --config /etc/openvpn/client.conf
 8952 p1  R+      0:00.00 grep openvpn (ksh)
# hostname
openBSD.my.domain

# ifconfig tun0


El cliente debe poder hacer ping 10.8.0.1.
$ hostname
openBSD.my.domain
$ ping -c5 10.8.0.1


$ tail /var/log/openvpn.log


En este punto al iniciar el cliente openBSD conectará automáticamente al servidor openvpn:



# tcpdump -i msk0 -np

-p Don't put the interface into promiscuous mode
-n Don't convert addresses to names


Es posible que desee mover /root/easy-rsa fuera del servidor a un lugar seguro para reducir el riesgo de que un keylogger esté copiando las pulsaciones del teclcado. Es autónomo y todavía se puede utilizar para generar más claves en otros lugares. Si lo desea, puede utilizar la opción 'cipher ' para elegir el cifrado fuerte y 'auth' plus 'tls -auth' para permitir HMAC en los paquetes. Si lo habilita

push "redirect-gateway def1 bypass-dhcp"
en el servidor, los clientes conectados anularán temporalmente la puerta de enlace predeterminada y se fijará una nueva puerta de enlace predeterminada en el servidor VPN a través del túnel. El servidor VPN debe estár configurado como un router (gateway_enable="YES" en rc.conf ) y NAT para enrutar tráfico adecuadamente a la red externa (Internet). Si reinicia el servidor, los clientes se vuelven a conectar una vez pasado el tiempo de espera definido en la configuración del cliente.

Key Files

Una explicación de los archivos relevantes, (howto openvpn)
Filename Needed By Purpose Secret
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
client1.crt client1 only Client1 Certificate NO
client1.key client1 only Client1 Key YES
client2.crt client2 only Client2 Certificate NO
client2.key client2 only Client2 Key YES
client3.crt client3 only Client3 Certificate NO
client3.key client3 only Client3 Key YES

Bibliografía:
Originally written by Adam McDougall
https://openvpn.net/index.php/open-source/documentation/howto.html

http://networkfilter.blogspot.com.es/2015/01/be-your-own-vpn-provider-with-openbsd.html
http://www.bsdnow.tv/tutorials/openvpn
https://wiki.freebsd.org/
http://www.openbsd.org/faq/

Unix es genial!.