"Después del juego es antes del juego"
Sepp Herberger

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

jueves, 7 de enero de 2021

Haciendo funcionar un dispositivo wifi USB Mediatek MT7601U en Linux.

Tengo un pincho USB wifi regalado que al probarlo no me funcionó en Linux. El sistema no creaba el dispositivo de red wifi al conectarlo. Su identificación USB es:
# lsusb | gre0 -i wireless
Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
Lo curioso es que el driver mt7601u.ko si existe para Linux hace tiempo. En el caso de Manjaro tuve que instalarlo con:
$ pamac build  mt7601u-dkms-git
Una vez creado el módulo verifico que se carga en memoria:
# lsmod | grep mt
mt7601u               139264  0
mac80211             1110016  1 mt7601u
cfg80211              987136  2 mt7601u,mac80211
Pero nada, no funciona: no hay dispostivo wifi. Miro el log y veo estos errores recurrentemente:
   90.682395] mt7601u 1-1.1:1.0: ASIC revision: 76010001 MAC revision: 76010500
[   90.684079] mt7601u 1-1.1:1.0: Firmware Version: 0.1.00 Build: 7640 Build time: 201302052146____
[   91.066394] mt7601u 1-1.1:1.0: EEPROM ver:0c fae:00
[   91.232416] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.232420] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.236894] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.236897] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.241147] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.241150] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.245395] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.245398] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249689] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.249692] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249694] mt7601u 1-1.1:1.0: Error: mt7601u_mcu_wait_resp timed out
[   91.439297] mt7601u 1-1.1:1.0: Vendor request req:07 off:0080 failed:-71
[   91.605971] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772616] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772671] mt7601u: probe of 1-1.1:1.0 failed with error -110
Buscando en Internet encuentro esta solución. Los pasos descritos son:

1) Descargamos el código fuente del driver:
# wget -O master.zip https://codeload.github.com/jeremyb31/mt7601u-5.3/zip/master
# unzip -x master.zip
2) Entramos en el directorio mt7601u-5.3-master y modificamos a mano el fichero phy.c en los lugares indicados:
En la función mt7601u_init_cal() comentar las líneas:
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_RXIQ, 0);
      // if (ret)
      // return ret;
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->dpd_temp);
      // if (ret)
      // return ret;
En la función mt7601u_phy_recalibrate_after_assoc() comentar las línea:
      // mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->curr_temp);
3) Guardamos y compilamos para crear un fichero mt7601u.ko nuevo con los parches aplicados:
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
4) Una vez hecho esto quitamos el pincho del puerto USB y descargamos el driver de la memoria:
# rmmod mt7601u
5) Cargamos el módulo nuevo y pinchamos el USB otra vez:
# insmod ./mt7601u.ko
Ahora si que se detecta la tarjeta wifi:
# iwconfig
lo        no wireless extensions.

eno1      no wireless extensions.

wlp0s26u1u1  IEEE 802.11  ESSID:"WLAN_985A3D"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: 78:81:02:02:AB:F1   
          Bit Rate=57.8 Mb/s   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=49/70  Signal level=-61 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:128  Invalid misc:1890   Missed beacon:0
Por último solo hay que ponerlo en la ruta del driver original, para que se cargue en cada arranque de forma automática. Para saber la ubicación adecuada del fichero, reiniciamos la máquina y hacemos:
# modinfo mt7601u | grep -i filename
filename:       /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz
En mi caso la ruta es /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz. Comovvemos, está ademas comprimido con formato .xz. Haremos:
# mv /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz.bak
# cp mt7601u.ko /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko
# cd /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless
# xz mt7601u.ko
Y listo, ya todo queda funcionando. Tan solo recordar que si actualizamos el kernel tendremos que repetir estos pasos para regenerar el driver parcheado.

miércoles, 14 de octubre de 2020

Apagado de las redes wifi en puntos DLink con DD-WRT

Con la nueva red "educarex" de escuelas conectadas ya no necesitamos los antiguos puntos wifi DLink DIR-860L. Si los dejamos encendidos saturan el espacio radioeléctrico y ralentizan previsiblemente nuestra red.

