Páginas

jueves, 26 de octubre de 2023

NFSv4 FreeBSD 13.2

NFSv4 - NFS Version 4 Protocol FreeBSD 13.2

Como administrador de un servidor NFS, puede configurarlo para que sólo admita NFSv4, lo que minimiza el número de puertos abiertos y servicios en ejecución en el sistema.

Opcionalmente, también puede deshabilitar la escucha de las llamadas de protocolo RPCBIND, MOUNT, y NSM, que no son necesarias en el caso de sólo NFSv4.

En este momento, es posible habilitar NFSv3 y/o NFSv4 sobre TCP, pero no NFSv3 sobre UDP, de todas maneras, NFSv3 sobre UDP está en desuso. Esto significa que la opción "-u" No se puede especificar para nfs_server_flags en el archivo /etc/rc.conf.


sharenfs=off|on
Controla si el sistema de archivos se comparte a través de NFS y que acciones van a ser utilziadas. Un sistema de archivos con una sharenfs=off es administrado con el comando exportfs y entradas en el archivo /etc/exports. Por ejemplo
zfs get sharenfs zroot/usr/backup/dellhome
NAME                       PROPERTY  VALUE     SOURCE
zroot/usr/backup/dellhome  sharenfs  off       local

El archivo exports especifica puntos de montaje remotos para el protocolo NFS. Cada linea especifica el punto de montaje e indicadores de exportacion dentro de un sistema de archivos del servidor local o la raiz del arbol NFSv4 para uno o mas hosts.

En el servidor NFSv4 agregamos a /etc/rc.conf a través de sysrc (editar de forma segura los archivos rc del sistema)


sysrc nfs_server_enable=YES
sysrc nfs_server_only=YES
sysrc nfsv4_server_only=YES

Utilizamos el archivo /etc/hosts como DNS


...
192.168.88.160		tormenta
192.168.88.51		solaris
...

Interfaces y rutas de red - servidor NFSv4


tormenta: # route get 0
   route to: default
destination: default
       mask: default
    gateway: 192.168.88.1
        fib: 0
  interface: re0
      flags: <UP,GATEWAY,DONE,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500         1         0 
         
# netstat -Winf inet
Name    Mtu Network            Address          Ipkts Ierrs Idrop    Opkts Oerrs  Coll
re0       - 192.168.88.0/24    192.168.88.160   14571     -     -    15956     -     -
lo0       - 127.0.0.0/8        127.0.0.1            0     -     -        0     -     -

Archivo de ejemplo /etc/exports


tormenta: # cat /etc/exports
V4: /usr/backup 
/usr/backup/dellhome -alldirs,quiet -maproot=root -network=192.168.88.0/24
/usr/backup/poolrecovery -alldirs,quiet -maproot=root -network=192.168.88.0/24
/usr/backup/docs -alldirs,quiet -maproot=root -network=192.168.88.0/24
/usr/backup/development -alldirs,quiet -maproot=root -network=192.168.88.0/24

Configurar clientes FreeBSD


Colocaremos el mismo contenido en el archivo /etc/hosts que en el servidor.


...
192.168.88.160		tormenta
192.168.88.51		solaris
...

Para que el servicion nfs client se inicie con el sistema


solaris:~ # sysrc nfs_client_enable=YES

Iniciar el servicio


solaris:~ # service nfsclient start
NFS access cache time=60

# nc -v tormenta 2049
  Connection to tormenta 2049 port [tcp/nfsd] succeeded!

Montar un directorio compartido en el cliente


solaris:~ # mkdir /mids4
# mount -o nfsv4 tormenta:/docs /mihs4

Archivo /etc/fstab para un montaje permanente y automático


# Device	Mountpoint	FStype	Options		Dump	Pass#
/dev/nvd0p1	/boot/efi	msdosfs	rw		2	2
/dev/nvd0p3	 none	  	swap	sw		0	0
# Added by auto-admin from /usr/local/sbin/auto-add-fdesc-mount
fdesc		/dev/fd			fdescfs	rw		0	0
# End auto-admin addition
# Added by auto-admin from desktop-installer
proc			/proc		procfs	rw		0	0
# End auto-admin addition
# nfsv4 shared
tormenta:/poolrecovery     /misc4    nfs     rw,nfsv4,late    0  0
tormenta:/development      /mixs4    nfs     ro,nfsv4,late    0  0
tormenta:/docs             /mids4    nfs     rw,nfsv4,late    0  0
tormenta:/dellhome 	   /mihs4    nfs     rw,nfsv4,late    0  0

Vamos a comprobar que podemos escribir en el directorio


 cd /misc4
 vim script-while-files.sh 
#!/bin/sh
i=0
while [ $i -le 10 ]
do
	 echo 'creando archivos con contenido'
	i=$(($i+1))
	echo Hola > "file$i.txt"
done
:wq

 chmod +x script-while-files.sh
 ./script-while-files.sh
 ls
 file3.txt             file8.txt
file1.txt             file4.txt             file9.txt
file10.txt            file5.txt             script-while-files.sh
file11.txt            file6.txt
file2.txt             file7.txt

Puertos a la escucha (en el servidor)


tormenta:~ # sockstat -l4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
root     sshd       1248  5  tcp4   *:22                  *:*
root     nfsd       1218  5  tcp4   *:2049                *:*

