Páginas

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

viernes, 6 de febrero de 2026

Alternativas cuando el Router no Permite el Reenvío de Puertos

Bibliografía:

Tailscale

En la página de Tailscale "Regístrese con su proveedor de identidad", inicie sesión con una cuenta de proveedor de identidad de inicio de sesión único (SSO).

como habilitar acceso remoto a un servidor local (FreeBSD 14.3), que está detrás de un NAT (una red doméstica donde el ISP no permite abrir puertos), sin necesidad de un dominio publico.

Tailscale, un servicio P2P basado en wireguard que implementa NAT traversal para crear una red VPN segura y privada. Permite conectar dispositivos de forma directa (P2P) cuando es posible, o a través de relays (DEP servers) si el NAT es estricto. No expone puertos públicos ni requiere configuraciones complejas en routers. Tailscale es gratuito para uso personal (hasta 3 usuarios y 100 dispositivos).

Tailscale no necesita dominio público porque el acceso se realiza a través de IPs privadas de Tailscale (en el rango 100.64.0.0/10 conocidas como CGNAT) o nombre de host automáticos en tu "tailnet" (red privada de Tailscale). 

Instalación, configuración, NAT traversal y acceso a servicios locales. Asumido que tiene acceso root en el servidor FreeBSD 14.3 y que el sistema está actualizado (pkg update && pkg upgrade).

Wireguard es el protocolo subyacente, un VPN moderno, ligero y seguro que usa criptografía de curva elíptica para túneles cifrados.

Nat Travesal. Tailscale utiliza técnicas como STUN (para descubrir IPs públicas y puertos), ICE (para negociar conexiones P2P) y relays DERP (servidores de Tailscale que actúan como intermediariso si el P2P falla debido a NAT simétrico o firewalls estrictos).

Tailnet. Su red privada virtual. Todos los dispositivos autenticados en su cuenta forman parte de ella.

Servicios locales. Para acceder a un servicio en el servidor (por ejemplo web en 80), el cliente se conecta a la IP de Tailscale + puerto, como si estuvieran en la misma LAN.

Dispositivo cliente (PC, teléfono móvil, etc.) desde donde se accederá instalando Tailscale (disponible para Windows, macOS, FreeBSD, iOS, Android, Linux).

Firewall en FreeBSD. Si usa PF (Packet Filter), asegurarse de que permita tráfico saliente (por defecto lo hace). No necesita reglas entrantes especiales para Tailscale, ya que utiliza la interfaz tailscale0.

Instalar Tailscale en el servidor local (FreeBSD 14.3)

pkg install tailscale

Esto instala tailscaled (el demonio) y tailscale (la CLI). Dependencias como Wireguard se instalan automáticamente.

Habilitar el servicio para que inicie al inicio

sysrc tailscaled_enable="YES"

Iniciar el servicio

service tailscaled start

Comprobar el estado

service tailscaled status

Autenticar el servidor en tu tailnet

tailscale up

Esto genera un URL de autenticación (ej. https://login.tailscale.com/a/65831eb3ddff0). Copiar y pegar en un navegador en cualquier dispositivo. Iniciar sesión con su cuenta de Tailscale para aprobar el dispositivo. Una vez aprobado, el comando completará y el servidor se unirá a su tailnet.

Recomendación de mantenimiento


Nunca vuelva a ejecutar tailscale up sin --hostname o sin haber hecho tailscale logout antes. Uso correcto:

tailscale logout
tailscale up --hostname=tornado
tailscale status
100.115.10.68   tormenta  nombreusuario@  freebsd

Se muestra el servidor con una IP de Tailscale y estado online

ifconfig tailscale0 para la interfaz VPN.

ifconfig tailscale0

tailscale0: flags=1008043< <UP,BROADCAST,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 1280
	options=4080000< <LINKSTATE,MEXTPG>
	inet 100.115.10.68 netmask 0xffffffff broadcast 100.115.10.68
	inet6 fd7a:115c:a1e0::cd01:687 prefixlen 48
	groups: tun
	nd6 options=101 <PERFORMNUD,NO_DAD>
	Opened by PID 27732
You are about to connect the device tormenta to the nombreususario@gmail.com tailnet.

Public key 		nodekey:af18fa705771d20c28856057767cafc...

Hostname    		tormenta

Operating system	freebsd (14.3-RELEASE-p7)

Tailscale version	1.94.1

tormenta		100.115.10.68

No es necesario configurar nada extra en su router o firewall.

Exponer Servicios Locales

Por defecto, Tailscale permite acceso a cualquer puerto en la IP de Tailscale del servidor, siempre que el servicio escuche en 0.0.0.0 o la interfaz tailscale0

Ejemplo para un servidor web (por ejemplo, Nginx en el puerto 80) se configura para escuchar en 0.0.0.0:80

Archivo de configuración /usr/local/etc/nginx/nginx.conf

---
server {
        listen       8000; #poudriere
        server_name  localhost;
        root /usr/local/share/poudriere/html;

        location /data {
            alias  /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }

        location /packages {
                root /usr/local/poudriere/data;
                autoindex on;
        }

        location / {
                index index.html index.htm;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
}

# Servidor web principal en el puerto 80
server {
        listen 0.0.0.0:80; #nginx
        server_name localhost;

        root /usr/local/www/nginx;
        index index.html index.htm;

        # Paginas de error para el servidor principal
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }

}
---

Si se quiere acceder a toda la subred local (otros dispositivos en la red 192.168.88.0/24), se tiene que habilitar subnet routes:

tailscale up --advertise-routes=192.168.88.0/24. Posteriormenta se aprueba en el 
admin console.

Seguridad adicional

Usar ACLs (Access Control Lists) en el admin console para restringir accesos (por ejemplo, solo ciertos usuarios pueden acceder al servidor).

Habilitar MagicDNS. En el admin console, ir a DNS > Enable MagicDNS. Para usar nombre como fsb143 en lugar de IPs.

Para headless (sin interacción): Usar pre-auth keys

Acceso desde Internet (lado cliente)

Instalar Tailscale en el dispositivo
Ejecutar tailscale up y autenticar con el mismo URL/login utilizado para el servidor 
(unirse al mismo tailnet)

Una vez conectado acceder al servidor

Web:
abrir http://100.115.10.68:80 (reemplazar con la IP de Tailscale del servidor 
obtenida de tailscale status). Bienvenido al servidor FreeBSD nginx! Si ve esta pagina, el servidor web nginx se instalo correctamente y funciona
correctamente. Se requiere configuracion adicional. Para obtener documentacion y soporte en linea, consulte nginx.org. Gracias por usar nginx.
FreeBSD es genial!.

viernes, 12 de diciembre de 2025

Unbound DNS Local en FreeBSD 14.3

Configurar Unbound FreeBSD 14.3

Servidor tormenta y cliente solaris /etc/hosts

...
192.168.88.160		tormenta.local.com  tormenta
192.168.88.51		solaris.local.com  solaris
...

Archivo de configuracion /usr/local/etc/unbound/unbound.conf

server:
# Interfaces y puertos
interface: 127.0.0.1       # usar unbound para la resolucion DNS
interface: 192.168.88.160
port: 53
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes

# Seguridad y acceso
access-control: 127.0.0.0/8 allow
access-control: 192.168.88.0/24 allow
access-control: 0.0.0.0/0 refuse

# Cache y rendimiento
cache-min-ttl: 3600
cache-max-ttl: 86400
prefetch: yes
prefetch-key: yes

# Privacidad
hide-identity: yes
hide-version: yes
identity: "DNS Server"
version: " "

# Validación DNSSEC - verificar autenticidad de las respuestas
auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"
val-clean-additional: yes

# Archivos de zona local
include: /usr/local/etc/unbound/local-zone.conf