Para evitar esto es conveniente apagar sus dos tarjetas de red, la de la red normal de 2.4Ghz y la de la red 5Ghz (no confundir con el 5G del coronavirus y el chís que nos quieren meter con la vacuna). Desde el interface web podemos apagarlas, pero no sé por que motivo a veces se encienden de nuevo y me encuentro que están emitiendo. Así que lo mejor es apagarlas por comandos, entrando por ssh al punto wifi y tecleando:
# nvram set rc_startup="ifconfig ra0 down; ifconfig ba0 down"
# nvram set cron_enable=1
# nvram set cron_jobs="00 * * * *    root   ifconfig ba0 down
00 * * * *    root   ifconfig ra0 down"
# nvram commit
Lo que hacemos es:
  • Apagar ra0 y ba0 (las 2 tarjetas de red) en cada reinicio del sistema.
  • Apagar ra0 y ba0 a cada hora en punto usando un crontab.
Creo que de esta manera lo tenemos todo apagado y si se levanta...caerá en una hora. Habrá que hacer algo útil con todos estos puntos Dlink sin uso cuando los retiremos definitivamente. Lo primero meter un OpenWRT.
El pasado septiembre la Starship SN6 hizo su segundo salto, esta vez de 150 metros de altura:



Que tiempos aquellos en que los inconscientes se reian de ese deposito de agua cilíndrico que explotaba en las pruebas de estrés de presión. Esa maravilla ha ascendido y bajado con un único motor Raptor desviado del eje de simetría de la nave (vamos, "torcido"). El software que controla ese motor para mantener el cohete en equilibrio debe ser bestial.

Configuración de red wifi educarex en sistemas Windows

Bueno, bueno, que paradón. Esta pandemia nos tiene paralizados con tanto trabajo..

Con el programa Escuelas Conectadas nos han instalado una red wifi decente en los centros educativos. Existe un SSID común llamado "educarex" al que se conectan los dispositivos. Los equipos propiedad de los centros que funcionan con Linux se configuran de forma automática mediante una tarea puppet que crea la conexión en el NetworkManager.

Para los equipos con Windows hay que crear la conexión a mano según el manual que nos han distribuido, lo que incluye instalar además un el plugin para PEAP-GTC, que es el sistema de autenticación que usa la red wifi. En Linux, Android y OSX viene de serie, pero en sistemas operativos primitivos como Windows hay que instalarlo.

Aprovecharemos también para instalar un cliente OCS-NG-Windows-Agent-Setup.exe, ya que llevamos un tiempo poniendo OCS Inventory en todas las máquinas del centro para tener un inventario actualizado.

Bueno, pues al hacer la conexión a educarex según el manual facilitado vemos que son un montón de tediosos pasos y decimos...¿todo esto voy a tener que repetirlo para cada Windows? Pues no. De eso va esta entrada del blog. Una vez hemos creado y comprobado que la conexión funciona en una máquina con Windows podemos exportarla a un fichero XML que luego restauraremos en los demás Windows desde un script. Rápido y a prueba de fallos.

El fichero XML se crea desde la consola de Windows con siguiente comando que lo coloca en la carpeta "mia":
netsh WLAN export profile name="educarex" key=clear folder="mia"
Luego ponemos en un pendrive el fichero anterior (renombrado a educarex.xml) junto con EAP-GTC-x64.msi y OCS-NG-Windows-Agent-Setup.exe, descargados de Internet. Creamos el script configura-educarex-windows.bat (mirar al final del artículo varios comentarios que hago sobre el script):
@echo off
echo Instalando software....
echo "Cambiando dominio a vguadalupe"
powershell Add-Computer -WorkGroupName "vguadalupe"
echo "OCS Inventory"
OCS-NG-Windows-Agent-Setup.exe /server="http://puppet3.educarex.es/ocsinventory" /nosoftware /tag="Windows" /now /ssl=0 /S /NOW
rem "C:\Program Files\OCS Inventory Agent>OCSInventory.exe" /force
echo "Driver Wifi"
EAP-GTC-x64.msi /quiet /norestart
echo Creando conexion "educarex"...
Netsh WLAN add profile filename="educarex.xml"
echo Terminado. Ya puede conectarse a "educarex" con las credenciales que desee.
pause
Todo junto en el pendrive queda:
configura-educarex-windows.bat
EAP-GTC-x64.msi
educarex.xml
OCS-NG-Windows-Agent-Setup.exe
Y ya está: al ejecutarlo se siguen todos los pasos y al final tenemos OCS Inventory instalado y sincronizado y, por otro lado, la conexión "educarex" lista para solo meter las credenciales (usuario/contraseña) de configuración.

