Páginas

Mostrando entradas con la etiqueta raspberry. Mostrar todas las entradas
Mostrando entradas con la etiqueta raspberry. Mostrar todas las entradas

martes, 11 de julio de 2023

Servidor VPN con ZeroTier FreeBSD Raspberry Pi

Para crear una VPN se necesita:

1.- Un Servidor VPN
2.- Configuración de los clientes VPN
3.- Servicio DDNS (para conocer la IP pública de nuestro servidor)
4.- Abrir los puertos en el Router y poder acceder desde el exterior al servidor VPN
5.- No estar detrás de un CG-NAT.

Como acceder a nuestra red de una manera segura, cifrada (cifrado de 256 bits), saltándonos el CG-NAT en caso de que nuestro proveedor de Internet lo utilice, sin abrir puertos y sin servicio DDNS?.

La respuesta es el servicio ZeroTier, (SD-WAN), gratuito para uso personal (25 dispositivos). Con ZeroTier podremos unir equipos, unir redes, tanto si están dentro de la red como fuera de la misma. Podremos acceder desde cualquier ordenador, teléfono, cualquer dispositivo que tengamos dentro de nuestra red pero desde fuera de la red.

Para conseguirlo utilizaremos una raspberrypi (Raspberry Pi 3B) y la convertimos en un servidor VPN. Instalamos el sistema operativo raspbian en un disco externo SSD Intel de 40GB. No es necesario configurar una dirección estática porque no se usa el reenvío de puertos en el Router. Y sí, necesitamos el acceso vía SSH por lo que lo habilitaremos.

La red virtual asignada por ZeroTier es la 192.168.192.0/24, también puede crear su propia red o elegir otra red de las ofrecidas por ZeroTier desde su panel dec control. Debe ser una subred diferente a la subred que tenemos. Por ejemplo, yo tengo la subred 192.168.88.0/24 que no coincide con la red virtual de ZeroTier, la 192.168.192.0/24.

La dirección IP de mi servidor VPN es 192.168.8.12 accedemos a través de un portátil FreeBSD a la Raspberry Pi a través de la red.


% ssh carlos@192.168.88.12

ifconfig servidor VPN

ifconfig solaris FreeBSD

Como utilizaremos Zerotier para construir nuestro propio servidor VPN nos vamos a la página principal de ZeroTier, nos registramos (gratuito para uso personal y menos de 25 computadoras), habilitamos 2 factor authentication, creamos una Red y utilizamos el Network ID o identificador de red para conectar los clientes a esa red.


 

ZeroTier permite enrutar entre una red física y una red privada virtual para que los dispositivos remotos puedan acceder a los recursos locales a través de Internet.

Instalar Zerotier


carlos@raspberrypi3:~ $ sudo apt install zerotier-one

Unirse a la red


carlos@raspberrypi3:~ $ sudo zerotier-cli join 565799d8f6259736
	
carlos@raspberrypi3:~ $ sudo zerotier-cli status
200 info 7dd6...... 1.10.6 ONLINE

Listar redes


carlos@raspberrypi3:~ $ sudo zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 565799d8f6259736 home_arpa 4e:0c:37:66:55:d8 OK PRIVATE zt2lrsbp44 fccc:d2b0:827d:d6b6:9b19::1/40,192.168.192.119/24

Mostrar información de estado


carlos@raspberrypi3:~ $ sudo zerotier-cli info
200 info 7dd....... 1.10.6 ONLINE

Conexión peer to peer listar peers


carlos@raspberrypi3:~ $ sudo zerotier-cli listpeers

A continuación vamos a la página de Zerotier nos logueamos y permitimos que esa computadora se una a la red de zerotier (autorizar - Auth?) y le ponemos un nombre para identificarlo. Repetimos lo mismo para los demás dispositivos (teléfono móvil, iPads, PC, etc.).

Instalar ZeroTier en FreeBSD 13.1


# pkg install zerotier
# sysrc zerotier_enable=YES

Iniciar el servicio


# service zerotier start

Unirse a la red


# zerotier-cli join 565799d8f6259736

Comprobar estado


# zerotier-cli status
200 info 6a58..... 1.10.2 ONLINE

Salir de la red