# Control remoto 
include: /usr/local/etc/unbound/remote-control.conf

# Redirección de consultas
forward-zone:
name: "."
forward-addr: 9.9.9.9 # Quad9 DNS
forward-addr: 8.8.8.8 # Google DNS
carlos@tormenta:~ % cat /usr/local/etc/unbound/local-zone.conf 
# Zona local local.com
local-zone: "local.com." static
local-data: "tormenta.local.com. IN A 192.168.88.160"
local-data: "solaris.local.com. IN A 192.168.88.51"
local-data: "ns.local.com. IN A 192.168.88.160"
local-data: "local.com. IN NS ns.local.com."
carlos@tormenta:~ % cat /usr/local/etc/unbound/remote-control.conf 
# Habilitar interfaz de control
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8953
control-use-cert: no
sysrc unbound_enable="YES"
service unbound start
Archivo /etc/resolv.conf (tormenta)
cat /etc/resolv.conf
# Generated by resolvconf
nameserver 127.0.0.1      # 
nameserver 192.168.88.160
domain local.com
search local.com

Archivo /etc/resolv.conf (solaris)

nameserver 192.168.88.160
domain local.com
search local.com

Consultas DNS desde el cliente (solaris.local.com)

dig @tormenta.local.com freebsd.org

; <<>> DiG 9.20.16 <<>> @tormenta.local.com freebsd.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56301
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;freebsd.org.			IN	A

;; ANSWER SECTION:
freebsd.org.		3600	IN	A	96.47.72.84

;; Query time: 58 msec
;; SERVER: 192.168.88.160#53(tormenta.local.com) (UDP)
;; WHEN: Wed Dec 10 14:12:38 CET 2025
;; MSG SIZE  rcvd: 56

Desde el servidor

dig freebsd.org @127.0.0.1
carlos@tormenta:~ % dig freebsd.org @127.0.0.1

; <<>> DiG 9.20.16 <<>> freebsd.org @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38422
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;freebsd.org.			IN	A

;; ANSWER SECTION:
freebsd.org.		3426	IN	A	96.47.72.84

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Fri Dec 12 16:01:03 CET 2025
;; MSG SIZE  rcvd: 56
FreeBSD es genial!.

sábado, 6 de diciembre de 2025

FreeBSD 14.3 Cortafuegos PF

Sintaxis actualizada (FreeBSD 14 usa PF de OpenBSD 6.9–7.0 aproximadamente, hay cambios importantes).

# ====================== MACROS ======================
lan_if   = "re0"
zt_if    = "zt1ocu1pr8e2sac"
lan_net  = "192.168.88.0/24"
zt_net   = "192.168.192.0/24"
my_zt_ip = "192.168.192.204"
lan_ip   = "192.168.88.160"      # pon aquí la IP real de re0 si es fija

ssh_port     = "{ 22 }"
nfs_ports_tcp = "{ 111, 892, 2049 }"
nfs_ports_udp = "{ 111, 892 }"

# ====================== OPCIONES GLOBALES ======================
set block-policy return         # responde ICMP/TCP-RST a paquetes bloqueados
set ruleset-optimization none   # en FreeBSD 14 no usa "basic" ni "high-latency"
set skip on lo0
set skip on $zt_if              # ZeroTier ya tiene su propio cortafuegos interno

# Normalización moderna (recomendado)
match in all scrub (no-df random-id max-mss 1440)

# ====================== TABLAS ======================
table <bruteforce> persist       # aquí meterá sshguard, pf-badhost, etc.

# ====================== TRÁFICO CONFIABLE (LAN) =======================
pass in quick on $lan_if from $lan_net to $lan_ip keep state

# =================== EXCEPCIÓN PARA EL TÚNEL WIREGUARD ================
# Wireguard: handshake y todo el trafico dentro del tunel
pass in quick on $lan_if proto udp from 192.168.88.51 to 192.168.88.160 \
port 51820 keep state
pass in quick on wg0 keep state  # <-- esta es la importante

# ====================== REGLAS DE PROTECCIÓN BÁSICA ===================
# Anti-spoofing + bogons (bloqueo rápido)
block in quick on ! $lan_if from $lan_net to any
block in quick on ! $lan_if from 192.168.0.0/16 to any
block in quick on ! $lan_if from 172.16.0.0/12 to any
block in quick on ! $lan_if from 10.0.0.0/8 to any

block in quick from any to { 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, ::/128, 0.0.0.0/8 }

# Bloqueo rápido de hosts en lista negra
block in quick from <bruteforce>

# ====================== LOOPBACK ======================
pass quick on lo0 all

# ====================== TRÁFICO SALIENTE (stateful) ======================
pass out quick inet keep state

# ====================== ICMP ======================
pass in on $lan_if inet proto icmp from $lan_net to $lan_ip icmp-type echoreq \
keep state
pass out on $lan_if inet proto icmp from $lan_ip to $lan_net icmp-type echorep \
keep state

# ====================== SSH CON PROTECCIÓN ======================
# Desde LAN (sin límite)
pass in on $lan_if proto tcp from $lan_net to $lan_ip port $ssh_port flags \
S/SFRA keep state

# Desde ZeroTier (con límite de tasa para evitar brute-force)
pass in on $zt_if proto tcp from $zt_net to $my_zt_ip port $ssh_port \
    flags S/SFRA keep state \
    (max-src-conn-rate 15/5, overload <bruteforce> flush global)

# ====================== DNS (Unbound local) ======================
pass quick on $lan_if proto { tcp udp } from $lan_net to $lan_ip port 53

# ====================== NTP cliente ======================
pass out proto udp from any to port 123 keep state

# ====================== NFS (solo LAN) ======================
pass in on $lan_if proto tcp from $lan_net to $lan_ip port $nfs_ports_tcp \
    flags S/SFRA keep state
pass in on $lan_if proto udp from $lan_net to $lan_ip port $nfs_ports_udp \
    keep state

# NFSv4 callback channel (solo desde clientes NFS de la LAN)
pass in on $lan_if proto tcp from $lan_net to $lan_ip port 3000:4000 \
    flags S/SFRA keep state

# ====================== ZeroTier (puerto de control) ======================
pass in quick on $zt_if proto udp from any to any port 9993

# ====================== BLOQUEO FINAL (por defecto) ======================
block log all

FreeBSD es genial!.

martes, 26 de agosto de 2025

Poudriere en FreeBSD ZFS 14.2

Instalación y configuración de poudriere FreeBSD 14.2 ZFS


Referencias bibliográficas:

https://freebsdfoundation.org/wp-content/uploads/2023/11/reushling_poudrier.pdf
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-poudriere-build-system-to-create-packages-for-your-freebsd-servers


Intel core i5-8350U 1.7 GHz
Procesador 4 cores
Procesador 8 hilos
RAM 16 GB
SWAP 16 GB
NVMe Pcie 4.0

ZPOOL=zroot
ZROOTFS=/poudriere
BASEFS=/usr/local/poudriere

FreeBSD 14.2-RELEASE (amd64) instalado El dataset raíz de poudriere estará en zroot/poudriere y se montará en /usr/local/poudriere

Paquetes mínimos

pkg install -y poudriere \
	       git-lite
	       vim
	       screen
	       curl
	       ca_root_nss

Crear datasets ZFS.

Ventajas: posibilidad de hacer snapshots, rollback y compression por separado

zfs create -o mountpoint=/usr/local/poudriere -o compression=lz4 zroot/poudriere
zfs create zroot/poudriere/jails
zfs create zroot/poudriere/ports
zfs create zroot/poudriere/data
zfs create zroot/poudriere/data/packages
zfs create zroot/poudriere/data/logs