Comentarios:
  • El comando powershell Add-Computer -WorkGroupName "dominio" es para poner el dominio de nuestro centro de forma adecuada en el Windows, ya que si no OCS Inventory no clasificará correctamente los datos de nuestro centro. Que cada cual ponga el suyo para no interferir con otros centros.
  • El /server="http://puppet3.educarex.es/ocsinventory" es el servidor de OCS Inventory de la red educativa. Lo especificamos como parámetro para que la instalación sea sin preguntar nada.
  • El comando EAP-GTC-x64.msi /quiet /norestart instala el plugin EAP-GTC de forma silenciosa y sin reiniciar.
  • El comando Netsh WLAN add profile filename="educarex.xml" importa la configuración sin que tengamos que hacer nosotros los pasos uno a uno. En las pruebas que he realizado los ficheros XML no parecen compatibles entre versiones de Windows (es decir, el XML de un Windows 7 n se puede importar en un 10).

Una vez acabado ya solo falta pinchar para conectarse a la red wifi educarex. Nos pedirá las credenciales y estas quedarán guardadas de forma permanente en el perfil del usuario de Windows que haya realizado la conexión.
Pedazo selfie:
La sonda china Tianwen 1 rumbo a Marte y en el camino se ha hecho un retrato con su gran angular. Afortunadamente, sigue habiendo países que apuestan por la ciencia.

miércoles, 12 de junio de 2019

Conexión automática a red Wifi

Ahora que llegan las vacaciones viene bien dar un repaso a todos los portátiles de los alumnos: ejecutar puppet, pkgsync, limpiar los usuarios cacheados,... No solo eso, también durante el curso de vez en cuando nos toca actuar sobre todos los portátiles de un armario para aplicar alguna configuración que nos han pedido o que soluciona un bug pendiente.

Hasta ahora para tener conectividad tras encender los portátiles había 2 alternativas:
  1. Conectarlos por red cableada a las tomas del suelo o un switch del aula.
  2. Iniciar sesión en cada uno de ellos y conectarlos manualmente a la red Wifi del aula.
Evidentemente ambas opciones son bastante reiterativas y aburridas. Lo ideal sería que para estos casos los portátiles se conectasen de forma autónoma a una red wifi y nosotros pudiesemos manejarlos de forma masiva con tmux-cssh.

Y esa es la idea de este post: basándome en un script de conexión que usa en su centro nuestro compañero Esteban lo he adaptado para que se conecte de forma autónoma a una red wifi concreta predefinida tan pronto como la detecte.

El código del script es (nota: he corregido algunas erratas en el script el 8/10/2019):
# cat /usr/local/bin/conecta-default-wifi
#!/bin/bash

idioma=$LC_ALL
export LC_ALL=C

wifi_maestra="WIFI_AULAS"
wifi_key="a12345678"
nombre_conexion="ies"

activado=$(nmcli radio wifi)
if [ "$activado" != "enabled" ]
then
    nmcli radio wifi on #activamos la wifi si no lo esta
fi
conectado=$(nmcli dev status | grep wifi |  grep -w -e 'connected' -e "conectado" | awk ' {print $4}')
if  [ "$conectado" != "$nombre_conexion" ]  # Si no estamos conectados a la wifi maestra...
then
      definida=$(nmcli con | grep wifi | grep -w "$nombre_conexion") #Si ya se definió la conexión en network manager la quitamos, para crearla de nuevo cuando nos conectemos
      if [ -n "$definida" ]
      then
          nmcli con delete "$nombre_conexion"conecta-default-wifi
      fi

      detectada=$(nmcli -f SSID,BSSID,SIGNAL,SECURITY dev wifi list | grep -w "$wifi_maestra")
      if [ -n "$detectada" ]  # Si la wifi maestra está al alcance....
      then
            #Si la wifi maestra está al alcance y no estamos en ella, conectamos automaticamente.
            nmcli dev wifi con "$wifi_maestra" password "$wifi_key" name "$nombre_conexion"
            #Si ya existiese la conession podriamos hacer:  nmcli con up $ssidconfigurado
      fi
