Entorno: Linux (Familia RHEL: Fedora) · SSHFS · Autofs · Monitoreo ARP
Nivel: Entusiasta Cacharrero / Nivel de Automatización: “vago pero eficiente”
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 demanda: autofs monta la carpeta por SSHFS solo cuando realmente entras en ella.
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.
sudo sin contraseñaPara 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:
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
~/bin/lan-watch.shEste 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
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.
ssh-keygen -t ed25519 -f ~/.ssh/homelab_key -C "homelab autofs"
ssh-copy-id -i ~/.ssh/homelab_key -o IdentitiesOnly=yes usuario@host_remoto.internal
autofs corre como root, pero nosotros queremos usar nuestras llaves SSH de usuario.
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. /etc/fuse.conf tenga habilitado user_allow_other.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 :
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.autofs corre como root, pero nosotros queremos usar nuestras llaves SSH de usuario.
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. /etc/fuse.conf tenga habilitado user_allow_other./etc/auto.homelanAquí 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.getent hosts servidor-pro.internal y debería darte la IP actual.ls ~/peers/homelan/ y deberías ver la carpeta (aunque esté vacía).cd ~/peers/homelan/servidor-pro. El montaje SSHFS debería activarse solo.| Síntoma | Solució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. |
.internal que es el estándar oficial para redes privadas (formalmente correcta según RFC 9476 - 2023).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.