Archivo /usr/local/etc/poudriere.conf

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_TMPFS="wrkdir data localbase"
DISTFILES_CACHE=/usr/ports/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
CCACHE_DIR=/var/cache/ccache
ALLOW_MAKE_JOBS_PACKAGES="llvm* rust firefox gcc*"
PARALLEL_JOBS=2 # 2 hilos logicos
KEEP_OLD_PACKAGES=yes
MAX_JOBS=2
NOHANG_TIME=7200
NOCOLOR=no

Descargar y crear la jail base (14.2-RELEASE)

poudriere jail -c -j 142amd64 -v 14.2-RELEASE -a amd64

Esto descarga sets.txz y crea un dataset zroot/poudriere/jails/142amd64

Crear de nuevo arbol de puertos (quarterly)

poudriere ports -c -p default -m git+https -U \
https://git.FreeBSD.org/ports.git -B 2026Q1     

poudriere ports -l

PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2025-08-24 18:50:19 /usr/local/poudriere/ports/default

poudriere jails -l

JAILNAME VERSION         ARCH  METHOD TIMESTAMP           PATH
142amd64 14.2-RELEASE-p5 amd64 http   2025-08-24 18:42:25 /usr/local/poudriere/jails/142amd64

Ajustes globales

Archivo /usr/local/etc/poudriere.d/142amd64-make.conf

# Opciones generales para la jaula 142amd64
DEFAULT_VERSIONS+=ssh=openssl
OPTIONS_UNSET+=DOCS NLS EXAMPLES IPV6
DISABLE_LICENSES=yes

Crear listas de paquetes

Archivo /usr/local/etc/poudriere.d/port-list.txt

security/sudo

Archivo de configuracion de /var/cache/ccache/ccache.conf

max_size = 5.0G
cache_dir = /var/cache/ccache
compression = true
compression_level = 1
sloppiness = file_stat_matches, time_macros, include_file_mtime
hash_dir = false
run_second_cpp = false

Primer bulk build

poudriere bulk -j 142amd64 -p default -f /usr/local/etc/poudriere.d/port-list.txt

Servidor de paquetes local (nginx)

pkg install nginx
sysrc nginx_enable=YES

Archivo de configuración de nginx

$ sed -e '/^[ ]*#/d' -e '/^$/d' /usr/local/etc/nginx/nginx.conf
    
    server {
        listen       80 default;
        server_name  localhost;
	    root /usr/local/share/poudriere/html;
        
        location /data {
            alias  /usr/local/poudriere/data/logs/bulk;
            autoindex on;
        }
	
	location /packages {
		root /usr/local/poudriere/data;
		autoindex on;
	}
}

Configurar pkg en la máquina anfitriona

mkdir /usr/local/etc/pkg/repos

Archivo /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Generar clave (una sola vez)

Crear el directorio donde se guardarán las claves

mkdir -p /usr/local/etc/poudriere

Generar la clave privada (4096 bits)

openssl genrsa -out /usr/local/etc/poudriere/poudriere.key 4096
chmod 600 /usr/local/etc/poudriere/poudriere.key

Extraer la clave pública

openssl rsa -in /usr/local/etc/poudriere/poudriere.key -pubout -out \
/usr/local/etc/poudriere/poudriere.pub
chmod 644 /usr/local/etc/poudriere/poudriere.pub

Asegúrarse de que poudiere la use al firmar.

Añadir esta línea al archivo /usr/local/etc/poudriere.conf

PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere/poudriere.key

El archivo /usr/local/etc/poudriere.conf queda así:

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
POUDRIERE_DATA=${BASEFS}/data
USE_TMPFS=all # usa RAM + swap para las builds
DISTFILES_CACHE=/usr/ports/distfiles
CHECK_CHANGED_OPTIONS=verbose
CHECK_CHANGED_DEPS=yes
ALLOW_MAKE_JOBS_PACKAGES="pkg ccache py* rust llvm*"
PARALLEL_JOBS=8 # 8 hilos logicos
PKG_REPO_SIGNING_KEY=/usr/local/etc/poudriere/poudriere.key

Firmar el repositorio con la clave nueva

poudriere bulk -j 142amd64 -p default -f /usr/local/etc/poudriere.d/port-list.txt

Monitorear durante la compilación


poudriere status

SET PORTS JAIL BUILD STATUS  QUEUE BUILT FAIL SKIP IGNORE FETCH REMAIN TIME     LOGS
- default 142amd64 2025-08-26_08h57m21s parallel_build  3  0  0  0 0 0  3 00:00:22 \
/usr/local/poudriere/data/logs/bulk/142amd64-default/2025-08-26_08h57m21s

poudriere jail -l

JAILNAME VERSION         ARCH  METHOD TIMESTAMP           PATH
142amd64 14.2-RELEASE-p5 amd64 http   2025-08-25 23:10:54 /usr/local/poudriere/jails/142amd64

poudriere ports -l

PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2025-08-26 08:55:04 /usr/local/poudriere/ports/default
local     null      2025-08-24 16:41:27 /usr/local/poudriere/ports/default
root@solaris:/usr/local/etc/pkg/repos# poudriere 
FreeBSD.conf        packagesite.yaml    
poudriere.conf     

Logs en tiempo real

poudriere log -f -j 142amd64 -p default 

Configurar pkg en los clientes, (o en la misma máquina), para que use la clave pública

mkdir -p /usr/local/etc/pkg/repos/
$ cat /usr/local/etc/pkg/repos/poudriere.conf
poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Tras esto, pkg install validará las firmas sin errores.

Comandos útiles de rescate. Limpiar paquetes obsoletos

poudriere pkgclean -j 142amd64 -p default -f port-list.txt

Destruir jail y volver a crear (por ejemplo, tras nueva RELEASE)

poudriere jail -d -j 142amd64
poudriere jail -c -j 142amd64 -v 14.3-RELEASE -a amd64

Actualizar paquetes

pkg update -f
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%   10 MiB  10.4MB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 35669 packages processed.
Updating poudriere repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%    2 KiB   2.0kB/s    00:01    
Processing entries: 100%
poudriere repository update completed. 3 packages processed.
All repositories are up to date.
pkg upgrade
curl -I http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Tue, 26 Aug 2025 12:07:38 GMT
Content-Type: text/html
Content-Length: 13036
Last-Modified: Sat, 09 Aug 2025 09:58:45 GMT
Connection: keep-alive
ETag: "68971bd5-32ec"
Accept-Ranges: bytes

Actualizar el árbol existente (lo mantiene, solo descarga nuevos commits)

poudriere ports -u -p default

Listo para compilar y servir paquetes locales con poudriere en FreeBSD 14.2


Opciones

Poudriere no guarda automáticamente las elecciones que se hacen al ejecutar poudriere options, pero le indicamos con la bandera -z myset que lo guarde.

Ejecutar una vez poudriere options para el port que quiera

Las opciones seleccionadas se guardan en /usr/local/etc/poudriere.d/myset-options

poudriere options -z myset -c security/sudo

el flag -c fuerza que aparezca el menú incluso si ya existen opciones guardadas.


Un directorio "myset-options" es generado automaticamente por make config

/usr/local/etc/poudriere.d/myset-options/

y dentro del directorio los directorios categoria_paquete

ls /usr/local/etc/poudriere.d/myset-options
converters_libiconv/ devel_autoconf/      devel_m4/            lang_tcl86/
databases_sqlite3/   devel_kyua/          lang_lua54/          security_sudo/
devel_atf/           devel_lutok/         lang_perl5.42/

y dentro de esos directorio un archivo llamado options contiene las opciones de configuración.