fi

export LC_ALL=$idioma

exit 0
Que distribuyo con estas reglas puppet:
file {"/usr/local/bin/conecta-default-wifi":
        owner=>root, group=>root, mode=>755,
        source=>"puppet:///modules/xubuntu18_portatil_ajustes/conecta-default-wifi",
}

cron { "cron_conecta_default_wifi":
           command => "/usr/local/bin/conecta-default-wifi",
           user => root,
           minute => "*/3",
           ensure => present
}
Por tanto tenemos un script y una tarea cron que lo llama cada 3 minutos. El script hace lo siguiente:

  1. Configuramos parámetros para una red wifi con SSID "WIFI_AULAS", una clave fija y un nombre de conexión "ies" para el Network Manager.
  2. Si la tarjeta wifi está apagada en Network Manager, se enciende.
  3. Si la wifi está conectada a un punto wifi, mira si el nombre de la SSID es "WIFI_AULAS". En caso afirmativo, finalizamos el script y no continuamos en los pasos siguientes.
  4. Si existe alguna conexión en Network Manager con el nombre "ies", la borramos. Esto es simplemente para hacer limpieza si ya nos habíamos conectado antes.
  5. Escaneamos las redes wifi circundantes en busca de "WIFI_AULAS". Si la encontramos a nuestro alcance nos conectamos a ella creando una conexión "ies" en Network Manager.
  6. Todo esto se repite cada 3 minutos, de tal forma que tan pronto aparezca en el espectro radioeléctrico la wifi "WIFI_AULAS" el portátil se conectará a ella, desconectando de cualquier otra red wifi en la que estuviera enlazado y permaneciendo conectado mientras esté a su alcance.

Con esto el trabajo queda reducido a llegar al aula con un punto wifi (vale cualquier punto de acceso portátil, incluido un router casero de ADSL) configurado con WIFI_AULAS y la clave indicada, enchufarlo a un punto de red cableado, sacar los portátiles del armario y encenderlos.

En pocos minutos todos estarán conectados a la wifi sin ninguna actuación por nuestra parte y con tmux-cssh o ssh podremos controlarlos. Incluso si tenemos puppet y pgksync en modo automático se ejecutarán sin que tengamos que hacer nada. El punto de acceso solo lo usaremos cuando queramos trabajar de esta manera. El resto del tiempo estará apagado y guardado.


Debido a que te encuentras que la gente mas insospechada se niega a creer la gesta del Apolo XI, ahí va el documental definitivo:



jueves, 9 de mayo de 2019

Listar clientes wifi conectados a un punto de acceso OpenWRT/LEDE

Cuanto tenemos un punto de acceso creado desde un dispositivo con OpenWRT o LEDE en el centro educativo puede suceder que se sature porque hay muchos clientes conectados. Es muy útil saber en cualquier momento cuantos clientes tiene asociados nuestro punto, por si fuera necesario hacer una limpieza.

Esto lo haríamos con el comando:
# iw dev wlan0 station dump | grep Station
o bien con:
# iwinfo wlan0 assoclist
Siendo wlan0 la tarjeta wifi sobre la que se monta el punto de acceso. Una vez averiguadas las MACs podemos hacer limpieza expulsando clientes con:
# ubus call hostapd.wlan0 del_client "{'addr':'00:11:22:33:44:55', 'reason':5, 'deauth':false, 'ban_time':0}"

En el último mes Space X nos ha alegrado con el lanzamiento y aterrizaje exítoso de un Falcon Heavy con carga útil (un satélite Arabsat). El despegue:


El aterrizaje de los dos boosters, siempre me queda estremecido esta imagen:


Y el aterrizaje de la etapa central en la barcaza "Of course, I still love you":


