fedora

  • Bitácora de Laboratorio: HomeLab - Montaje Dinámico de Archivos en Red Local (sin IPs fijas ni dramas de DNS)

    home lab banner

     Entorno: Linux (Familia RHEL: Fedora) · SSHFS · Autofs · Monitoreo ARP
    Nivel: Entusiasta Cacharrero / Nivel de Automatización: “vago pero eficiente”

    El problema: IPs que bailan y routers que no ayudan

    En la mayoría de nuestras casas, el router del ISP hace lo que quiere: asigna IPs dinámicas y no nos deja tocar el DNS local. Si intentas montar una carpeta remota, lo más probable es que el enlace se rompa en cuanto el router decida darle otra IP a tu servidor.

    Esta bitácora documenta una solución pragmática y basada en eventos: 1. Descubrimiento pasivo: Escuchamos al kernel para saber cuándo aparece una MAC específica. 2. Resolución local: Actualizamos /etc/hosts al vuelo cuando el dispositivo se conecta. 3. Montaje bajo demandaautofs monta la carpeta por SSHFS solo cuando realmente entras en ella.

    Paso 1 — Resolución de nombres sin servidor DNS

    En lugar de montar un servidor DNS completo (que es un lío), usamos un pequeño script que “escucha” la red y actualiza tu /etc/hosts solo cuando tus cacharros cambian de estado.

    1.1 Lo básico

    sudo dnf install arp-scan inotify-tools autofs fuse-sshfs

    1.2 Configura sudo sin contraseña

    Para que el script pueda actualizar /etc/hosts y escanear la red sin pedirte la clave cada 5 minutos, necesitamos darle permisos específicos en /etc/sudoers.d/lan-watch:

    sudo visudo /etc/sudoers.d/lan-watch

    Añade estas líneas (cambiando tu_usuario por tu nombre de usuario real):

    tu_usuario ALL=(ALL) NOPASSWD: /usr/sbin/arp-scan
    tu_usuario ALL=(ALL) NOPASSWD: /usr/bin/sed
    tu_usuario ALL=(ALL) NOPASSWD: /usr/bin/tee

    1.2 El Script “Mágico” — ~/bin/lan-watch.sh

    Este script es súper eficiente. No está escaneando todo el rato; se queda esperando a que el kernel le diga: “Oye, este vecino acaba de cambiar de estado”.

    #!/bin/bash
    
    PEERS_DIR="$HOME/peers"
    MOUNT_BASE="$HOME/peers/homelan"
    
    # Detectamos la interfaz activa automáticamente
    IFACE=$(ip route get 8.8.8.8 | grep -Po '(?<=dev )(\S+)')
    [ -z "$IFACE" ] && IFACE=$(ip link show | grep -m 1 "state UP" | awk -F': ' '{print $2}')
    
    # Mapa de MAC → Nombre (Pon aquí las MACs de tus máquinas)
    declare -A MAC_NAMES=(
        ["00:11:22:33:44:55"]="servidor-pro"
        ["66:77:88:99:aa:bb"]="mi-nas"
    )
    
    rebuild_hosts() {
        BLOCK="# homelan-start\n"
        for f in "$PEERS_DIR"/*.txt; do
            [ -f "$f" ] || continue
            BLOCK+="$(cat $f)\n"
        done
        BLOCK+="# homelan-end"
    
        sudo sed -i '/# homelan-start/,/# homelan-end/d' /etc/hosts
        echo -e "$BLOCK" | sudo tee -a /etc/hosts > /dev/null
    }
    
    update_peer() {
        local NAME=$1
        local IP=$2
        local ACTION=$3 # "online" u "offline"
    
        if [ "$ACTION" == "online" ]; then
            echo "$IP$NAME.internal$NAME" > "$PEERS_DIR/$NAME.txt"
            echo "[$(date)]$NAME está ONLINE:$IP ($IFACE)"
        else
            if [ -f "$PEERS_DIR/$NAME.txt" ]; then
                rm -f "$PEERS_DIR/$NAME.txt"
                echo "[$(date)]$NAME está OFFLINE, quitando registro"
               
                # Desmontaje "perezoso" para que no se cuelgue el sistema
                if mountpoint -q "$MOUNT_BASE/$NAME" 2>/dev/null; then
                    sudo umount -l "$MOUNT_BASE/$NAME"
                fi
            fi
        fi
        rebuild_hosts
    }
    
    # Sincronización inicial al arrancar
    SCAN=$(sudo arp-scan -I "$IFACE" --localnet 2>/dev/null)
    for MAC in "${!MAC_NAMES[@]}"; do
        NAME="${MAC_NAMES[$MAC]}"
        IP=$(echo "$SCAN" | grep -i "$MAC" | awk '{print $1}')
        [ -n "$IP" ] && update_peer "$NAME" "$IP" "online" || update_peer "$NAME" "" "offline"
    done
    
    # Escuchando eventos del kernel en tiempo real
    ip monitor neigh dev "$IFACE" | while read -r event; do
        IP=$(echo "$event" | awk '{print $1}')
        MAC=$(echo "$event" | grep -oi '[0-9a-f:]\{17\}')
        STATE=$(echo "$event" | grep -oE "REACHABLE|STALE|FAILED|DELETE")
    
        [ -z "$STATE" ] && continue
        NAME=""
        [ -n "$MAC" ] && NAME="${MAC_NAMES[${MAC,,}]}"
        [ -z "$NAME" ] && NAME=$(basename "$(grep -l "$IP" "$PEERS_DIR"/*.txt 2>/dev/null)" .txt)
    
        [ -z "$NAME" ] && continue
    
        case "$STATE" in
            REACHABLE|STALE) update_peer "$NAME" "$IP" "online" ;;
            FAILED|DELETE)   update_peer "$NAME" "$IP" "offline" ;;
        esac
    done

    1.3 El servicio que lo mantiene vivo

    Crea ~/.config/systemd/user/lan-watch.service:

    [Unit]
    Description=LAN ARP watcher
    After=network-online.target
    
    [Service]
    ExecStart=%h/bin/lan-watch.sh
    Restart=always
    
    [Install]
    WantedBy=default.target

    Luego dale vida con: systemctl --user enable --now lan-watch.service.


    Paso 2 — Configuración de SSH y Autofs

    2.1 Generar clave SSH dedicada para el homelab

    ssh-keygen -t ed25519 -f ~/.ssh/homelab_key -C "homelab autofs"

    2.2 Copiar la clave pública a cada máquina remota

    ssh-copy-id -i ~/.ssh/homelab_key -o IdentitiesOnly=yes usuario@host_remoto.internal

    2.3 El gran truco: SSH para Root

    autofs corre como root, pero nosotros queremos usar nuestras llaves SSH de usuario.

    1. Autoriza a Root: Root tiene que confiar en la máquina remota. Conéctate una vez a mano usando sudo: sudo ssh -i /home/tuusuario/.ssh/homelab_key Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
    2. Permisos: Asegúrate de que /etc/fuse.conf tenga habilitado user_allow_other.

    2.4 El mapa de Autofs — /etc/auto.homelan

    Aquí usamos unos flags específicos para que la conexión no se quede “colgada” si el servidor se apaga.

    servidor-pro -fstype=sshfs,port=22,IdentityFile=/home/tuusuario/.ssh/homelab_key,IdentitiesOnly=yes,uid=1000,gid=1000,allow_other,StrictHostKeyChecking=no,reconnect :Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:/home/tuusuario

    • StrictHostKeyChecking=no: Para que no falle si la máquina remota cambia de identidad en tus pruebas.
    • reconnect: Intenta reconectar el túnel SSH automáticamente si se cae la conexión de red.
    • uid=1000,gid=1000: Para que tu usuario sea el dueño de los archivos montados.

    2.5 El gran truco: SSH para Root

    autofs corre como root, pero nosotros queremos usar nuestras llaves SSH de usuario.

    1. Autoriza a Root: Root tiene que confiar en la máquina remota. Conéctate una vez a mano usando sudo: bash sudo ssh -i /home/tuusuario/.ssh/homelab_key Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
    2. Permisos: Asegúrate de que /etc/fuse.conf tenga habilitado user_allow_other.

    2.6 El mapa de Autofs — /etc/auto.homelan

    Aquí usamos unos flags específicos para que la conexión no se quede “colgada” si el servidor se apaga.

    servidor-pro  -fstype=sshfs,port=22,IdentityFile=/home/tuusuario/.ssh/homelab_key,IdentitiesOnly=yes,uid=1000,gid=1000,allow_other,StrictHostKeyChecking=no,reconnect :Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:/home/tuusuario
    • StrictHostKeyChecking=no: Para que no falle si la máquina remota cambia de identidad en tus pruebas.
    • reconnect: Intenta reconectar el túnel SSH automáticamente si se cae el WiFi.
    • uid=1000,gid=1000: Para que tu usuario sea el dueño de los archivos montados.

    Paso 3 — ¿Funciona? (Verificación)

    1. Resolución: Escribe getent hosts servidor-pro.internal y debería darte la IP actual.
    2. Visibilidad: Haz un ls ~/peers/homelan/ y deberías ver la carpeta (aunque esté vacía).
    3. Montaje: Entra en ella: cd ~/peers/homelan/servidor-pro. El montaje SSHFS debería activarse solo.

    Tabla de “Primeros Auxilios”:

    SíntomaSolución rápida
    No such file or directory Revisa que haya un : antes del nombre de usuario en el mapa de autofs.
    Se queda colgado al entrar Usa umount -l y mira si el servidor sigue vivo.
    Permission denied Mira si user_allow_other está descomentado en/etc/fuse.conf.

    Conclusiones de diseño

    • Cero estrés: No hay polling, el script no consume nada mientras espera eventos del kernel.
    • Limpio: Usamos .internal que es el estándar oficial para redes privadas (formalmente correcta según RFC 9476 - 2023).
    • Ordenado: El script limpia los montajes “fantasma” cuando apagas un servidor.

    En OpenSAI estaremos atentos a conocer tu experiencia, no dudes en dejar tu comentario...y si te gustó nuestro contenido:

  • Cómo montar particiones LVM desde el modo de rescate (CentOS/Fedora) { Notas de Laboratorio }

    LVM (By Emanuel DussThis vector image was created with Inkscape, and then manually edited by Perhelion. - Own work, CC BY-SA 3.0 de, https://commons.wikimedia.org/w/index.php?curid=11624545)

    Original Image: Emanuel Duss vector image created with Inkscape and manually edited by Perhelion. Own work, CC BY-SA 3.0

    Simplemente cómo nota de laboratorio, porque ya me ha pasado varias veces (y necesito anotarlo en algún lado), en un equipo que usa fedora (también sirve para CentOS) y tiene usuarios creativos, de esos que lo apagan a patadas, dejo para el registro el proceso para montar un Volumen Lógico.

    Después de que el usuario deja el equipo en modo de solicitud de restauración (esa consola negra que pide una constraseña administrativa para escanear los discos y restaurar el sistema)...si se tiene la fortuna de recordar la clave de root, no se tiene claro cómo montar ese maldito y sensual volumen lógico que se hizo cool al momento de instalación (LVM es una nota, pero si se retoma un equipo que no se ha tocado en años, puede quedar uno perdido por unos momentos).

    El procedimiento en consola de recuperación es:

    Revisar los volúmenes lógicos de la máquina:

    lvm vgscan -v

    Activar los volúmenes lógicos:

    lvm vgchange -ay

    Listar los volúmenes lógicos disponibles:

    lvm lvs -all

    Montar el volúmen requerido:

    mount /dev/volgroup/logvol /mountpoint

    Con el volúmen detectado y siendo capaces de montarlo, ya se puede recuperar al menos la información.

    Si por algún motivo se imaginan que este procedimiento es mio...pueees nop, agradezco al amigo Jim Zimmerman por hacer la tarea de registrarlo en su sitio, al menos aquí lo tienen en español, aunque con los comandos eso es irrelevante, y reitero, es una nota personal para no andar buscando en google lo mismo, cada vez que se le hace el favor a mi vecina ( "favor" :P...cuando se hace al derecho, queda uno como el Neo del barrio obrero, la consola negra asusta y si se saben par cosillas se descresta jejeje! ).

    En OpenSAI estaremos atentos a conocer tu experiencia, no dudes en dejar tu comentario...y si te gustó nuestro contenido:

Este sitio web utiliza cookies necesarias para su funcionamiento y para alcanzar los fines que se describen en la política de privacidad. Al aceptarla, al desplazarse por esta página o al continuar navegando, acepta nuestra política de privacidad.