Pregunta:
Cree automáticamente un punto de acceso si no hay una red disponible
jake
2019-07-02 02:53:47 UTC
view on stackexchange narkive permalink

Quiero crear automáticamente un punto de acceso, si no se encuentra una red, para poder conectarme a mi Raspberry Pi en todas partes.

Si nadie está conectado al hotspot durante un tiempo, debería buscar las redes definidas en wpa_supplicant.conf nuevamente.

No quiero instalar cualquier software adicional y utilizar solo wpa_supplicant , wpa_cli y systemd-networkd .

One responder:
jake
2019-07-02 02:53:47 UTC
view on stackexchange narkive permalink

Primero debemos cambiar completamente a systemd (que podría ser el futuro de todos modos), como Ingo ha explicado aquí:

  # desinstalar la red clásica sudo -Es # si aún no lo ha hecho apt --autoremove purge ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslogapt-mark hold ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog raspberrypi-net-mods openresolvrm -r / etc / network / etc / dhcp # setup / enable systemd-resuelto y systemd-networkdapt --autoremove purge avahi-daemonapt-mark hold avahi -daemon libnss-mdnsapt install libnss-resolveln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.confsystemctl habilitar systemd-networkd.service systemd-resident.service  

1. Configure wpa_supplicant×

Su wpa_supplicant-wlan0.conf debería verse así:

  country = FRctrl_interface = DIR = / var / run / wpa_supplicant GROUP = netdevupdate_config = 1ap_scan = 1 ### tu punto de acceso / hotspot ### network = {ssid =" RaspberrypiAP "# tu hotspot name mode = 2 key_mgmt = WPA-PSK psk = "passphrase" # frecuencia de la contraseña de tu hotspot = 2462} ### tu (s) red (s) ### red = {prioridad = 10 # agrega una prioridad superior a 0 a cualquier ssid de red = "yourWifi" # ¡excepto el del punto de acceso! psk = "passphrase"} 

Tenemos que agregar un priority = mayor que 0 a cualquier sección de la red excepto la del hotspot, entonces wpa_supplicant los preferirá. Solo si no se encuentra ninguna de estas redes, wpa_supplicant creará un punto de acceso / hotspot. Si wpa_supplicant ha creado un hotspot, la interfaz debe tener una dirección estática y necesitamos un servidor DHCP, para que podamos conectar nuestros dispositivos a él. Esto lo hará systemd-networkd .


2. Configure la interfaz inalámbrica con systemd-networkd 0000-

Necesitamos crear los siguientes archivos. El primero configurará su dispositivo como cliente, el segundo como punto de acceso. El primero es el predeterminado debido al número más pequeño.

sudoedit /etc/systemd/network/08-CLI.network

  [Match] Name = wlan0 [Red] DHCP = yesLinkLocalAddressing = yesMulticastDNS = yes  

sudoedit / etc / systemd / network / 12-AP .network

  [Match] Name = wlan0 [Network] Address = 192.168.4.1 / 24DHCPServer = yesLinkLocalAddressing = yesMulticastDNS = yes  código> 

3. Configure un systemd.service para configurar automáticamente la interfaz basada en wpa_supplicant eventos

Este servicio ejecutará wpa_cli , que ejecuta el siguiente script en ciertos eventos.

Ejecute sudo systemctl edit --full --force wpa_cli@wlan0.service y pegue las siguientes líneas en él:

  Description = Wpa_cli para crear automáticamente un punto de acceso si no hay una conexión de cliente disponible Después = wpa_supplicant @% i.serviceBindsTo = wpa_supplicant @% i.service [Servicio] ExecStart = / sbin / wpa_cli -i% I -a /usr/local/bin/autoAP.shRestart=on-failureRestartSec=1[Install]WantedBy=multi-user.target

4. El script necesario para el servicio

Este script debe guardarse en la ruta definida en la sección ExecStart = . Configurará el dispositivo como cliente si está conectado a algún wifi, o como punto de acceso si wpa_supplicant ha creado uno, lo que hará automáticamente si no se encuentra otra red.

Si nadie está conectado al punto de acceso durante un tiempo, se reiniciará wpa_supplicant para que vuelva a buscar redes wifi.