Por desgracia, la etapa central cayó al mar por el fuerte oleaje al volver a tierra, ya que falló el anclaje. No volverá a suceder, seguro.

El alucinante vídeo con todo el aterrizaje:

martes, 19 de marzo de 2019

Gestión remota de wifi en un router OpenWRT/LEDE

Tanto en el centro como para usos domésticos tengo varios router con OpenWRT o LEDE donados o recogidos literalmente de la basura. Aunque a veces es dificultoso poner el firmware OpenWRT en los router de las operadoras telefónicas el resultado merece la pena, ya que nos queda un aparatejo con un Linux empotrado y un abanico increíble de posibles usos, una pequeña parte de los cuales ya he tratado aquí. El DD-WRT (primo del OpenWRT) que traen nuestros puntos de acceso D-Link DIR-860L no está mal, pero el OpenwRT es mucho mas versátil, tanto en facilidad de uso como en repositorio de paquetes instalables.

Uno de estos usos es hacerlos funcionar como Puntos de Acceso wifi neutros (Dumb AP) ideales para crear redes wifi por diferentes puntos del edificio.

Al ser un Linux lo que corre por sus entrañas, es sencillo manejar el punto de acceso wifi remotamente desde una aplicación, script y/o consola remota. Ejecutar un comando sobre el router desde otra máquina es tan sencillo como:
# sshpass -p contraseña ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@ip "comando"
Ahora voy a describir 4 secuencias de comandos específicas para manejar la wifi:
  • Encender la wifi:
    wifi up
  • Apagar la wifi:
    wifi down
  • Cambiar la clave de la wifi:
    uci set wireless.@wifi-iface[0].key=clave1234; uci commit wireless;  wifi reload
  • Obtener estado de la wifi (on/off), clave, SSID:
    valor=$(iwinfo | head -1 | wc -l );key=$(uci get wireless.@wifi-iface[0].key);ssid=$(uci get wireless.@wifi-iface[0].ssid);echo $valor:$key:$ssid
Por tanto, para cambiar la clave de la wifi de un punto de acceso desde nuestro PC se haría tecleando:
# sshpass -p contraseña ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@ip "uci set wireless.@wifi-iface[0].key=clave1234; uci commit wireless;  wifi reload"
Con esto queda expuesta la facilidad de manejar estos puntos de acceso remotamente desde cualquier otro entorno con simples comandos. Ahora el límite es nuestra imaginación.



Ya lo sé, tengo debilidad por la Opportunity. Es uno de los aparatos mas condenadamente perfectos que ha hecho nuestra especie.

Su última foto panorámica (hay corrección de color para resaltar los detalles, el tono real es mas rojizo):


Su última foto antes de interrumpir la comunicación (nube de polvo y corte a mitad de la transmisión):


Su próxima foto cuando despierte:

domingo, 24 de febrero de 2019

Activación automática de la wifi en Network Manager

Tengo un aula de portátiles en los que cada cierto tiempo se quejaban de que la wifi dejaba de funcionar. Realmente lo que pasaba es que de alguna forma en el Network Manager se desmarcaba la opción "Activar inalámbrica".

Antes de nada me he aseguré de que no se daba ninguna de las posibles causas:

  • acer_wmi: verifico que esté modulo está blacklistado y no se carga al arrancar. Por algún motivo está documentado que causa apagados de la wifi.
  • ath9k: en mi caso este es el driver que usan las tarjetas wifi. Con "modinfo ath9k" veo que tiene un parametro powersave que activa el ahorro de energia, apagando la wifi. Con este método compruebo que está a 0.
  • /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf: verifico que en este fichero tenemos "wifi.powersave = 2". El valor 2 significa "disabled"

Si aún así se sigue desactivando de forma aleatoria de una manera que no puedo controlar no me queda otra opción que, para facilitar la vida al usuario, hacer que se compruebe el estado cada poco tiempo y activarla si es necesario. Para ello uso un script que se basa en nmcli para interacturar con la tarjeta wifi desde bash.
# cat /usr/bin/watchdog_wifi
#!/bin/bash
while :
do
   estado=$(nmcli radio wifi)
   test "$estado" = "disabled"  && nmcli radio wifi on
   sleep 15