# zerotier-cli leave 565799d8f6259736

Para configuración adicional consulte la página de zerotier


https://www.zerotier.com/manual.shtml

Crear las rutas

A continuación enrute entre las dos redes; física y red virtual zerotier para que las computadoras remotas puedan acceder a la red local utilizando la computadora de destino.

Rango de mi red local 192.168.88.0/24


192.168.88.0/24 a través de la ip asignada a la raspberrypi3 (VPN) por ZetoTier -> 192.168.192.119

Add Routes 
Destination		    Via
192.168.88.0/24		192.168.192.119

FIGURA zerotier-rutas-4.png 

 


Ahora se configura el reenvío de puertos en la raspberrypi3 y activar el reenvío de tráfico entre las dos interfaces de red, la interface eth0 y la interfaz de red de Zerotier. Para ello:

Habilitar el reenvio de paquetes entre dos interfaces (IP forwarding), la interfaz de red fisica y la interfaz de zerotier


echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Y finalmente estos comandos para permitir el paso de tráfico entre las dos interfaces

https://zerotier.atlassian.net/wiki/spaces/SD/pages/224395274/Route+between+ZeroTier+and+Physical+Networks

PHY_IFACE=eth0; ZT_IFACE=zt2lrsbp44

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o zt2lrsbp44 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i zt2lrsbp44 -o eth0 -j ACCEPT

sudo apt install iptables-persistent
# bash -c iptables-save > /etc/iptables/rules.v4

1.- Apague el wifi en tu teléfono
2.- Únase a la red zerotier, autorízalo
3.- Intente acceder a algo en la LAN física

Desde mi iPhone descargo las App Zerotier y Termius: Terminal & SSH client

Estoy conectado a Internet a través de la VPN que acabo de crear, también puedo entrar vía SSH a los dispositivos configurados para ese fin.










 

 

Reglas del Firewall PF FreeBSD


###################################################################
int_if = "em0"
lan_net = "192.168.88.0/24"

rfc1918 = "{ 127.0.0.0/8, 172.16.0.0/12, \
169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4, 224.0.0.0/3 }"

#tcp_pass="{ 22 53  80 123 111 443 832 1110 1651 2049 3000 8000 8080 20049 }"
#udp_pass="{ 53 111 832 1110 1651 2049 20049 }"
#tcp_pass="{ 22 53  80 123 111 443 1110 3000 8000 8080 }"
#udp_pass="{ 53 111 1110 9993}"

# scrub incoming packets
scrub in all

# setup a default deny policy
block in all
block out all

# pass traffic on the loopback interface in either direction
pass quick on lo0 all

# activate spoofing protection for the internal interface.
antispoof quick for $int_if inet

############
block drop in quick on $int_if from $rfc1918 to any
block drop out quick on $int_if from any to $rfc1918
############

# only allow ssh connections from the local network if it‘s from the
# trusted computer, 192.168.0.15. use "block return" so that a TCP RST is
# sent to close blocked connections right away. use "quick" so that this
# rule is not overridden by the "pass" rules below.
# block return in quick on $int_if proto tcp from ! 192.168.0.15 \
# to $int_if port ssh flags S/SA
block return in quick proto tcp from ! 192.168.192.0/24 port ssh flags S/SA

# pass all traffic to and from the local network
pass in on $int_if from $lan_net to any
pass out on $int_if from any to $lan_net

# pass out on se refiere al trafico de salida
#pass out quick on $int_if proto tcp to any port $tcp_pass keep state
#pass out quick on $int_if proto udp to any port $udp_pass keep state

# pass tcp, udp, and icmp out on the external (Internet) interface.
# keep state on udp and icmp and modulate state on tcp.
pass out on $int_if proto tcp all modulate state flags S/SA
pass out on $int_if proto { udp, icmp } all keep state

# allow ssh connections in on the external interface as long as they‘re
# NOT destined for the firewall (i.e., they‘re destined for a machine on
# the local network). log the initial packet so that we can later tell
# who is trying to connect. use the tcp syn proxy to proxy the connection.
#pass in log on $ext_if proto tcp from any to { !$ext_if, !$int_if } \
#port ssh flags S/SA synproxy state
pass in log proto tcp from any to { !$int_if } port ssh flags S/SA synproxy state
#################################################################################
FreeBSD es genial!.