sudoedit / usr / local / bin / autoAP. sh

  #! / bin / bashdevice = wlan0configure_ap () {if [-e /etc/systemd/network/08-CLI.network]; luego mv /etc/systemd/network/08-CLI.network /etc/systemd/network/08-CLI.network~ systemctl restart systemd-networkd fi} configure_client () {if [-e / etc / systemd / network / 08 -CLI.network ~] && wpa_cli -i $ estado del dispositivo | grep -q "modo = estación"; luego mv /etc/systemd/network/08-CLI.network~ /etc/systemd/network/08-CLI.network systemctl restart systemd-networkd fi} reconfigure_wpa_supplicant () {sleep "$ 1" if ["$ (wpa_cli -i $ dispositivo all_sta) "=" "]; luego wpa_cli -i $ device reconfigure fi} case "$ 2" in # Configure access point si se crea uno AP-ENABLED) configure_ap reconfigure_wpa_supplicant 2m & ;; # Configurar como cliente, si está conectado a alguna red CONECTADO) configure_client ;; # Reconfigure wpa_supplicant para buscar su wifi nuevamente, # si nadie está conectado al ap AP-STA-DISCONNECTED) reconfigure_wpa_supplicant 20 & ;; esac  

Haga que el script sea ejecutable chmod + x /path/to/script/autoAP.sh.

Ahora tenemos que ejecutar sudo systemctl enable --now wpa_cli@wlan0.service , reiniciar el Pi y todo debería funcionar.

También creé un repositorio github para esto, desde donde podrías instalarlo muy fácilmente.

Estaré encantado de cualquier sugerencia sobre cómo mejorar esta configuración.