done
exit 0
Es muy sencillo: un bucle infinito que cada 15 segundos comprueba si la wifi está desactivada y la activa en caso afirmativo. Este script se debe ejecutar con la identidad del usuario que ha iniciado sesión, para ello lo mas adecuado es lanzarlo desde /etc/xdg/autosart:
# cat  /etc/xdg/autostart/wifi_watchdog.desktop 
[Desktop Entry]
Version=2.0-2
Encoding=UTF-8
Name=Evita Apagado Wifi
Type=Application
Exec=/usr/bin/wifi_watchdog
Icon=/usr/share/icons/elementary-xfce/status/48/wifi-100.png
Terminal=false
Name[es_ES]=Evita Apagado Wifi
Categories=Application;Education
Con esto el problema se resuelve de forma bastante efectiva.

Aun así puede seguir existiendo un problema: que la wifi se desactive de forma física (hard) mediante el interruptor que tiene el portátil (normalmente una tecla de función mas la tecla Fn). En ese caso no se puede activar por software, pero si se podría detectar está situación usando el programa "rfkill" y mostrar un mensaje al usuario para que pulse de nuevo el interruptor. Ejemplo de wifi bloqueado por botón físico:
# rfkill 
ID TYPE      DEVICE         SOFT         HARD
 0 wlan      phy0   desbloqueado      bloqueado
 1 bluetooth hci0   desbloqueado      desbloqueado
Sería sencillo procesar la salida de rfkill (tiene varios parámetros para filtrar la salida) y si tenemos bloqueada físicamente la wifi lanzar el aviso.


Opportunity ya no responde, hace 10 días que la NASA dió la misión por finalizada. Estoy seguro de que está esperando que alguien llegue, limpie de polvo las placas solares y cambie las baterías para empezar a trabajar de nuevo.

Hagamos un homenaje a esa maravillos máquina y su 45Km recorridos (44 más de los esperados):

Por otro lado, la Curiosity se ha reiniciado tras un fallo inesperado, pero todo va bien. Ya habia pasado antes. Eso de que una máquina tan crítica tenga que hace reinicios es un alivio para cualquier sysadmin. Es buena señal saber que en todas partes cuecen habas.

viernes, 1 de diciembre de 2017

Desactivando la red wifi de 5Ghz en DLink DIR-860L con dd-wrt

Nuestros puntos de acceso DLink traen de serie 2 wifis: la de 2.4Ghz y la de 5Ghz, cada una con SSID y gestión de contraseñas independiente. La mayoría de los portátiles de los que disponemos en los centros solo ven la red de 2.4Ghz y los programas de gestión (SiaticControl y ControlWifi) que tenemos solo manejan esa frecuencia.

Como consecuencia de ello la red de 5Ghz estará ociosa a no ser que la configuremos a mano via ssh o interfaz web. Como algunos de nosotros queremos dejarla apagada en tanto en cuanto no la necesitemos estuve investigando como hacerlo entrando por ssh al DLink.

Lo que hacemos cambiar el SSID y contraseña que trae por defecto dicha red e indicar que el comando "ifconfig ba0 down" se ejecute en el arranque del sistema dd-wrt. El interface "ba0" es el correspondiente a la red de 5Ghz (en el caso de la de 2.4Ghz es "ra0"):
nvram set wl1_ssid=NUEVO_SSID_5GHZ
nvram set wl1_wpa_psk=NUEVA_PASSWORD_5GHZ
nvram set rc_startup="ifconfig ba0 down"
nvram commit
reboot
Y con esto nos despedimos hasta una nueva pildorita sobre nuestros DLink.

lunes, 12 de junio de 2017

Listar MACs de los dispositivos asociados a un punto de acceso con dd-wrt

Una duda más que plantéo hace poco un compañero sobre DD-WRT: como sacar un listado de las MAC address de los equipos asociados por wifi en un momento dado a un punto de acceso DLink DIR-860L. El comando "oficial" es:
# wl assoclist
Por desgracia, eso no funcionaba en nuestros Dlink DIR-860L. Tras buscar un rato al final aparece el comando:
# wl_rt2880 ra0 assoclist
Muestra una lista de MACs asociadas al dispositivo wifi "ra0". Ojo, que al final de la lista aparece una MAC "extra" que no sé de donde sale y que va cambiando en cada llamada al comando. Lo mejor es ignorarla.