cat /usr/local/etc/poudriere.d/myset-options/security_sudo/options
# This file is auto-generated by 'make config'.
# Options for sudo-1.9.17p2
_OPTIONS_READ=sudo-1.9.17p2
_FILE_COMPLETE_OPTIONS_LIST=AUDIT DISABLE_AUTH DISABLE_ROOT_SUDO DOCS EXAMPLES \
INSULTS LDAP NLS NOARGS_SHELL OPIE PAM PYTHON SSL GSSAPI_BASE GSSAPI_HEIMDAL \
GSSAPI_MIT
OPTIONS_FILE_SET+=AUDIT
OPTIONS_FILE_UNSET+=DISABLE_AUTH
OPTIONS_FILE_UNSET+=DISABLE_ROOT_SUDO
OPTIONS_FILE_UNSET+=DOCS
OPTIONS_FILE_UNSET+=EXAMPLES
OPTIONS_FILE_SET+=INSULTS
OPTIONS_FILE_UNSET+=LDAP
OPTIONS_FILE_UNSET+=NLS
OPTIONS_FILE_UNSET+=NOARGS_SHELL
OPTIONS_FILE_UNSET+=OPIE
OPTIONS_FILE_SET+=PAM
OPTIONS_FILE_UNSET+=PYTHON
OPTIONS_FILE_SET+=SSL
OPTIONS_FILE_UNSET+=GSSAPI_BASE
OPTIONS_FILE_UNSET+=GSSAPI_HEIMDAL
OPTIONS_FILE_UNSET+=GSSAPI_MIT

...

Compilar paquetes

poudriere bulk -j 142amd64 -p default -z myset -f /usr/local/etc/poudriere.d/port-list.txt

Para que pkg use los paquetes que acaba de compilar poudriere necesitas:
- Que poudriere haya terminado de firmar y publicar los paquetes.
- Un repositorio local servido por nginx (u otro)
- Un fichero /usr/local/etc/pkg/repos/poudriere.conf correctamente escrito

fichero /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  # url = "file:///usr/local/poudriere/data/packages/142amd64-default",
  enabled = yes,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}
root@solaris:/usr/local/poudriere/data/packages/142amd64-default/All# pkg repo .
Creating repository in .: 100%
Packing files for repository: 100%
root@solaris:/usr/local/poudriere/data/packages/142amd64-default/All# ls
data.pkg            meta.conf           pkg-2.2.2.pkg
data.tzst           packagesite.pkg     pkgconf-2.4.3,1.pkg
meta                packagesite.tzst    sudo-1.9.17p2.pkg

Desactivar el repositorio oficial (opcional)

#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
 url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
# url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
 mirror_type: "srv",
 signature_type: "fingerprints",
 fingerprints: "/usr/share/keys/pkg",
 enabled: no
}

Otra opción. La prioridad define el orden en que se utilizan estos repositorios

Por defecto, se utiliza el repositorio upstream de FreeBSD.org. Pero como queremos que nuestros propios paquetes tengan precedencia, le daremos una prioridad más alta que cero para que use nuestro repositorio de paquetes primero.

Quedaría así:

#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
 url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
# url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
 mirror_type: "srv",
 signature_type: "fingerprints",
 fingerprints: "/usr/share/keys/pkg",
 enabled: yes
}

Archivo /usr/local/etc/pkg/repos/poudriere.conf

poudriere {
  url: "http://127.0.0.1/packages/142amd64-default/",
  # url = "file:///usr/local/poudriere/data/packages/142amd64-default",
  enabled = yes,
  priority: 23,
  mirror_type: "http",
  signature_type: "pubkey",
  pubkey: "/usr/local/etc/poudriere/poudriere.pub",
}

Veamos en acción

 pkg update
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
Fetching meta.conf: 100%    179 B   0.2kB/s    00:01    
Fetching data.pkg: 100%    2 KiB   2.0kB/s    00:01    
Processing entries: 100%
poudriere repository update completed. 3 packages processed.
All repositories are up to date.
root@solaris:/usr/local/etc/pkg/repos# pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
poudriere repository is up to date.
All repositories are up to date.
Checking for upgrades (206 candidates): 100%
Processing candidates (206 candidates): 100%
The following 4 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	p5-Crypt-URandom: 0.54 [FreeBSD]

Installed packages to be UPGRADED:
	nss: 3.115 -> 3.115.1 [FreeBSD]
	p5-Authen-SASL: 2.18 -> 2.1900 [FreeBSD]
	perl5: 5.40.2_2 -> 5.40.3_2 [FreeBSD]

Number of packages to be installed: 1
Number of packages to be upgraded: 3

18 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/4] Fetching nss-3.115.1.pkg: 100%    2 MiB   2.3MB/s    00:01    
[2/4] Fetching p5-Crypt-URandom-0.54.pkg: 100%   17 KiB  17.6kB/s    00:01    
[3/4] Fetching perl5-5.40.3_2.pkg: 100%   16 MiB  16.4MB/s    00:01    
[4/4] Fetching p5-Authen-SASL-2.1900.pkg: 100%   44 KiB  44.7kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/6] Deinstalling p5-Authen-SASL-2.18...
[1/6] Deleting files for p5-Authen-SASL-2.18: 100%
[2/6] Deinstalling perl5-5.40.2_2...
[2/6] Deleting files for perl5-5.40.2_2: 100%
[3/6] Upgrading nss from 3.115 to 3.115.1...
[3/6] Extracting nss-3.115.1: 100%
[4/6] Installing perl5-5.40.3_2...
[4/6] Extracting perl5-5.40.3_2: 100%
[5/6] Installing p5-Crypt-URandom-0.54...
[5/6] Extracting p5-Crypt-URandom-0.54: 100%
[6/6] Installing p5-Authen-SASL-2.1900...
[6/6] Extracting p5-Authen-SASL-2.1900: 100%
tree /usr/local/poudriere/data/packages/
/usr/local/poudriere/data/packages/
└── 142amd64-default
    ├── All -> .latest/All
    ├── Latest -> .latest/Latest
    ├── data
    ├── data.pkg -> .latest/data.pkg
    ├── data.tzst -> .latest/data.tzst
    ├── logs -> .latest/logs
    ├── meta -> .latest/meta
    ├── meta.conf -> .latest/meta.conf
    ├── packagesite.pkg -> .latest/packagesite.pkg
    ├── packagesite.tzst -> .latest/packagesite.tzst
    └── packagesite.yaml

5 directories, 8 files

Instalar paquete desde repositorio local

pkg install sudo
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
Updating poudriere repository catalogue...
poudriere repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	sudo: 1.9.17p2 [poudriere]

Number of packages to be installed: 1

The process will require 2 MiB more space.

Proceed with this action? [y/N]: y
[1/1] Installing sudo-1.9.17p2...
[1/1] Extracting sudo-1.9.17p2: 100%
Comprobar security con INSULTS activado:
sudo vim /etc/rc.conf                 
Password:
Quizás si usaras más de dos dedos...
Password:
¡Este hombre no sabe cuándo está vencido! Tampoco sabe cuándo está ganando. 
No tiene... una especie de... aparato sensorial...
Password:
FreeBSD es genial!.

viernes, 26 de julio de 2024

Recursos Compartidos con Samba FreeBSD

Samba FreeBSD

SAMBA es un conjunto de programas originalmente creados por Andrew Tridgell y mantenidos en la actualizad por The SAMBA Team, bajo licencia Pública General GNU e implementado por sistemas basados en UNIX.

En el servidor

pkg install samba416
sysrc samba_server_enable="YES"

Crear conjunto de datos

zfs create zroot/usr/backup/dellhome
zfs create zroot/usr/backup/poolrecovery
zfs create zroot/usr/backup/publico
zfs create zroot/usr/backup/docs
zfs create zroot/usr/backup/codigo

El directorio público será propiedad del usuario y grupo nobody

