Páginas

sábado, 5 de septiembre de 2026

Configuración de WiFi con IP fija en FreeBSD 14.4

Configuración de WiFi con IP fija en FreeBSD 14.4

Incluye script de resume (opcional) para recuperar conexión tras hibernación

Configuración básica en /etc/rc.conf

Para usar una IP fija en wlan0, añadir o modificar estas líneas:

wlans_iwm0="wlan0"
ifconfig_wlan0="WPA inet 192.168.88.51 netmask 255.255.255.0"
defaultrouter="192.168.88.1"

En FreeBSD, la forma más sencilla y moderna de obtener el firmware para tu tarjeta inalámbrica es usando la herramienta fwget. Esta utilidad detecta automáticamente el hardware de tu sistema e instala los paquetes de firmware necesarios

sudo wget

Este comando analizará el hardware, identificará qué controladores y firmwares necesita e instalará los paquetes correspondientes automáticamente.

Configuración en /boot/loader.conf

Después de instalado el firmware, para que el sistema lo cargue al arrancar, es necesario agregar las siguientes líneas al archivo /boot/loader.conf

if_iwm_load="YES"
iwm8265fw_load="YES"
legal.intel_iwm.license_ack=1

Reiniciar el sistema para que los módulos se carguen correctamente

 reboot
Notas importantes: Asegúrarse de que /etc/wpa_supplicant.conf contiene los datos de su red WiFi. cat /etc/wpa_supplicant.conf
# /etc/wpa_supplicant.conf written by wifimgr(8)
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
fast_reauth=1

network={
	ssid="MikroTik-39F9C0"
	psk=755864a8b1a4ef59e2e62590977a75f5317193637a8629dccb18c40e8638a68e
}

Al usar IP fija, no se necesita dhclient. Por tanto, desactivar background_dhclient (ponerlo a "NO" o eliminar la línea) para evitar que sobrescriba la configuración estática al despertar:

background_dhclient="NO"

¿El sistema se recupera solo tras hibernación?

En la mayoría de los casos, sí. Al despertar, FreeBSD intenta restaurar el estado de las interfaces. Si el driver (iwm) y el subsistema WiFi funcionan correctamente, la interfaz se reasociará y mantendrá la IP fija. Esto suele funcionar bien con hardware Intel y configuraciones sencillas.

Sin embargo, si la asociación falla o la interfaz queda en un estado inconsistente (por ejemplo, si el firmware no responde o hay eventos de red que disparan dhclient). Si al despertar no tiene conexión, se puede usar el script de resume que se describe a continuación.

Script opcional para recuperar la conexión (resume-wlan.sh)

Este script destruye y recrea wlan0, fuerza la asociación, asigna la IP fija y la ruta por defecto, y mata posibles procesos dhclient que puedan interferir.

Crear el script en /usr/local/sbin/resume-wlan.sh

#!/bin/sh
# Script para restaurar WiFi tras hibernación (IP fija)
# Destruye y recrea wlan0, espera asociación, asigna IP y ruta.

sleep 3

# Destruir y recrear wlan0
ifconfig wlan0 destroy 2>/dev/null
ifconfig wlan0 create wlandev iwm0 country ES
ifconfig wlan0 up

# Iniciar wpa_supplicant
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

# Esperar asociación (hasta 30s)
i=0
while [ $i -lt 30 ]; do
    status=$(ifconfig wlan0 | grep "status:" | awk '{print $2}')
    [ "$status" = "associated" ] && break
    sleep 1
    i=$((i + 1))
done

logger "resume-wlan: status=$status tras ${i}s"

if [ "$status" != "associated" ]; then
    logger "resume-wlan: ERROR - no asociado"
    exit 1
fi

# Asignar IP fija
ifconfig wlan0 inet 192.168.88.51 netmask 255.255.255.0

# Añadir ruta por defecto
route add default 192.168.88.1

# Matar posibles dhclient que interfieran
pkill -f "dhclient.*wlan0" 2>/dev/null

# Verificar pasados 5 segundos y reañadir si es necesario
sleep 5
if ! netstat -rn | grep -q "^default.*wlan0"; then
    route add default 192.168.88.1
    logger "resume-wlan: ruta reañadida por seguridad"
fi

logger "resume-wlan: completado (IP fija y ruta activas)"

Darle permisos de ejecución:

chmod +x /usr/local/sbin/resume-wlan.sh

Configurar devd para ejecutar el script al despertar

Crea el archivo /etc/devd/resume-wlan.conf con este contenido:

notify 100 {
    match "system"      "ACPI";
    match "subsystem"   "Resume";
    action "/usr/local/sbin/resume-wlan.sh &";
};

Reiniciar devd:

service devd restart

¿Cuándo usar el script y cuándo no?

Si no se utiliza el script:

El sistema se encarga de restaurar la interfaz al despertar. Es la opción más simple y recomendable si funciona correctamente en el hardware. Si después de probar varias hibernaciones todo va bien, no es necesario el script.

Si se usa el script:

Aporta una capa extra de fiabilidad, especialmente si se ha tenido problemas de conectividad tras la hibernación. También es útil si se cambia de red o si el driver WiFi es propenso a fallar.

Recomendación: Pruebrar primero sin el script. Si la conexión se pierde ocasionalmente, activar el script.

Notas adicionales Si en algún momento se cambia a DHCP, recordar eliminar la IP fija y habilitar background_dhclient de nuevo. Hay que asegurar de que el país (country ES) coincide con la región. Puede omitirse si no es necesario.

Script si se utiliza IP dinámica (cambia a DHCP)

Vamos a adaptar el script para que funcione con DHCP en lugar de IP fija. Esto es útil si quieremos que la interfaz obtenga la IP automáticamente al despertar (por ejemplo, si cambias de red con frecuencia o el router asigna IPs dinámicamente).

#!/bin/sh
# Script para restaurar WiFi tras hibernación (DHCP)
# Destruye y recrea wlan0, espera asociación, y lanza dhclient.

sleep 3

# Destruir y recrear wlan0
ifconfig wlan0 destroy 2>/dev/null
ifconfig wlan0 create wlandev iwm0 country ES
ifconfig wlan0 up

# Iniciar wpa_supplicant
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

# Esperar asociación (hasta 30s)
i=0
while [ $i -lt 30 ]; do
    status=$(ifconfig wlan0 | grep "status:" | awk '{print $2}')
    [ "$status" = "associated" ] && break
    sleep 1
    i=$((i + 1))
done

logger "resume-wlan: status=$status tras ${i}s"

if [ "$status" != "associated" ]; then
    logger "resume-wlan: ERROR - no asociado"
    exit 1
fi

# Obtener IP por DHCP
dhclient wlan0

# Asegurar ruta por defecto (por si dhclient no la pone)
sleep 2
if ! netstat -rn | grep -q "^default.*wlan0"; then
    # Intenta obtener el gateway de la concesión DHCP (opcional)
    # Si no funciona, puedes poner un gateway fijo o simplemente reintentar dhclient.
    logger "resume-wlan: ruta por defecto no encontrada, reintentando dhclient"
    dhclient wlan0
fi

logger "resume-wlan: completado (DHCP)"
FreeBSD es genial!.

No hay comentarios:

Publicar un comentario