solaris:~ % mount


...
map -hosts on /net (autofs)
tormenta:/poolrecovery on /misc4 (nfs, nfsv4acls)
tormenta:/dellhome on /mixs4 (nfs, read-only, nfsv4acls)
tormenta:/docs on /mids4 (nfs, nfsv4acls)
tormenta:/dellhome on /mihs4 (nfs, nfsv4acls)
...

Firewall PF

# pfctl -f /etc/pf.conf


scrub in all no-df max-mss 1440 fragment reassemble
block drop in on ! re0 inet from 192.168.88.0/24 to any
block drop in inet from 192.168.88.160 to any
block drop in on re0 from  to any
pass in on re0 from  to any flags S/SA keep state
pass out on egress proto tcp all flags S/SA modulate state
pass in on re0 proto tcp from  to any port = nfsd flags S/SA keep state
pass out on egress proto udp all keep state
pass out on egress proto icmp all keep state
pass in log on re0 inet proto tcp from 192.168.88.0/24 to any port = ssh flags S/SA keep state
FreeBSD es genial!.

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 febrero de 2023

FreeBSD Instalar Wordpress

Instalar Wordpress en la jail

1.- Creación de la Jail www con Bastille

2.- Instalar Apache MySQL PHP

3.- Instalar Wordpress. Activar rdr en Firewall PF

Creación de la base de datos para Wordpress


bastille console www

root@www: #

Instalación de Wordpress

Inicicar sesión en mysql como usuario root


root@www: # mysql -h 127.0.0.1 -u root -p
Password:

root@127.0.0.1 [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'su_password';
Query OK, 0 rows affected (0.01 sec)

root@127.0.0.1 [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Crear un usuario, una base de datos para Wordpress y una contraseña, otorgar los derechos en la base de datos al usuario creado.


CREATE DATABASE db_wp;
Query OK, 1 row affected (0.00 sec)

USE db_wp;

CREATE USER 'db_wp'@'localhost' IDENTIFIED BY '57rMvRbev&5o$eE*sV';

GRANT ALL PRIVILEGES ON db_wp.* TO 'db_wp'@'localhost' IDENTIFIED BY \
'57rMvRbev&5o$eE*sV';
Query OK, 0 rows affected (0.00 sec)

Recargar las cachés internas de MySQL con el comando FLUSH


FLUSH PRIVILEGES;

Salir de mysql


root@localhost [(none)]> exit
Bye
root@www: #

Descargar y descomprimir la última version de Wordpress


root@www: # fetch https://wordpress.org/latest.tar.gz

Descomprimir el archivo


tar -zxvf latest.tar.gz

Entrar en el directorio de wordpress y copiar wp-config-sample.php a wp-config.php


cd wordpress
cp wp-config-sample.php wp-config.php

Edite el archivo wp-config.php e introduzca DB_NAME, DB_USER y DB_PASSWORD


 vim wp-config.php

define( 'DB_NAME', 'db_wp' );^M
^M
/** Database username */^M
define( 'DB_USER', 'db_wp' );^M
^M
/** Database password */^M
define( 'DB_PASSWORD', '57rMvRbev&5o$eE*sV' );^M

Reiniciar mysql-server


root@www: # service mysql-server restart

Mover el contenido del directorio de Wordpress a la ubicación reservada a los sitios de FreeBSD, /usr/local/www/apache24/data


 cp -r ~/wordpress/* /usr/local/www/apache24/data

Cambiar el propiepario y grupo de los archivos a www


 chown -R www:www /usr/local/www/apache24/data

Llegados a este punto, vamos a crear el archivo rdr.conf para hacer las reglas de redirección de puertos persistentes. Las reglas que se encuentran en este archivo (una por línea) se cargarán para la jail cada vez que se inicie, y se borran automáticamente cuando se detenga la jail.


cd /usr/local/bastille/jails/www
fstab     jail.conf     root

vim .conf
 tcp 80 80
 tcp 443 443
ls /usr/local/bastille/jails/www/
fstab     jails.conf    rdr.conf    root
FIGURA rdr.conf

Cambios en el archivo pf.conf

rdr pass inet proto tcp from any to any port {80, 443} -> $www_ip.
Redirigir, dejar pasar todo el tráfico TCP de cualquier origen, que tenga como destino los puertos 80 y 443, a la IP de la jail, utilizando la macro $www_ip que define la dirección IP 10.10.10.2

Firewall PF


carlos@solaris:~ $ cat /etc/pf.conf
#
ext_if="em0"
www_ip="10.10.10.2"

set skip on lo
set block-policy return
scrub in on $ext_if all fragment reassemble

table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"
rdr pass inet proto tcp from any to any port {80, 443} -> $www_ip

block in all
pass out quick keep state
antispoof for $ext_if inet

pass in inet proto tcp from any to any port ssh flags S/SA keep state

Reiniciar la jail


 bastille restart www

Apuntar Firefox a la dirección IP o nombre de dominio para proceder a la instalación de Wordpress


http://10.10.10.2:80/wp/wp-admin/install.php

Sólo falta instalar Wordpress usando el asistente de instalación y un nombre de usuario y una contraseña para la administración del sitio web.


FreeBSD es genial!.