chown nobody:nobody /usr/backup/publico

Archivo de configuracion

[global]
	unix charset 		= UTF-8
	workgroup 		= CORP
    	client min protocol 	= SMB3
    	server string 		= Samba Server Version %v en %L
	hosts allow 		= 127., 192.168.88., 10.10.10.
	netbios name 		= servidor
	security 		= user
    	passdb backend          = tdbsam
	load printers 		= no
    	domain master 		= yes
	guest account		= nobody
	printable		= no
	hide dot files		= yes
	log level		= 1 auth:5
	log file		= /var/log/samba/%m.log
	max log size 		= 10000
	deadtime 		= 60
	create mask 		= 0644
	directory mask 		= 0755
	map to guest 		= never
	wins support 		= yes 	 	 	
	interfaces 		= re0, 127.0.0.1, 192.168.88.160/24, 10.10.10.1/24
    bind interfaces only 	= yes 
	
[dellhome]
	comment		= FreeBSD
	path 		= /samba/dellhome
	public 		= no
	browseable 	= yes
	writeable 	= yes
	write list 	= carlos

[codigo]
	comment 	= Scripts
	path 		= /samba/codigo
	public 		= no
	read only 	= yes
	browseable 	= yes  	
	valid users 	= carlos
	write list 	= carlos

[poolrecovery]
	path 		= /samba/poolrecovery
	public 		= no
	writeable 	= yes
    	browseable	= yes
	guest ok 	= no
	valid users 	= carlos

[docs]
	comment		= Documentos
	path 		= /samba/docs
	public 		= no
	writeable 	= yes
	browseable 	= yes
    	valid users 	= @administradores

[public]
	comment		= Publico
	path		= /samba/publico
	public 		= yes
	writeable	= yes
	browseable	= yes
	guest ok	= yes

Que los permisos del sistema de archivos en /samba/publico sean seguros

chown -R nobody:nobody /samba/publico 

guest ok

Permite o no el acceso como usuario invitado, el valor puede ser Yes o No.

public

Define si se permite el acceso como usuario invitado, el valor puede ser Yes o No.

browseable

Permite o no mostrar este recurso en las listas de recursos compartidos, el valor puede ser Yes o No.

writable

Permite o no la escritura, es la opción opuesta a read only. El valor puede ser Yes o No. writable = Yes es lo mismo que read only = No y viceversa.

valid users

Define los usuarios o grupos, que podrán acceder al recurso compartido. Los valores pueden ser nombres de usuarios separados por comas o nombre de grupos precedido de @. Ejemplo: user1, user2, @contabilidad @administradores.

write list

Define que usuarios o grupos pueden acceder con permiso de escritura. Los valores pueden ser nombres de usuarios separados por comas o bien nombre de grupos precedidos de @. Ejemplo: user1, user2 , @contabilidad, @administradores.

admin users

Define usuarios o grupos que pueden acceder con permisos administrativos para el recurso. Pueden acceder realizando todas las operaciones como super-usuario. Los valores pueden ser nombres de usuarios separados por comas o bien nombre de grupos precedidos por una @. Ejemplo: user1, user2, @finanzas, @administradores.

directory mask

Define qué permisos en el sistema tendrán los subdirectorios creados dentro del recurso.

create mask

Define que permisos en el sistema tendrán los nuevos archivos creados dentro del recurso.

Iniciar el servicio SAMBA

service samba_server start

Reglas cortafuegos PF permitir tráfico samba

Como servidor es necesario abrir los puertos 137/udp, 138/udp, 139/tcp y 445/tcp

# /etc/pf.conf
...
pass in on $int_if proto { tcp, udp } from { 10.10.10.0/24, 192.168.88.0/24 } \
to $samba_ip port { 139, 445 }
pass in on $int_if proto udp from { 10.10.10.0/24, 192.168.88.0/24 } \
to $samba_ip port { 137, 138 }
...

Agregar usuario carlos a Samba

pdbedit -a carlos
new password:
retype new password

Activar acceso al usuario carlos

smbpasswd -e carlos
New SMB password:
Retype new SMB passwd:
Added user carlos

Reiniciar SAMBA

service samba_server restart

Conectar a un recurso compartido desde un cliente FreeBSD


Podemos usar indistintamente tanto la dirección IP del servidor FreeBSD como su nombre

cat /etc/hosts | grep tormenta
---
192.168.88.160   	tormenta
---

smbclient es parte de Samba, por tanto, es necesario instalar Samba

pkg install samba416

Debe existir el archivo smb4.conf de lo contrario smbclient falla:

smbclient: Can't load /usr/local/etc/smb4.conf - run testparm to debug it

touch /usr/local/etc/smb4.conf
echo "workgroup = CORP">/usr/local/etc/smb4.conf
echo "client min protocol = NT1">>/usr/local/etc/smb4.conf

Listar recursos compartidos por el servidor Samba

» smbclient -L tormenta
Password for [CORP\carlos]:

	Sharename       Type      Comment
	---------       ----      -------
	dellhome        Disk	  FreeBSD
	codigo          Disk      Scripts
	poolrecovery    Disk
	docs            Disk
	public          Disk      Permitido
	IPC$            IPC       IPC Service (Samba Server Version 4.16.11 en SERVIDOR)
Reconnecting with SMB1 for workgroup listing.

	Server               Comment
	---------            -------
	servidor	     Samba Server Version 4.16.11 en SERVIDOR
                         
	Workgroup            Master
	---------            -------
	CORP                 SERVIDOR

Conectar a un recurso compartido


$ smbclient -U carlos //192.168.88.160/dellhome
smb: \>

Las conexiones Samba actuales

root@tormenta: # smbstatus

Samba version 4.16.11
PID     Username   Group        Machine     Protocol Version  Encryption     Signing
--------------------------------------------------------------------------------------------------------
22653   carlos  carlos  192.168.88.51 (ipv4:192.168.88.51:39769)  SMB3_11  partial(AES-128-GMAC)
22472   nobody  nobody  192.168.88.51 (ipv4:192.168.88.51:21993)  SMB3_11      -         -

Service      pid     Machine       Connected at                   Encryption Signing
---------------------------------------------------------------------------------------------
IPC$         25576   solaris        Sun Jul 28 21:04:52 2024 CEST    -            -
public       22472   192.168.88.51  Sun Jul 28 10:48:09 2024 CEST    -            -
docs         22653   192.168.88.51  Sun Jul 28 11:17:03 2024 CEST    -            -
dellhome     61262   macbook-pro    Mon Jul 29 08:39:57 2024 CEST    -            -

No locked files

Listar sockets abiertos IPv4

root@tormenta: # sockstat -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
root     smbd       22653 34 tcp4   192.168.88.160:445    192.168.88.51:39769
carlos   sshd       22630 4  tcp4   192.168.88.160:22     192.168.88.51:42658
root     sshd       22628 4  tcp4   192.168.88.160:22     192.168.88.51:42658
root     smbd       22472 34 tcp4   192.168.88.160:445    192.168.88.51:21993
root     smbd       22478 34 tcp4   192.168.88.160:445    192.168.88.135:21996
root     smbd       13189 29 tcp4   127.0.0.1:445         *:*
root     smbd       13189 30 tcp4   127.0.0.1:139         *:*
root     smbd       13189 31 tcp4   192.168.88.160:445    *:*
root     smbd       13189 32 tcp4   192.168.88.160:139    *:*
root     nmbd       13182 16 udp4   *:137                 *:*
root     nmbd       13182 17 udp4   *:138                 *:*
root     nmbd       13182 18 udp4   192.168.88.160:137    *:*
root     nmbd       13182 19 udp4   192.168.88.255:137    *:*
root     nmbd       13182 20 udp4   192.168.88.160:138    *:*
root     nmbd       13182 21 udp4   192.168.88.255:138    *:*
root     sshd       92484 5  tcp4   *:22                  *:*
...