martes, 21 de abril de 2015

Openvpn raspberry pi 2

Nivel avanzado.

Fuente:

Eric Jodoin (Sans) http://www.sans.org/
Eric Jodoin tutorial (formato pdf) http://www.sans.org/reading-room/whitepapers/hsoffice/soho-remote-access-vpn-easy-pie-raspberry-pi-34427
How to Lauren Orsini Parte una y Parte dos:
http://readwrite.com/2014/04/10/raspberry-pi-vpn-tutorial-server-secure-web-browsing
http://readwrite.com/2014/04/11/building-a-raspberry-pi-vpn-part-two-creating-an-encrypted-client-side

Construir un servidor que cifra sus datos web de miradas indiscretas.

Portátil Dell Inspiron 1525 OpenBSD KDE 3.5 Intel SSD 40GB sata II. Me encanta!


VPN en Raspberry Pi 2 con Openvpn.

Wifi gratis y sin cifrar se encuentran en todas partes, aunque no es buena idea comprobar su cuenta bancaria a menos que no le importe que alguien esté husmeando. Como evitarlo ? una VPN (red privada virtual). Extiende su propia red privada en lugares públicos, de manera que si utiliza la conexión Wifi del establecimiento en que está, su navegación permanece encriptada y segura.

Lo más económico para mantener sus datos seguros es abstenerse de utilizar acceso Wifi, poco prático, aunque sí podemos construir nuestro propia VPN en casa, ejecutarla en un dispositivo del tamaño de un teléfono móvil, de muy bajo costo y consumo, Raspberry Pi 2.

Que necesita:
Tener instalado Raspbian
Una IP estática para la Raspberry Pi o un servicio DDNS (yo utilizo freedns.afraid.org). Utiliza su propia configuración, por tanto no necesita la utilidad ddclient. Es gratis, funciona perfecto desde 2007 y en la actualidad cuenta con mas de 2,500,000 de miembros.

Nota: Para mantener nuestro subdominio activo en freedns.afraid.org, debemos autentificarnos por lo menos una vez en 6 meses. Aunque es posible reactivarlo pasado este período de tiempo.

Configurar ddns freedns.afraid:
Es un DDNS gratis basado en servidores FreeBSD.
Primero se realiza el registro y a continuacion desde la entrada Subdomains, se crea un subdominio.
Ahora, desde la pestaña Dynamic DNS,  podrá actualizar automáticamente cada 5 minutos utilizando cron :
2 dynamic update candidates! (A and AAAA records).

Al clicar sobre quick cron example ver
á algo como esto:

El texto que aparece seleccionado (al final de la página), lo pegaremos llamando la tabla de tareas crontab, revisada por cron (un administrador regular de procesos en segundo plano (demonio) que ejecuta guiones a intervalos regulares (por ejemplo, cada minuto, día, semana o mes):
pi@server $ sudo /etc/crontab -e


Guardar y cerrar.

Consideraciones si utiliza no-ip: 
1. Abrir puerto 8245 en la Raspberry Pi (iptables)
2. no-ip no necesita de ddclient. Utiliza un tar.gz descargable desde su cuenta de usuario - noip-duc-linux.tar.gz. Las instrucciones de Instalación se encuentra en el archivo README.FIRST

Necesita tener habilitado SSH para conectar a la Raspberry Pi desde otro ordenador.
Redirigir puerto 1194 (UDP) a la IP interna de la Raspberry Pi (NAT en su router, port mapping).
Configurar servicio DDNS en el router de acceso a Internet.
Redirigir puerto 22 a la IP de su Raspberry Pi, para realizar conexión remota a la Raspberry Pi.

Si precisa de ddclient:
ddclient asume que está conectado directamente a Internet. Como su Raspberry Pi está dentro de su red interna, tiene que editar el archivo ddclient manualmente y reemplazar use=if, if=eth0 por use=web, if=myip.dnsdynamic.org

# cat /etc/ddclient.conf
##############
daemon=300
protocol=dyndns2
use=web, if=myip.dnsdynamic.org
server=freedns.afraid.org
login=username@gmail.com
password=' '
MyPiVPN.dnsdynamic.com
##############

Re-ejecutar ddclient:
# sudo pkg-reconfigure ddclient

Conectar con la Raspberry Pi via SSH desde otro pc y cambie su contraseña y/o nombre de usuario


Vamos a actualizar la Raspberry Pi con estos comandos:

pi@server ~ $ sudo apt-get update && sudo apt-get upgrade


Instalar OpenVPN

pi@server ~ $ sudo apt-get install openvpn

No quiere que cualquiera que encuentre la direccion del servidor VPN se pueda conectar. Vamos a crear una llave para el servidor utilizando Easy RSA, metodo de cifrado incluido en OpenVPN.

Obtener permisos de superusuario
pi@server ~ $ sudo -s
root@server:/home/pi#

Copiar el directorio 2.0 a /etc/openvpn/easy-rsa de manera recursiva

# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

Editar el archivo vars:
# cd /etc/openvpn/easy-rsa
# nano vars



Es el momento de construir el certificado CA y Root CA certificado, autofirmado:

En criptográfica, una autoridad de certificación (CA) es una entidad que emite certificados digitales. El certificado digital certifica la posesión de una clave pública.

# source ./vars

# ./clean-all

# ./build-ca

El nombre del servidor es server:
root@server:/etc/openvpn/easy-rsa# ./build-key-server server

Una vez tecleado Intro aparecen algunas lineas y sus valores por defecto, preste atencion a:

Common Name server (o el que usted tecleo con anterioridad)

A challenge password? debe dejarlo en blanco

Sign the certificate? y

1 out of 1 certificate requests certified, commint? y

...
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/local/etc/openvpn/easy-ra/pki/ca.crt
...

Acabada la contruccion del servidor, es el momento de crear las claves para los clientes, una por cada dispositivo:

# ./build-key-pass NombreUsuario

Donde NombreUsuario es:
client1, client2, client3, client4, client5, client6, client7, client8, client9

De nuevo más intrucciones

Enter PEM pass phrase Ingrese una contrasena que recuerde

A challenge password? Deje en blanco

Sign the certificate? y

# cd keys

El cifrado des3, un algoritmo de cifrado complejo que se aplica tres veces para cada bloque de datos. OpenSSl un metodo estandar para la crreacion de una conexion segura. Es necesario realizar este paso para cada cliente que configure:

# openssl rsa -in client1.key -des3 -out client1.3des.key

He utilizado el mismo password anterior y las dos veces siguientes.

Enter pass phrase for cliente1.key:
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Ahora vamos a generar el intercambio de claves Diffie-Hellman. Un intercambio que permite a dos entidades sin conocimiento previo de una, claves secretas a la otra. El cifrado es de 1024-bit que es el valor por defecto, (este valor se establece en el archivo vars, se puede cambiar a 2048-bit).

# cd /etc/openvpn/easy-rsa/
# ./build-dh

Finalmente, vamos a implementar OpenVPN build-in para la proteccion de ataques DoS (Denegacion de Servicio), generando la llave estatica HMAC con el comando siguiente:

# openvpn --genkey --secret keys/ta.key

Falta generar el archivo de configuracion de OpenVPN donde le diremos a OpenVPN, que direccion IP y puerto utilice, donde va a estar conectado, tipo de conexion, etc., utilizando el archivo de configuración de Lauren Orsini y que puede descargar del enlace siguiente. Copie y guárdelo en su servidor local, no tiene formato y funciona perfectamente:

https://gist.github.com/laurenorsini/9925434

Archivo server.conf

# nano /etc/openvpn/server.conf

Hay que activar el reenvio de paquetes IPv4 en el archivo /etc/sysctl.conf descomentando la linea:

net.ipv4.ip_forward=1

Aplicar los cambios sin reiniciar:

# sysctl -p

Raspbian integra un firewall que bloquea las conexiones entrantes de fuentes desconocidas e inesperadas. Queremos seguir protegidos pero necesitamos una regla que permita el tráfico que genera OpenVPN y que recuerde (después de un reinicio) que la conexión OpenVPN siempre esta permitida utilizando un script que se ejecuta en el arranque:

# nano /etc/firewall-openvpn-rules.sh
#!/bin/sh
ipt=/sbin/iptables
#La RPi proporcionará NAT entre OpenVPN cliente subred (10.8.0.0/24) y la soho (small office
#home office) subnet 192.168.1.0/24.
$ipt -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.130
#utilizado por no-ip (ver README.FIRST)
$ipt -A INPUT -p tcp --dport 8245 -j ACCEPT
#permitir conexiones remotas via SSH.
$ipt -A INPUT -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p udp --dport 22 -j ACCEPT
#################

# chmod root /etc/firewall-openvpn-rules.sh
# chmod 0700 /etc/firewall-openvpn-rules.sh
# cd /etc
# sh ./firewall-openvpn-rules.sh
$ sudo iptables -L -n -v


o lo que es lo mismo:



/sbin/iptables -L -n -v

La direccion 10.8.0.0 es la predeterminada de Raspberry Pi para los clientes conectados a la VPN. eth0 es el puerto Ethernet. El archivo creado no tiene permisos de ejecucion y por seguridad solo sera ejecutado por su propietario root.


IP fija y pre-up script firewall:
# cat /etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.1.130
netmask 255.255.255.0
gateway 192.168.1.1
pre-up /etc/firewall-openvpn-rules.sh
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Ya tiene un servidor VPN (OpenVPN) completamente funcional que puede utilizar para conectarse de una manera segura a su red domestica y acceder a archivos compartidos almacenados en su red.

Falta decir a los clientes donde encontrar el servidor, como conectar, etc. Hemos creado diferentes claves de cliente para cada uno de los dispositivos que desea conceder acceso VPN. Para no generar un nuevo archivo de configuracion para cada cliente a partir de cero, vamos a utilizar un ingenioso guion escrito por ERIC JDOIN del instituto SANS. Lo que hara este script, es generar un archivo para cada cliente por nosotros.

Lo primero es crear un archivo de texto en el que los ajustes por defecto se pueden leer, se llamará default.txt y está localizado dentro de keys:

No se confunda yo siempre utilizo minúsculas, por tanto el nombre del archivo al que se hace refencia en el script MakeOpenVPN.sh "default.txt" deberá cambiarlo:

DEFAULT="Default.txt" por
DEFAULT="default.txt"

# nano /etc/openvpn/easy-rsa/keys/default.txt
##########
client
dev tun
proto udp
remote IPPUBLICA 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 1
mute 20
#############

su ip pública es información privada que no debería compartir. Si usted no tiene IP pública debera utilizar un servicio de sistema dinámico de nombres de dominio (DDNS) y ejecutar dhclient, (si utilza no-ip no necesita ddclient), en raspberry pi para actualizar su registro DDNS de forma automática.

Un script escrito por Eric Jodoin corriendo desde un archivo shell ejecutable, automatiza las tareas incluidas en este caso. Puede descargarlo desde este enlace proporcionado por Lauren Orsini:

https://gist.github.com/laurenorsini/10013430

# nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh
copiar, pegar y guardar

Haciendo el script ejecutable solo para root:
# cd /etc/openvpn/easy-rsa/keys/
# chmod 700 MakeOVPN.sh

Por último, ejecute el script:
# ./MakeOVPN.sh

A medida que el script se ejecuta le preguntará el nombre de los clientes existentes para los que generó claves con anterioridad. Si todo ha ido bien debería aparecer una línea como esta:

Done! client1.ovpn Successfully Created.

Repita este paso para cada cliente existente.

Ahora conecte a la raspberry pi, copie los archivos clientes al directorio /home/pi/ y luego transfiera estos archivos a su ordenador vía scp.

# cd /etc/openvpn/easy-rsa/keys
# mkdir /home/pi/openvpn-keys
# cp *.ovpn /home/pi/openvpn-keys/
# ls /home/pi/openvpn-keys/
client1.ovpn  client2.ovpn  client3.ovpn  client4.ovpn



Finalmente envíe un archivo *.ovpn a cada cliente para conectarse a la VPN (OpenVPN).

Android utiliza OpenVPN Connect, los binarios se instalan a traves de OpenVPN Installer:





Un cliente Ipad se conecta utlizando OpenVPNConnect

Conectar remota SSH desde Android con la app ConnectBot:

Unix es genial!.