El sufijo "_rt2880" puede deberse a que estos puntos de acceso trabajan con chips Ralink. De igual manera, al parecer hay un "wl_atheros" para chipsets Atheros. Mirando el código fuente vemos que el comando tiene además dos parámetros mas: noise y rssi. El compañero Joaquín me cuenta que se usan con esta sintaxis:
# wl_rt2880 noise ..MAC..
# wl_rt2880 rssi ..MAC..
pero que devuelven siempre el mismo valor. Cosas de los Ralink.

Nos vemos en breve para seguir los Proxmox.

viernes, 19 de mayo de 2017

Listar wifis detectadas por un punto de acceso con dd-wrt

Esto ha salido por la pregunta de un compañero, me apunto la chuleta: sacar un listado de las wifis colindantes detectadas por uno de nuestros puntos de acceso que corren dd-wrt. En principio lo normal en Linux/Openwrt es usar "iwlist ra0 scan" para hacer un escaneo de redes, pero en este caso daba un error de que la tarjeta de red no soporta escaneo. No sé si es algo general de dd-wrt o bien es problema del hardware de ese punto de acceso. Buscando un rato encontré esto.
# ifconfig ra0 up
# site_survey
Salen los datos formateados, pero luego con awk o cut podemos coger las columnas que queramos para nuestros propósitos.

miércoles, 26 de abril de 2017

Configuración de OpenWrt como routed client (Parte II)

Continuamos desde aquí. Habíamos decidido que ibamos a usar el router con OpenWrt para conectarlo como cliente a una red wifi preexistente y luego permitir conexión de dispositivos adicionales usando los puertos ethernet del mismo, enrutando el tráfico entre ambas tarjetas de red del router (wifi y ethernet). De esta manera conectamos dos subredes distintas distanciadas físicamente, una que llamaremos "principal" y otra "cliente", mediante un enlace wifi.

En el caso anterior usamos NAT pero esta vez usaremos relayd. No está muy documentado que es lo que hace relayd, pero por sus resultados interpreto que monta un "bridge" virtual entre dos interfaces de red distintos, enrutando el tráfico que entra por cada uno por todos los demás.

¿Cúal es la ventaja de usar relayd respecto a NAT?. Veamos, en la entrada del blog anterior con NAT el esquema de red quedaba así:


Y con relayd nos quedará así:


Como se puede ver, en el caso de relayd los PC de la red "cliente" (la de la izquierda) tienen IP de la misma red que la principal. No hay traducción de direcciones como en NAT. Eso quiere decir que son PC accesibles y podemos, por ejemplo, hacer un ssh o una conexión http hacia ellos desde la red principal. O que ellos pueden acceder a la red principal con protocolos que normalmente no traspasan un NAT, como DLNA/UPnP. Es decir: todos los equipos a ambos extremos de la conexión wifi estarán en la misma red, con la comodidad y posibilidades que eso nos trae.

Bueno, el router usado es un ARV4158 de ya.com. El OpenWrt que le he metido es un Chaos Chalmer descargado de aquí, una estupenda versión de medber que aprovecha hasta el último byte los mermados 4gb del router.

La guía oficial para configurar relayd es esta https://wiki.openwrt.org/doc/recipes/relayclient, y es la que hemos seguido para configurar el router como cliente, con ciertas diferencias:

1) El paso 7 no lo aplico ya que directamente apago el firewall. Estoy dentro de la misma red y no necesito tener un firewall en el router cliente.
# /etc/init.d/firewall stop
# /etc/init.d/firewall disable

2) El paso 8 tampoco lo aplico ya que no repito la red Wifi como hicimos aquí. En este caso, los dispositivos de la red cliente se conectan de forma cableada a su router.

3) No configuro una IP fija al interface stabridge ya que realmente en mi caso no es necesario, por tanto no encontraremos esto en /etc/config/network:
config interface 'stabridge'
    option ipaddr '192.168.1.35'

Repasemos como quedan los ficheros en /etc/config:

El demonio dhcpd está apagado ya que usamos el de la red principal, es absurdo tener un dhcpd en el cliente:
# cat /etc/config/dhcp

config dnsmasq
 option domainneeded '1'
 option boguspriv '1'
 option filterwin2k '0'
 option localise_queries '1'
 option rebind_protection '1'
 option rebind_localhost '1'
 option local '/lan/'
 option domain 'lan'
 option expandhosts '1'
 option nonegcache '0'
 option authoritative '1'
 option readethers '1'
 option leasefile '/tmp/dhcp.leases'
 option resolvfile '/tmp/resolv.conf.auto'
 option localservice '1'

config dhcp 'lan'
 option interface 'lan'
 option start '100'
 option limit '150'
 option leasetime '12h'
 option dhcpv6 'server'
 option ra 'server'
        option ignore '1'

config dhcp 'wan'
 option interface 'wan'
 option ignore '1'

config odhcpd 'odhcpd'
 option maindhcp '0'
 option leasefile '/tmp/hosts/odhcpd'
 option leasetrigger '/usr/sbin/odhcpd-update'
El ssh si lo tenemos activado como no podía ser de otra forma:
# cat /etc/config/dropbear
config dropbear
 option PasswordAuth 'on'
 option RootPasswordAuth 'on'
 option Port         '22'
 option BannerFile   '/etc/banner'
El valor de /etc/config/firewal no tiene importancia ya que como dijimos lo tengo desactivado para siempre mediante:
# /etc/init.d/firewall stop
# /etc/init.d/firewall disable
En /etc/config/network tenemos las interfaces lan (cableada), wwan (inalambrica) y stabridge (hace el relayd entre lan y wwan). Aparte está la interfaz wan de la parte ADSL del router, pero esa la ignoramos:
# cat /etc/config/network

config interface 'loopback'
 option ifname 'lo'
 option proto 'static'
 option ipaddr '127.0.0.1'
 option netmask '255.0.0.0'

config globals 'globals'
 option ula_prefix 'fd52:f0a8:092a::/48'

config interface 'lan'
 option ifname 'eth0'
 option force_link '1'
 option type 'bridge'
 option proto 'static'
 option ipaddr '192.168.2.1'
 option netmask '255.255.255.0'
 option ip6assign '60'
        option gateway '192.168.1.1'
        option dns     '192.168.1.1' 

config interface 'wwan'
 option proto 'dhcp'

config 'interface' 'stabridge'
        option 'proto'      'relay'
        option 'network'    'lan wwan'

config atm-bridge 'atm'
 option vpi '1'
 option vci '32'
 option encaps 'llc'
 option payload 'bridged'

config interface 'wan'
 option ifname 'nas0'
 option proto 'pppoe'
 option username 'foo'
 option password 'bar'
 option ipv6 '1'

config interface 'wan6'
 option ifname '@wan'
 option proto 'dhcpv6'

config adsl 'dsl'
 option annex 'a'
 option firmware '/lib/firmware/adsl.bin'
En /etc/config/wireless tenemos conexión al punto de acceso principal como cliente (option mode 'sta'). En mi caso lo he hecho mediante el interfaz web luci, aunque se puede hacer a mano (pasos 1-2 de la guia oficial) adaptando los parámetros path/channel/sssid/encryption/bssid/key y el que haga falta a nuestro caso.
# cat /etc/config/wireless
config wifi-device 'radio0'
 option type 'mac80211'
 option hwmode '11g'
 option path 'pci0000:00/0000:00:0e.0'
 option txpower '20'
 option country 'ES'
 option disabled '0'
 option channel '10'

config wifi-iface
 option network 'wwan'
 option ssid 'MI_WIFI'
 option encryption 'psk2'
 option device 'radio0'
 option mode 'sta'
 option bssid 'E8:61:63:4E:FF:FA'
 option key 'MI_PASSWORD'
Bueno, pues con esto tenemos conexión directa entre los puntos de ambas redes y salida a Internet para los de la red cliente. Creo que con esto he acabado tocando toda la casuística de redes wifi entre 2 routers OpenWrt. A partir de ahora tendré que complicarme la vida de otra manera.