Conectar a un recurso compartido desde un cliente FreeBSD

Conectar a un recurso compartido desde un cliente MacOS

FreeBSD es genial!.

jueves, 26 de octubre de 2023

NFSv4 FreeBSD 14.2

NFSv4 - NFS Version 4 Protocol FreeBSD 14.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 utilzadas. 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 archivo /etc/rc.conf

sysrc nfs_server_enable="YES"
sysrc nfsv4_server_enable="YES"
sysrc nfs_server_flags="-u -t -n 24"
sysrc hostid_enable="YES"
sysrc hostid_file="/etc/hostid"
sysrc rpcbind_enable="YES"
sysrc rpcbind_flags="-h 192.168.88.160"
sysrc mountd_enable="YES"
sysrc mountd_flags="-r -p 892"
sysrc statd_flags="-p 32766"
sysrc lockd_flags="-p 32767"

Iniciar servicio hostid

service hostid start

Parametros des sysctl (/etc/sysctl.conf)

sysctl vfs.nfs.enable_uidtostring="1"      # Hacer que NFS siempre envíe nombres de propietario numéricos
sysctl vfs.nfsd.enable_stringtouid="1"     # Habilitar nfsd para aceptar nombres de propietario numéricos
sysctl vfs.nfsd.server_max_nfsvers="4"     # Fuerza NFSv4 max
sysctl vfs.nfsd.server_min_nfsvers="4"     # Fuerza NFSv4 min
sysctl vfs.nfsd.issue_delegations="1"      # Habilita delegaciones (mejora rendimiento)
sysctl vfs.nfsd.enable_locallocks="1"      # Bloqueos locales (compatible con ZFS)
sysctl kern.ipc.somaxconn="1024"           # Max conexciones pendientes (por defecto 128)
sysctl net.inet.tcp.delayed_ack="0"        # Mejora rendimiento TCP

Hacer que los cambios sean permanentes

echo vfs.nfs.enable_uidtostring="1" >> /etc/sysctl.conf
echo vfs.nfsd.enable_stringtouid="1" >> /etc/sysctl.conf
echo vfs.nfsd.server_max_nfsvers="4" >> /etc/sysctl.conf
echo vfs.nfsd.server_min_nfsvers="4" >> /etc/sysctl.conf
echo vfs.nfsd.issue_delegations="1" >> /etc/sysctl.conf
echo vfs.nfsd.enable_locallocks="1" >> /etc/sysctl.conf
echo kern.ipc.somaxconn="1024" >> /etc/sysctl.conf
echo net.inet.tcp.delayed_ack="0" >> /etc/sysctl.conf

Usamos el archivo /etc/hosts como resolución de nombres en la red local

...
192.168.88.160		tormenta
192.168.88.51		solaris
...

Configurar PF para permitir el tráfico NFS

...
lan_net ="{ 192.168.88.0/24 10.10.10.0/24 }"
nfs_puertos="{ 111, 892, 2049 }"
statd_lockd_puertos="{ 32766, 32767 }"

pass in proto { tcp } from $lan_net to any port ssh
pass in proto { tcp udp } from $lan_net to any port $statd_lockd_puertos
pass in proto { tcp udp } from $lan_net to any port $samba_puertos
pass in quick proto { tcp udp } from $lan_net to any port $nfs_puertos
...

Reiniciar servicios

tormenta: # service nfsd restart
Stopping nfsd.
Waiting for PIDS: 1391 1394.
Starting nfsd.

tormenta: # service rpcbind restart
Stopping rpcbind.
Waiting for PIDS: 1285.
Starting rpcbind.

tormenta: # service mountd restart
Stopping mountd.
Waiting for PIDS: 1382.
Starting mountd.

Crear los conjunto de datos en el servidor


Configurar canmount=off en zroot/nfsv4 para convertirlo en un contenedor puro (sin montaje, reduce cruces de fs crossings):

zfs set canmount=off zroot/nfsv4
zfs create -o mountpoint=/nfsv4/dellhome -p zroot/nfsv4/dellhome
zfs create -o mountpoint=/nfsv4/poolrecovery -p zroot/nfsv4/poolrecovery
zfs create -o mountpoint=/nfsv4/docs -p zroot/nfsv4/docs
zfs create -o mountpoint=/nfsv4/desarrollo -p zroot/nfsv4/desarrollo
zfs create -o mountpoint=/nfsv4/confsolaris -p zroot/nfsv4/confsolaris
zfs create -o mountpoint=/nfsv4/conftormenta -p zroot/nfsv4/conftormenta

Archivo de ejemplo /etc/exports, directorios compartidos en redes LAN

tormenta: # cat /etc/exports
V4: /nfsv4 # Define /nfsv4 como raiz global
/nfsv4/dellhome       -maproot=root -network 192.168.88.0/24
/nfsv4/poolrecovery   -maproot=root -network 192.168.88.0/24
/nfsv4/docs           -maproot=root -network 192.168.88.0/24 network 10.10.10.0/24
/nfsv4/desarrollo     -maproot=root -network 192.168.88.0/24 network 10.10.10.0/24
/nfsv4/confsolaris    -maproot=root -network 192.168.88.0/24
/nfsv4/conftormenta   -maproot=root -network 192.168.88.0/24

Puertos a la escucha (en el servidor)

root@tormenta:~ # netstat -an | grep -i listen     
tcp6       0      0 *.2049                 *.*                    LISTEN     
tcp4       0      0 *.2049                 *.*                    LISTEN     
tcp4       0      0 *.892                  *.*                    LISTEN     
tcp6       0      0 *.892                  *.*                    LISTEN          
tcp4       0      0 *.111                  *.*                    LISTEN     
tcp6       0      0 *.111                  *.*                    LISTEN 
carlos@tormenta:~ % sockstat -l4 | grep -E 'nfsd|rpcbind|mountd'
root     nfsd        1391 5   tcp4   *:2049                *:*
root     mountd      1382 8   udp4   *:892                 *:*
root     mountd      1382 9   tcp4   *:892                 *:*
root     rpcbind     1285 9   udp4   *:111                 *:*
root     rpcbind     1285 10  udp4   *:898                 *:*
root     rpcbind     1285 11  tcp4   *:111                 *:*

Programar mantenimiento

# crontab -e
@daily /sbin/service mountd reload
@daily /sbin/service nfsd restart

Logs de errorres:

 tail /var/log/messages | grep nfs

Capturar tráfico NFS:

 tcpdump -i re0 port 2049 -w nfs-captura.pcap

Leer paquetes capturados del archivo nfs-captura.pcap

root@tormenta:~ # tcpdump -r nfs-captura.pcap
...
21:14:42.658371 IP solaris.960 > tormenta.nfsd: Flags [P.], seq 976297794:976297922, \
ack 2292617495, win 4352, options [nop,nop,TS val 2858673986 ecr 2537679775], length 128: \
NFS request xid 755722369 124 getattr fh 0,5/2
21:14:42.658440 IP tormenta.nfsd > solaris.960: Flags [.], ack 128, win 29128, options \
[nop,nop,TS val 2537739395 ecr 2858673986], length 0
21:14:42.658497 IP tormenta.nfsd > solaris.960: Flags [P.], seq 1:93, ack 128, win 29128, \
options [nop,nop,TS val 2537739395 ecr 2858673986], length 92: NFS reply xid 755722369 \
reply ok 88 getattr LNK 12231267145 ids 1/53 sz 0
21:14:42.658797 IP solaris.960 > tormenta.nfsd: Flags [.], ack 93, win 4352, options \
[nop,nop,TS val 2858673987 ecr 2537739395], length 0
...

