Con intención reducir aparatos y que dispongo de un router Linux basado en un ordenador con procesador Intel antiguo me puse manos a la obra de deshacerme del router wifi y integrar el acceso WIFI en dicho router.
Nota: Articulo pendiente de revisión, ortográfica,formato, errores, si olvide algo etc
Los resultados fueros un poco decepcionantes y me hicieron recular en el intento por sobretodo un motivo: cobertura de la señal.
En un primer momento descarté los dispositivos USB, prefería todo dentro de la caja sin nada que sobresaliese (bueno salvo las antenas que ahí no hay remedio), por lo que estuve viendo las tarjetas PCI-E.
Mi primera opción fue ir a una de las más potentes por un precio bastante adecuado, era una tarjeta basada en el chip Intel AX200 que prometía 802.11AC y 2x2 MIMO, dicha tarjeta como cliente era detectada por Linux sin demasiados problemas (Kernel >5.4) pero tenía un problema gordo, la tarjeta no emitía en modo AP en la banda de los 5Ghz.
Este problema como descubrí a posteriori es bastante común, como las regulaciones de emisiones en las diferentes bandas de 5Ghz entre diferentes países difieren y las versiones que se compran son “World” o sea para todo el mundo al final tenemos todas las bandas 5G capada y aunque hay opción de establecer el país al final los firmwares vienen capados.
Buscando esta información descubrí que las tarjetas Atheros al contrario que las Intel se pueden descapar a nivel de drivers del kernel,así que mi siguiente compra fue una Atheros QCA9377 802.11AC. Compre una mini-pci y un adaptador pci para así poder cambiar la tarjeta si hiciera falta con menor coste.
Esta es la salida de lspci –v:
01:00.0 Network controller: Qualcomm Atheros QCA9377 802.11ac Wireless Network Adapter (rev 31) Subsystem: AzureWave QCA9377 802.11ac Wireless Network Adapter Flags: bus master, fast devsel, latency 0, IRQ 43 Memory at f7a00000 (64-bit, non-prefetchable) [size=2M] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable+ Count=1/8 Maskable+ 64bit- Capabilities: [70] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [148] Virtual Channel Capabilities: [168] Device Serial Number 00-00-00-00-00-00-00-00 Capabilities: [178] Latency Tolerance ReportingComo comprobé por defecto venia capada también Tecleando “iw list” y viendo la banda 2 que es la de 5G
Frequencies: * 5180 MHz [36] (17.0 dBm) (no IR) * 5200 MHz [40] (17.0 dBm) (no IR) * 5220 MHz [44] (17.0 dBm) (no IR) * 5240 MHz [48] (17.0 dBm) (no IR) * 5260 MHz [52] (24.0 dBm) (no IR, radar detection) * 5280 MHz [56] (24.0 dBm) (no IR, radar detection) * 5300 MHz [60] (24.0 dBm) (no IR, radar detection) * 5320 MHz [64] (24.0 dBm) (no IR, radar detection) * 5500 MHz [100] (24.0 dBm) (no IR, radar detection) * 5520 MHz [104] (24.0 dBm) (no IR, radar detection) * 5540 MHz [108] (24.0 dBm) (no IR, radar detection) * 5560 MHz [112] (24.0 dBm) (no IR, radar detection) * 5580 MHz [116] (24.0 dBm) (no IR, radar detection) * 5600 MHz [120] (24.0 dBm) (no IR, radar detection) * 5620 MHz [124] (24.0 dBm) (no IR, radar detection) * 5640 MHz [128] (24.0 dBm) (no IR, radar detection) * 5660 MHz [132] (24.0 dBm) (no IR, radar detection) * 5680 MHz [136] (24.0 dBm) (no IR, radar detection) * 5700 MHz [140] (24.0 dBm) (no IR, radar detection) * 5720 MHz [144] (24.0 dBm) (no IR, radar detection) * 5745 MHz [149] (30.0 dBm) (no IR) * 5765 MHz [153] (30.0 dBm) (no IR) * 5785 MHz [157] (30.0 dBm) (no IR) * 5805 MHz [161] (30.0 dBm) (no IR) * 5825 MHz [165] (30.0 dBm) (no IR) * 5845 MHz [169] (disabled)
Así que lo primero fue descaparla y esto consiste en editar código en el módulo de atheros del kernel, compilarlo y instalarlo, pero también se puede hacer sin instalar ni compilar un nuevo kernel enteramente.
Mi sistema es un Intel con Ubuntu y un kernel 5.4.0-48-generic, me base en este hilo con que a su vez está basado en patch de OpenWRT con algunos cambios: https://github.com/twisteroidambassador/arch-linux-ath-user-regd/issues/1 Siempre que en los comandos veamos esa versión del kernel deberéis substituirla por la vuestra. Asumo que tenéis instalado hostapd y las herramientas esenciales para compilar un kernel.
Los cambios en el código a pesar de ser un kernel bastante más antiguo cuaja sin modificaciones:
1º Nos bajamos el linux-source-5.4.0 y descomprimimos en /usr/src
2º Una vez descomprimido entramos en /usr/src/linux-source-5.4.0
3º Los archivos a editar son dos, el primero localizado en: drivers/net/wireless/ath/regd.c
Para los que no están acostumbrados hay que añadir las líneas que empiezan por + pero sin en el +
Parte 1:
static void ath_reg_apply_beaconing_flags(struct wiphy *wiphy, struct ath_regulatory *reg, enum nl80211_reg_initiator initiator) { enum nl80211_band band; struct ieee80211_supported_band *sband; struct ieee80211_channel *ch; unsigned int i; +#ifdef CONFIG_ATH_USER_REGD + return; +#endif for (band = 0; band < NUM_NL80211_BANDS; band++) { if (!wiphy->bands[band]) continue; sband = wiphy->bands[band]; for (i = 0; i < sband->n_channels; i++) { ch = &sband->channels[i]; __ath_reg_apply_beaconing_flags(wiphy, reg, initiator, ch); } } }
Parte 2
static void ath_reg_apply_ir_flags(struct wiphy *wiphy, struct ath_regulatory *reg, enum nl80211_reg_initiator initiator) { struct ieee80211_supported_band *sband; +#ifdef CONFIG_ATH_USER_REGD + return; +#endif sband = wiphy->bands[NL80211_BAND_2GHZ]; if (!sband) return;
Parte 3
static void ath_reg_apply_radar_flags(struct wiphy *wiphy) { struct ieee80211_supported_band *sband; struct ieee80211_channel *ch; unsigned int i; +#ifdef CONFIG_ATH_USER_REGD + return; +#endif if (!wiphy->bands[NL80211_BAND_5GHZ]) return; sband = wiphy->bands[NL80211_BAND_5GHZ];
Parte 4
static int ath_regd_init_wiphy(struct ath_regulatory *reg, struct wiphy *wiphy, void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request)) { const struct ieee80211_regdomain *regd; wiphy->reg_notifier = reg_notifier; +#ifdef CONFIG_ATH_USER_REGD + return 0; +#endif wiphy->regulatory_flags |= REGULATORY_STRICT_REG | REGULATORY_CUSTOM_REG; if (ath_is_world_regd(reg)) {
El otro archivo a editar es:
drivers/net/wireless/ath/Kconfig
if WLAN_VENDOR_ATH +config ATH_USER_REGD + bool "Do not enforce EEPROM regulatory restrictions" + default n config ATH_DEBUG bool "Atheros wireless debugging" ---help--- Say Y, if you want to debug atheros wireless drivers. Right now only ath9k makes use of this.
Con esto tenemos todo listo.
Tecleamos lo siguiente comandos que difieren del enlace comentado, si tenemos que montar /boot lo montamos con mount /boot :
make clean && make mrproper cp /lib/modules/5.4.0-48-generic/build/Module.symvers ./ cp /boot/config-5.4.0-48-generic /usr/src/linux-source-5.4.0/.config
Editamos el Makefile para que coincida con nuestra versión de compilación del kernel que es -48-generic
nano /usr/src/linux-source-5.4.0/Makefile
Y las primeras líneas quedaran así:
# SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 SUBLEVEL = 0 EXTRAVERSION = -48-generic NAME = Kleptomaniac Octopus
Luego tecleamos
make oldconfig
Y nos hará una pregunta que responderemos con [y]
Wireless LAN (WLAN) [Y/n/?] y ADMtek devices (WLAN_VENDOR_ADMTEK) [Y/n/?] y ADMtek ADM8211 support (ADM8211) [M/n/?] m Atheros/Qualcomm devices (WLAN_VENDOR_ATH) [Y/n/?] y Do not enforce EEPROM regulatory restrictions (ATH_USER_REGD) [N/y]Luego tecleamos:
make prepare make script
Toca compilar el modulo con:
pre class=term] make M=drivers/net/wireless/ath [/pre]Una vez compilado sobrescribimos el anterior (hacer copia por si os saltasteis algún paso y no os va)
cp -f drivers/net/wireless/ath/ath.ko /lib/modules/5.4.0-48-generic/kernel/drivers/net/wireless/ath/ath.ko
Y por ultimo
depmod –a
Reiniciamos o mejor desinstalamos el modulo antiguo
modprobe –r ath10k_pci modprobe ath10k_pci
Si os da algún error es que os saltasteis algún paso.
La salida iw list ahora muestra descapados, pero antes de mostrarla vamos a cambiar el país que el firmware nos permitirá una u otra banda/potencia.
Esto se hace coniw reg get
para obtener el país actual y
iw reg set ES
para establecerlo. En mi caso pondré BO por que podremos emitir a 30dbm
Si queremos establecerlo en inicio tenemos que editar /etc/default/crda :
REGDOMAIN=BO
Y esta es la actual salida de las frecuencias de la banda de 5gh de iw list
Frequencies: * 5180 MHz [36] (disabled) * 5200 MHz [40] (disabled) * 5220 MHz [44] (disabled) * 5240 MHz [48] (disabled) * 5260 MHz [52] (30.0 dBm) (radar detection) * 5280 MHz [56] (30.0 dBm) (radar detection) * 5300 MHz [60] (30.0 dBm) (radar detection) * 5320 MHz [64] (30.0 dBm) (radar detection) * 5500 MHz [100] (disabled) * 5520 MHz [104] (disabled) * 5540 MHz [108] (disabled) * 5560 MHz [112] (disabled) * 5580 MHz [116] (disabled) * 5600 MHz [120] (disabled) * 5620 MHz [124] (disabled) * 5640 MHz [128] (disabled) * 5660 MHz [132] (disabled) * 5680 MHz [136] (disabled) * 5700 MHz [140] (disabled) * 5720 MHz [144] (disabled) * 5745 MHz [149] (30.0 dBm) * 5765 MHz [153] (30.0 dBm) * 5785 MHz [157] (30.0 dBm) * 5805 MHz [161] (30.0 dBm) * 5825 MHz [165] (30.0 dBm) * 5845 MHz [169] (disabled) * 5865 MHz [173] (disabled)
Como vemos ahora si.
Lo siguiente será hostapd
Para crear un punto de acceso con hostapd hay que tener varias cosas en cuenta.
hostapd no configura la IP del AP
hostapd no administrar las IPs de los clientes, necesitamos dhcpd (en mi caso isc-dhcpd-server)
Las tarjetas WIFI salvo algún extraño caso que leí solo disponen de una radio, o sea solo pueden emitir en 2G o 5G, si queremos emitir en las dos bandas necesitaremos dos tarjetas.
En mi caso la interface wifi se llama wls1p0, la primera una ele y la segunda un 1, en este texto se ve claramente en una terminal no.
En /etc/network/interfaces configuramos dicha interface
En mi caso quedo así:
auto wlp1s0 iface wlp1s0 inet static # hostapd /etc/hostapd/hostapd.conf address 192.168.5.1 netmask 255.255.255.0 dns-nameservers 192.168.5.1 dns-nameservers 8.8.8.8
La línea hostapd esta comentada por que para las pruebas lo arranco manualmente. El dns-nameserver esta apuntado a 192.168.5.1 porque tengo un servidor dns, poner 1.1.1.1 o el que queráis.
Lo siguiente es configurar dhcpd, no explicare como configurar todo ya que voy a suponer que ya tenéis un servidor corriendo con dhcpd, si no hay guías para comenzar desde 0
En /etc/defauilt/isc-dhcp-server añadimos la interface que queremos escuchar (en mi caso tengo otro también)
INTERFACES="enp6s0 wlp1s0"
Y en /etc/dhcp/dhcpd.conf configuramos como queremos que dhcpd funcione con esa interface, en mi caso:
subnet 192.168.5.0 netmask 255.255.255.0 { authoritative; option routers 192.168.5.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.5.255; option domain-name-servers 192.168.5.1; option domain-name "wlp1s0.lan"; default-lease-time 600; max-lease-time 7200; range 192.168.5.125 192.168.5.254; }
Por ultimo toca configurar el propio hostapd en /etc/hostapd/hostapd.conf
interface=wlp2s0 driver=nl80211 logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ctrl_interface=/var/run/hostapd ctrl_interface_group=0 ssid=CasaTest country_code=BO ieee80211d=1 ieee80211h=0 hw_mode=a channel=0 beacon_int=100 dtim_period=2 max_num_sta=255 rts_threshold=-1 fragm_threshold=-1 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wmm_enabled=1 wmm_ac_bk_cwmin=4 wmm_ac_bk_cwmax=10 wmm_ac_bk_aifs=7 wmm_ac_bk_txop_limit=0 wmm_ac_bk_acm=0 wmm_ac_be_aifs=3 wmm_ac_be_cwmin=4 wmm_ac_be_cwmax=10 wmm_ac_be_txop_limit=0 wmm_ac_be_acm=0 wmm_ac_vi_aifs=2 wmm_ac_vi_cwmin=3 wmm_ac_vi_cwmax=4 wmm_ac_vi_txop_limit=94 wmm_ac_vi_acm=0 wmm_ac_vo_aifs=2 wmm_ac_vo_cwmin=2 wmm_ac_vo_cwmax=3 wmm_ac_vo_txop_limit=47 wmm_ac_vo_acm=0 ieee80211n=1 ht_capab=[MAX-AMSDU-7935][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40][RX-STBC1][LDPC] ieee80211ac=1 vht_capab=[MAX-MPDU-11454][SHORT-GI-80][RXLDPC][SU-BEAMFORMEE] vht_oper_chwidth=1 eapol_key_index_workaround=0 eap_server=0 own_ip_addr=127.0.0.1 wpa=3 wpa_passphrase=esto-es-una-clave-larga wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP CCMP rsn_pairwise=CCMP
No explicare en detalle todo (googlear) pero si varios puntos
Para 5GHZ:
hw_mode=a ieee80211n=1 ieee80211ac=1
Con vht_oper_chwidth=1
Establecemos el ancho del canal, 0 (40) 1(80), en mi caso 80Mhz, no siempre se puede los ap normales incluso aunque pongamos 80Mhz o 40Mhz si vives en un sitio congestionado automática reducirá el ancho del canal, en mi caso no hay problema Los valores ht_capab y vht_capab dependen de la tarjeta los sacamos con el comando “iw list”
En mi caso:
Band 2: Capabilities: 0x196f RX LDPC HT20/HT40 SM Power Save disabled RX HT20 SGI RX HT40 SGI RX STBC 1-stream Max AMSDU length: 7935 bytes DSSS/CCK HT40 ... VHT Capabilities (0x33907132): Max MPDU length: 11454 Supported Channel Width: neither 160 nor 80+80 RX LDPC short GI (80 MHz) SU Beamformee MU Beamformee RX antenna pattern consistency TX antenna pattern consistency
Finalmente arrancamos y ya tenemos nuestro punto de acceso creado
hostapd -d /etc/hostapd/hostapd.conf
Al poner channel=0 hostapd buscara el canal legal más acorde (dentro de lo no adecuado de estar en España y utilizar BO como país.
La salida de “ip”
wlp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 40:9f:38:1e:fa:e9 brd ff:ff:ff:ff:ff:ff inet 192.168.5.1/24 brd 192.168.5.255 scope global wlp1s0 valid_lft forever preferred_lft foreverLa salida de iwconfig wlp1s0
wlp1s0 IEEE 802.11 Mode:Master Tx-Power=30 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on
Consideraciones finales:
Mi idea fracaso principalmente por la cobertura, mucho menos que el AP que tengo, a pesar de que teóricamente está transmitiendo a una potencia de 30dbm cuando lo normal es que anden sobre los 20dbm, y aunque mi AP chino creo que también se lo salta y me da mucha mejor cobertura, probé con otros comerciales (baja gama) y el amplificador de Movistar y ambos tienen mejor cobertura.
Probé cambiando las antenas, las que se insertan directamente y otras que me vinieron en una de las tarjetas que se conecta un cable y las antenas tienen si propio stand, aparte de otras que tenía en cajón, todo sin éxito, así que de momento sin dar por cerrado totalmente el tema si queda aparcado con mal sabor de boca y en espera de darle unas cuentas vueltas al asunto (muchas no le di)