Desde Raspbian 2019-04-08, ya no necesita instalar rng-tools. Hay un error tipográfico. Para los archivos de red, usa `/ lib / systemd / network /` pero en el script usa `/ etc / systemd / network /`. No necesita `network.target` si usa` network-online.target` pero no importa. `Type = simple` es el predeterminado. Hay algunas ideas muy bonitas. Gracias por eso.
Gracias, @Ingo, ¡Lo edité! Estoy usando `/ etc / systemd / network / 08-CLI.network` para enmascarar el archivo en` / lib / ... `. ¿Crees que es mejor cambiarle el nombre?
Tiendo a usar systemctl para controlar los servicios debido a la estabilidad. Así que no he echado un vistazo detallado a los enlaces y no puedo decir mucho sobre ellos, pero evito tocar cosas en `/ lib /`.
@Ingo Pero no puedes administrar archivos .network con `systemctl`, ¿verdad? Pero tal vez sea mejor deshabilitar `08-Client.network` con un archivo desplegable y mover todo a` / etc / systemd / network`. Probaré esto.
Los archivos y enlaces de red son administrados por systemctl. Por lo que tengo entendido, su script, verifica el estado de un servicio y lo inicia y detiene. Puede hacerlo con `systemctl is-active my.service` y` systemctl [en / dis] able --now my.service`.
¡Esto es genial! Gracias por la reseña. Lo tengo funcionando aquí. Un par de comentarios: 1) Cambiar a red resuelto no parece obligatorio según mis pruebas (limitadas). No he ordenado cómo pasar la configuración del dominio de búsqueda con mis direcciones dhcp-to-preasignados. Sigo investigando, porque me gustaría llegar allí. 2) Al comando 'ln' le falta una 'f' al final (debería ser '.conf'). 3) Error tipográfico en los comentarios: wpa_supllicant-wlan0.conf. 4) Por último, algún tipo de convención de nomenclatura para scripts y archivos conf puede ser útil, pero no obligatorio.
Ah, encontré una solución para mi problema. He configurado dhcp para proporcionar direcciones asignadas fijas (use IP X para la dirección MAC Y). systemd-resuelto no solicita la opción de dominio de búsqueda, pero se maneja correctamente si vuelve. Entonces, según una respuesta en https://github.com/systemd/systemd/issues/8174, puedo usar la opción dhcp-parameter-request-list 1,3,6,12,15,42,119; (siendo 119 el impt) para los hosts afectados, y todo está bien. Tengo una herramienta para administrar la base de datos de configuración dhcp, por lo que es bastante sencilla. ¡Gracias de nuevo!
@Ingo,, ¿podría decir con qué comandos puede administrar archivos .network? No pude encontrarlos. No quiero iniciar o detener servicios, sino reconfigurar la interfaz dependiendo de su estado (modo administrado o ap). Si hay una mejor manera de mover el archivo, ¡dímelo!
Ah, ahora entiendo que mueves los archivos de configuración en `/ etc / systemd / network /`. No lo había visto antes. Olvida mi comentario sobre eso. He mirado los enlaces simbólicos en `/ etc / systemd / system /`, una confusión. Si dice que no desea iniciar o detener servicios: reinicia la configuración de red completa con todos los servicios que dependen de cada cambio. Si modifica la configuración de red (como lo hace), entonces se recomienda ejecutar `sudo systemctl daemon-reload` pero si funciona sin él, puede que no sea necesario en su caso.
¿No es también una solución tener el punto de acceso siempre encendido y permitir que wpa_supplicant solo haga el roaming con sus conexiones de cliente como de costumbre? Para tener algunas ideas más, debería configurar su solución, pero ahora tengo algunos problemas con el nuevo RPi 4. Volveré pronto a su configuración. Ahora no entiendo por qué esta conmutación no funciona automágicamente con la prioridad de los bloques de red en wpa_supplicant.conf.
@Ingo ¡Eso sería genial! wpa_supplicant no retrocede si el punto de acceso está habilitado una vez, o al menos no sé cómo decirle que haga eso. Y, por supuesto, necesito reconfigurar la interfaz entonces. Tampoco me gusta hacerlo reiniciando systemd-networkd, pero no pude encontrar una mejor manera. Gracias por ayudar Creo que mucha gente estaría contenta con una solución simple para eso (encuentro volumios 300 líneas de JavaScript un poco exagerado).
Pero me gusta usar un RPi 4B, así que puedo ver su nuevo hardware. Una comparación visual de `iw phy` con un RPi 3B + no muestra ninguna diferencia relevante en la configuración wifi. Mi esperanza era que RPi 4B admita WDS para puentear conexiones de clientes, pero parece que no es el caso. Pero eso no es tema aquí ... Y tengo [otro proyecto] (https://raspberrypi.stackexchange.com/questions/92557/how-can-i-use-an-init-ramdisk-initramfs-on-boot- up-raspberry-pi / 100261 # comment165011_100261) en la tubería
Basado en mi conocimiento (ciertamente no profundo) de systemd, creo que la implementación es bastante elegante y "simplemente funciona". Además, he encontrado un caso de uso maravilloso para él. Cuando hago una tarjeta para una nueva Pi, la coloco en su lugar y me aseguro de que no se una a mi red. Una vez que arranca el nuevo Pi, puedo unirme a la red Pi AP y configurar el Pi, además de agregarlo a mi infraestructura dhcp / bind. Esto es genial porque no tengo que conectar un monitor en absoluto ... solo use ssh o VNC para conectarme al AP.
@bls ¡Gracias! Eso es exactamente lo que hice, que puede acceder y configurar su dispositivo sin cabeza sin importar si escribió una contraseña wifi incorrecta o no, etc. ¡Me alegro de que funcione para usted!
@jake Todavía no entiendo por qué cambiar el punto de acceso cuando se establece una conexión de cliente. ¿Por qué?
@ingo Una vez, supongo, en este escenario, el punto de acceso tiene el único propósito de hacer que el dispositivo sea accesible si no está conectado a ninguna red.
@user5950 Pero de nuevo: ¿por qué apagarlo? Si siempre está encendido, siempre puedes conectarte a él. El punto de acceso no debe desconectarse para establecer además una conexión de cliente.
@Ingo Sé que puede tener una interfaz virtual generando un punto de acceso al mismo tiempo. Pero, ¿por qué debería estar allí si no es necesario? Creo que es bueno tener una configuración simple para esto, para que pueda acceder a su pi incluso si ingresó una contraseña incorrecta, etc., y mantenga el entorno limpio de los puntos de acceso innecesarios; pero tal vez estos pensamientos estén un poco pasados ​​de moda, cuando cada bombilla tiene su propio punto de acceso ahora. En realidad, quería encontrar una solución mejor que la de volumio. Básicamente hacen lo mismo, pero su servicio retrasa el proceso de arranque durante medio minuto en un RPI 0.
@ingo Si usa una linterna en un ambiente oscuro, para reemplazar un fusible roto, seguro que puede dejar la linterna encendida después de reemplazarla.
@jake Preguntó cómo evitar reiniciar la pila de red completa con `systemctl restart systemd-networkd` en cada cambio de red. Debería poder usar ** wpa_cli ** para administrar las conexiones. Con `wpa_cli -h | less` encontrará muchas opciones útiles. reassociate, reattach, select_network y otras son opciones interesantes para administrar conexiones manuales.
@user5950 Sí, ahora comprendo que apagar un servicio innecesario es un requisito válido.
Noté que @jake's GitHub ha sido eliminado. Tomé el código aquí, arreglé la lógica de espera / reconfiguración y construí un instalador para él. Está en https://github.com/gitbls/autoAP. El README tiene una buena descripción de cómo funciona, y proporcioné un script para cambiar de dhcpcd o Network Manager a systemd-networkd.
@bls Bueno, no lo es. Acabo de renombrarlo y olvidé actualizar aquí, ¡pero me alegro de que estés usando el código!
¡Ah! ¡Ahí está! ¡Gracias!


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 4.0 bajo la que se distribuye.
Loading...