Configurar cliente FreeBSD

cat /etc/hosts...
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
solaris:~ # sysrc nfsv4_client_enable="YES"
solaris:~ # sysrc hostid_enable="YES"
solaris:~ # sysrc hostid_file="/etc/hostid"
solaris:~ # sysrc rpc_statd_enable="YES"
solaris:~ # sysrc rpc_lockd_enable="YES"

Iniciar servicio hostid

service hostid start

Iniciar el servicio nfsclient

solaris:~ # service nfsclient start
NFS access cache time=60
solaris:~ nc -v tormenta 2049
  Connection to tormenta 2049 port [tcp/nfsd] succeeded!
solaris:~ nc -v tormenta 111
Connection to tormenta 111 port [tcp/sunrpc] succeeded!

Montar manualmente un directorio compartido (en el cliente)

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

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

# Device	Mountpoint	FStype	Options		Dump	Pass#
/dev/gpt/efiboot0	/boot/efi	msdosfs	rw		2	2
/dev/nvd0p3	 none	  	swap	sw			0	0
# 
fdesc		/dev/fd			fdescfs	rw		0	0
#
proc			/proc		procfs	rw		0	0
# nfsv4 shared
tormenta:/poolrecovery     /nisc4    nfs     rw,nfsv4,noatime,bg    0  0
tormenta:/development      /nixs4    nfs     rw,nfsv4,noatime,bg    0  0
tormenta:/docs             /nids4    nfs     rw,nfsv4,noatime,bg    0  0
tormenta:/dellhome 	   /nihs4    nfs     ro,nfsv4,noatime,bg    0  0

Archivo /etc/auto_master

cat /etc/auto_master
#
# Automounter master map, see auto_master(5) for details.
#
/net		-hosts		-nobrowse,nosuid,intr

Configurar el montaje automatico para montar dinámicamente cuando alguien acceda al recurso compartido NFS.

echo 'autofs_enable="YES"' >> /etc/rc.conf
service automountd start

Vamos a comprobar que podemos escribir en el directorio

 cd /nids4
 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

solaris:~ % mount

...
map -hosts on /net (autofs)
tormenta:/poolrecovery on /nisc4 (nfs, nfsv4acls)
tormenta:/dellhome on /nihs4 (nfs, read-only, nfsv4acls)
tormenta:/docs on /nids4 (nfs, nfsv4acls)
tormenta:/development on /nics4 (nfs, nfsv4acls)
...

Verificar PF y reglas en tiempo real

 pfctl -f /etc/pf.conf
 pfctl -s rules
FreeBSD es genial!.

lunes, 20 de febrero de 2023

Gestión de Jails con Bastille FreeBSD

Jails con Bastille FreeBSD

https://docs.freebsd.org/en/books/handbook/jails/ https://bastille.readthedocs.io/en/latest/

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

2.- Instalar Apache MySQL PHP

3.- Instalar Wordpress. Activar rdr en Firewall PF

Información sobre el sistema

% uname -mrs
FreeBSD 13.1-RELEASE-p6 amd64

La virtualización es algo así como un entorno cliente-servidor. El hardware y su instancia central del sistema operativo es el host, mientras que los clientes son instancias virtualizadas del sistema operativo. Una jail contiene una zona de usuario completa del sistema operativo que se ejecuta sobre un sistema FreeBSD existente. La jail no tiene su propio kernel, en cambio, se ejecuta en una porción restringida del kernel del host.

Un sistema enjaulado sólo puede acceder a una parte limitada del sistema de archivos y no puede ver procesos fuera de la jaula. A cada jaula se le asigna una dirección IP dedicada, y la jaula sólo puede ver el tráfico a esa IP en particular. Cada jaula necesita un directorio raíz dedicado

La cuenta root en una jaula controla completamente esa jaula pero no tiene acceso a nada más allá de la jaula, está confinado. El usuario puede instalar el software que desee sin interferir con el sistema anfitrión ni con otras jaulas.

Bastille es un gestor de jails escrito en Bourne Shell.

Soporta ZFS
VNET
Automatización de jails por medio de templates
Control de recursos (rctl)
Firewall dinámico - redirección dinámica de puertos, etc.
La red interna de la jail hará nat a través de PF

El comando ping está deshabilitado dentro de los contenedores, porque el acceso sin procesar al socket es un agujero de seguridad. En su lugar, se puede instalar y probar con wget.

 pkg install bastille

Habilitar las opciones para utilizar ZFS en bastille

 sysrc -f /usr/local/etc/bastille/bastille.conf bastille_zfs_enable=YES
 sysrc -f /usr/local/etc/bastille/bastille.conf bastille_zfs_zpool=zroot

Activar bastille

 sysrc bastille_enable=YES

Iniciar bastille

service bastille start

Descargar los ficheros base de la última versión de FreeBSD que vamos a utilizar y aplicar parches de seguridad.

# bastille bootstrap 13.1-RELEASE update

Bucle invertido bastille0

loopback (bastille0)

Crear una interfaz loopback clonada (bastille0) y asignar direcciones privadas (rfc1918) a todos las jails en esa interfaz. Se puede usar cualquier dirección dentro de ese rango porque hemos creado nuestra propia red privada.

Desde el sistema host el cortafuegos (PF), permite y deniega tráfico. Con esta configuración los contenedores se mantienen fuera de la red, hasta que se permita el acceso.

El NAT del cortafuegos del sistema saca el tráfico de los contenedores y puede redirigir selectivamente el tráfico a los contenedores en función de los puertos de conexión (es decir, 80, 443, etc.)

Crear la interfaz loopback

 sysrc cloned_interfaces+=lo1
 sysrc ifconfig_lo1_name="bastille0"

Aplicar la configuración

 service netif cloneup

PF es una herramienta de manipulacion TCP/IP

Permitir conexiones SSH

