jueves, 9 de octubre de 2014

Crear una red WiFi a partir de una red cableada


Después de haberlo comentado en la presentación del blog, me ha parecido buena idea comenzar fuerte y dedicar el primer tutorial (de una larga lista, espero) a explicar cómo podemos crear una red WiFi que sea accesible desde cualquier dispositivo (portátil, smartphone, consola...) cuando lo único que tenemos es una conexión cableada que nos resulta insuficiente para nuestras necesidades.

Realizaré la explicación de todos estos pasos desde Linux Mint, por lo que ya sabéis que funcionará perfectamente en Ubuntu y, muy probablemente, también en Debian. Aviso que ésta va a ser una entrada muy larga, aunque los pasos no tienen pérdida y el resultado final merecerá la pena.

Según tengo entendido, existen en Windows varias opciones (Connectify parece ser bastante popular) para compartir nuestra conexión cableada vía WiFi (también conocido como crear un hotspot o punto de acceso). Sin embargo, si somos usuarios habituales de Linux y, como en mi caso, reservamos Windows únicamente para jugar, tener que arrancar dicho sistema para poder compartir la conexión a internet puede ser bastante molesto y frustrante.
Algunos podréis pensar que Linux ya trae de por si un botón para crear hotspots, véase la siguiente captura como ejemplo en el panel de control de redes de Gnome:


Sin embargo, tengo ya comprobado que, dado que la red WiFi que se crea activando esta opción es de tipo «ad-hoc» en lugar de tipo «infraestructura», la misma resulta indetectable para los teléfonos Android y Windows Phone (no tengo noticias de si con iOS funciona), por lo que es más que probable que no nos sirva para absolutamente nada.

Nuestra solución pasa por crear una red WiFi de tipo infraestructura, convirtiendo nuestro ordenador en el router de la misma, y los programa que nos ayudarán en esta tarea se llaman hostapd y dhcp-server.

Abrimos pues un terminal y tecleamos:

Con los programas ya instalados, vamos a indicarle a hostapd desde dónde deberá coger el fichero de configuración cuando arranque automáticamente con el sistema. Para ello escribimos:

Buscamos la línea DAEMON_CONF, la descomentamos, la dejamos como sigue y guardamos el fichero:

Ahora, crearemos la que será la configuración principal de nuestro WiFi (SSID, contraseña, canal, etc.):

En este nuevo archivo recién creado copiamos y pegamos lo siguiente, modificando los valores de los atributos ssidwpa_passphrase (la contraseña debe ocupar entre 8 y 63 caracteres o no funcionará nada de lo que hagamos):

Es posible, aunque improbable, que sea necesario también cambiar el valor del atributo interface a otro distinto en caso de que nuestra interfaz de red inalámbrica no sea wlan0. Podemos consultar la misma con una simple instrucción de terminal:

donde veremos una salida parecida a la siguiente:


La mayoría de las veces será wlan0, pero por si acaso podemos confirmarlo de esta sencilla forma.

Ahora deberemos editar otro fichero de texto para indicarle también cuál es nuestra interfaz de red inalámbrica:

Al final del archivo encontraremos una línea donde pondrá INTERFACES="" que deberemos modificar para dejarla así: INTERFACES="wlan0"

El siguiente paso es editar el archivo dhcpd.conf donde configuraremos la estructura de la red que crearemos (máscara, direcciones IP, etc.)

Al abrir el archivo, comentaremos algunas de las líneas que en él aparecen y escribiremos debajo nuestra configuración, quedando el resultado como sigue:

En la configuración que hemos puesto, y que puede ser perfectamente modificada para adaptarse al gusto de cada uno, se indica que la IP local de nuestro PC (el router) dentro de la red WiFi será 10.10.0.1 y que se permite la conexión como máximo a otros 15 dispositivos cuyas direcciones IP van desde la 10.10.0.2 hasta la 10.10.0.16. Igualmente, hemos especificado que se utilicen los servidores DNS de Google, a saber, 8.8.8.8 y 8.8.4.4.

Ya casi hemos acabado el tutorial. Solo quedan unos pocos pasos, y lo que toca en este momento es editar el fichero interfaces:

Normalmente, si no hemos editado nunca este archivo, deberíamos ver tan solo tres líneas hablando de la interfaz de loopback. Sin importar lo que ponga, debajo de las mismas añadiremos la nueva información relativa a cuáles serán los parámetros que deberá utilizar a partir de ahora nuestra interfaz wlan0 (si en algún momento queremos volver a utilizar el WiFi y dejar de ser un punto de acceso, bastará con comentar dichas líneas). Al final el archivo global debería verse parecido a lo siguiente:

Llegados a este punto, si reiniciáramos el ordenador, cualquier dispositivo podría ya conectarse a nuestra nueva recién creada red WiFi. Sin embargo, comprobaríamos rápidamente cómo seguiríamos sin poder conectarnos a internet. Para lograrlo, deberemos dar algunos (pocos) pasos más.

Empezaremos por editar el archivo sysctl.conf:

Aquí deberemos descomentar la línea donde pone net.ipv4.ip_forward=1 para poder habilitar el reenvío de tráfico hacia internet.

También será necesario, en el probable caso de que estemos utilizando como cortafuegos ufw (o su versión con interfaz gráfica, gufw), aceptar el reenvío de tráfico e impedir así que el cortafuegos tire a la basura todo lo que reciba (otra opción es deshabilitar directamente el cortafuegos, pero yo solo aconsejo hacer eso si nada funciona). Para ello, abrimos el archivo de configuración:

Y buscamos la línea donde pone DEFAULT_FORWARD_POLICY="DROP" para dejarla así: DEFAULT_FORWARD_POLICY="ACCEPT".

El último paso de todos es abrir el archivo rc.local donde añadiremos una línea para que funcione el NAT en nuestra nueva red con iptables:

Antes del final del archivo, donde pone exit 0, añadiremos una única línea:

¡Y al fin concluimos! Ahora solo nos queda reiniciar el ordenador y nuestra nueva red WiFi con acceso a internet debería ser visible y funcional desde cualquier dispositivo y sistema operativo.
Como ya dejé caer antes en el paso 11, si establecemos nuestra tarjeta inalámbrica como punto de acceso, seremos incapaces de conectarnos con ella a cualquier red WiFi, por lo que, en el caso de querer dejar de operar como un router y volver a la normalidad, además de comentar las líneas añadidas relativas al wlan0 del paso 11, tendríamos que comentar también la línea "DAEMON_CONF" del paso 3 para evitar que hostapd arranque automáticamente al iniciar el sistema.

Si por algún motivo, tras realizar el tutorial, vemos que la red WiFi no se ha creado, que no aparece por ninguna parte, podemos probar a abrir un terminal y forzar el arranque de hostapd. De éste modo, si algo está mal en el fichero de configuración, él mismo nos lo dirá:

¡Esto ha sido todo! Espero que pueda de verdad servir de ayuda a alguien. Por mi parte, estoy seguro de que recurriré bastante a este tutorial a partir de ahora cada vez que me vaya de viaje a algún sitio y sólo tenga disponible una conexión cableada.

Cualquier comentario, duda o problema, será bien recibido.


Referencias:
  • Sharing Internet over Wifi Between Ubuntu and Android [Link]
  • Crear un Punto de Acceso Wifi con Debian GNU/Linux [Link]
  • Web oficial de hostapd [Link]

3 comentarios:

  1. Hola
    He seguido todos los pasos y no conecta nada wifi. Al introducir iwconfig en el terminal (tengo Ubuntu 16.10) no me sale WLAN0, sino WLX44334C39BD23. He probado a cambiar wlan0 por lo que me sale en los archivos de configuración y ha empeorado la cosa. El resto de pasos los he dado correctamente. Con wlan0 había tráfico wifi pero no se podía conectar ningún terminal y no aparecía la red que había creado.
    ¿Podrías ayudarme?

    ResponderEliminar
    Respuestas
    1. Hola!!
      Me temo que no entiendo muy bien tu problema (has mencionado varias cosas) así que, podemos empezar desde el principio. ¿Podrías mostrarme una captura de tu terminal al hacer iwconfig?

      Eliminar
  2. juan1969@juan1969:~$ iwconfig
    wlx44334c39bd23 IEEE 802.11 ESSID:off/any
    Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
    Retry short limit:7 RTS thr:off Fragment thr:off
    Power Management:off

    lo no wireless extensions.

    enp3s0 no wireless extensions.

    ResponderEliminar