$ cat /etc/pf.conf
#
ext_if="em0"

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/*"

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

Habilitar PF

# sysrc pf_enable=YES

Iniciar PF

 service pf start

Consultar las reglas de PF

pfctl -sr
scrub in on em0 all fragment reassemble
block return in all
pass out quick all flags S/SA keep state
block drop in on ! em0 inet from 192.168.88.0/24 to any
block drop in inet from 192.168.88.51 to any
pass in inet proto tcp from any to any port = ssh flags S/SA keep state

Crear la jail www y asignarle la dirección IP 10.10.10.2

bastille create www 13.1-RELEASE 10.10.10.2
Valid: (10.10.10.2).
...
Creating a thinjail...

Listar las jails

solaris: # bastille list
 JID             IP Address      Hostname       Path
 www             10.10.10.2      www            /usr/local/bastille/jails/www/root

Entrar en la jail www para ver su dirección IP

 bastille console www
[www]:
root@www:~ #
root@www:~ # uname -mrs
FreeBSD 13.1-RELEASE-p6 amd64 

Ejecutar ifconfig

Crear un usuario no privilegiado para Habilitar conexiones SSH desde el host

Entrar en la jail

 bastille console www
 root@www:~ # adduser
 ...
SSH Secure Shell

Salir de la jail

root@www:~ # exit
logout

Habilitar e iniciar el servicio SSH en la jail

 bastille sysrc www sshd_enable=YES
 bastille service www sshd start

Establecer el Port 23 y la ListenAddress 10.10.10.2 en el archivo de configuración /etc/ssh/sshd_config

Port 23
ListenAddress 10.10.10.2

Reiniciar el servicio

 service sshd restart

Se puede saber si el socket está a la escucha ejecutando

bastille cmd www sockstat -4

[www]:
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
root     sshd       55610 3  tcp4   10.10.10.2:23         *:*
[www]: 0

También podemos entrar en la jail y lanzar el comando nc localhost 23

 bastille console www
root@www:~ # nc localhost 23
SSH-2.0-OpenSSH_8.8 FreeBSD-20211221

SSH le permite generar una huella digital de clave, que es una representación mucho más corta de una clave. No puedes encriptar el tráfico o negociar con la huella dactilar. Para generar una huella de clave pública, introduzca el comando ssh-keygen -lf keyfile.pub.

root@www:~ # ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub

Salir de la jail

root@www:~ # exit
logout

En el host agregar al archivo .ssh/config los datos de conexión

carlos@solaris:~ cat .ssh/config
Host www
    HostName 10.10.10.2
    User carlos
    Port 23
    AddressFamily inet
    BindInterface em0
    IdentityFile ~/.ssh/id_rsa

    CASignatureAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256

    Ciphers  chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com

    CheckHostIP yes

Entrar a la jail www a través de SSH

carlos@solaris:~/.ssh % ssh www
The authenticity of host '[10.10.10.2]:23 ([10.10.10.2]:23)' can't be established.
ED25519 key fingerprint is SHA256:KEnjnUTz7FPyq2c+ZcEzKvu+s5diszqxff+DmFJ+0sI.
No matching host key fingerprint found in DNS.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:45: www
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[10.10.10.2]:23' (ED25519) to the list of known hosts.

Dentro de la jail www

carlos@www:~ $

Cambiar al usuario root

carlos@www:~ $ su
root@www: #

Instalar wget para comprobar que tenemos acceso a Internet

 pkg install wget
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y

En este punto tenemos la jail instalada y con conexion a Internet.

Detener la jail

bastille stop www

Iniciar la jail

bastille start www

[www]:
www: created

Archivos de configuracion de Bastille jails

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

Archivo jails.conf de bastille

# cat /usr/local/bastille/jails.conf
www {
  devfs_ruleset = 4;
  enforce_statfs = 2;
  exec.clean;
  exec.consolelog = /var/log/bastille/www_console.log;
  exec.start = '/bin/sh /etc/rc';
  exec.stop = '/bin/sh /etc/rc.shutdown';
  host.hostname = www;
  mount.devfs;
  mount.fstab = /usr/local/bastille/jails/www/fstab;
  path = /usr/local/bastille/jails/www/root;
  securelevel = 2;

  interface = bastille0;
  ip4.addr = 10.10.10.2;
  ip6 = disable;
}
FreeBSD es genial!.

martes, 17 de enero de 2023

Montar Directorios Usando SSHFS en FreeBSD 13.1

NFS Sistema de Archivos en Red FreeBSD
Montaje de Sistema de Archivos NFS Usando Autofs Replicar, Recuperar Pool Root ZFS FreeBSD

Envío y recepción de datos ZFS

El comando zfs send crea una representación de flujo de datos de una instantánea que se graba en una salida estándar. De forma predeterminada, se crea un flujo de datos completo. Puede redirigir la salida a un archivo u otro sistema.

El comando zfs receive crea una instantánea cuyo contenido se especifica en el flujo de datos que figura en la entrada estándar. Si se recibe un flujo de datos completo, también se crea un sistema de archivos. Con estos comandos puede enviar y recibir datos de instantáneas ZFS y sistemas de archivos.

El hostname solaris será el cliente y tormenta el servidor. Ambos corren FreeBSD 13.1.

solaris:~/bsdfetch-main % ./bsdfetch

OS: FreeBSD
Release: 13.1-RELEASE-p3
Version: FreeBSD 13.1-RELEASE-p3 GENERIC
Host: solaris
Arch: amd64
Shell: csh
User: carlos
Packages: 1245
Uptime: 0d 0h 47m
RAM: 16221 MB
Loadavg: 0.17 0.17 0.20
CPU: Intel(R) Core(TM) i5-8350U CPU @ 1.70GHz
Cores: 8 of 8 processors online
 -> Core [1]: 39.0 °C
 -> Core [2]: 39.0 °C
 -> Core [3]: 39.0 °C
 -> Core [4]: 39.0 °C
 -> Core [5]: 40.0 °C
 -> Core [6]: 40.0 °C
 -> Core [7]: 41.0 °C
 -> Core [8]: 41.0 °C

Archivo config ssh (cliente)

 cat .ssh/config
Host tormenta
        HostName 192.168.88.160
        User carlos
        IdentityFile ~/.ssh/id_rsa
        Port 22422
        AddressFamily inet
        BindInterface em0

        CASignatureAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256

        Ciphers  chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com

        CheckHostIP yes

Entrar vía ssh al servidor.

tormenta % ./bsdfetch

OS: FreeBSD
Release: 13.1-RELEASE-p3
Version: FreeBSD 13.1-RELEASE-p3 GENERIC
Host: tormenta
Arch: amd64
Shell: csh
User: carlos
Packages: 472
Uptime: 25d 23h 3m
RAM: 32084 MB
Loadavg: 0.40 0.28 0.20
CPU: Intel(R) Celeron(R) N5105 @ 2.00GHz
Cores: 4 of 4 processors online

tormenta:~ % uname -a

FreeBSD tormenta 13.1-RELEASE-p3 FreeBSD 13.1-RELEASE-p3 GENERIC amd64

solaris:~ % uname -a

FreeBSD solaris 13.1-RELEASE-p3 FreeBSD 13.1-RELEASE-p3 GENERIC amd64

Red cableada

#
::1                 localhost localhost.my.domain
127.0.0.1           localhost localhost.my.domain
192.168.88.247      synology  # nas synology
192.168.88.160      tormenta  # servidor freebsd
192.168.88.51       solaris   # cliente freebsd
192.168.88.200		raspberry # servidor dns
192.168.88.205		switch    # switch gestionado
192.168.88.43       macbook	  # cliente 
192.168.88.1		mikrotik  # router firewall
192.168.1.1			router2   # red 2 
...

Crear un conjunto de datos en solaris (cliente)

 zfs create -o mountpoint=/usr/tormentabck zroot/usr/tormentabck

Instalar sshfs (servidor)

 pkg search sshfs
fusefs-sshfs-3.7.3_1           Mount remote directories over ssh

 pkg install fusefs-sshfs

Permitir acceso a través de ssh. Habilitar ssh en solaris (cliente)

 sysrc ssh_enable=YES

Tener el mismo usuario en ambos sistemas

Crear conjunto de datos en el cliente

 solaris: # zfs create zroot/usr/tormentabck

Montar directorio en el servidor

[tormenta:~] carlos@pts/0 % sudo sshfs -o allow_other \
carlos@192.168.88.51:/usr/tormentabck /mnt/solaris

Realizar comprobación

[tormenta:~] carlos@pts/0 % mount
 --> /dev/fuse on /mnt/solaris (fusefs.sshfs)
 ...

Crear una instantánea recursiva en el servidor

 [tormenta:~] zfs snapshot -r zroot@tormenta_120123

Enviar el conjunto de datos al cliente (solaris)

 [tormenta:~] zfs send -Rv zroot@tormenta_120123 | gzip > \
 /mnt/solaris/zroot.tormenta.snap1.gz

Llegados a este punto tenemos una copia del sistema completo del servidor en el cliente.

 [tormenta:~] % ls -l /mnt/solaris
 total 64934092
 -rw-r--r--  1 carlos  carlos  66492508708 Jan 12 21:51 zroot.tormenta.snap1.gz

Desmontar el directorio

sudo umount /mnt/solaris/

En la maquina cliente (donde físicamente está el fichero)

ls -l /usr/tormentabck/
total 64954481
-rw-r--r--  1 carlos  carlos  66492508708 Jan 12 21:51 zroot.tormenta.snap1.gz

FreeBSD es genial!.