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

viernes, 24 de febrero de 2017

¿Cómo creo un servidor de FreeRadius en Ubuntu?

Juan Perón definió claras políticas a seguir para los partidarios de su doctrina, y también indicaciones para quienes no lo eran. También enseñó cómo instalar un servidor RADIUS para emplear acceso Wifi firmado digitalmente bajo el estándar WPA2-Enterprise en Ubuntu

(...)
Siempre he dicho que el que no piense como nosotros, debe sacarse la camiseta peronista y se va. Por perder un voto no vamos a ponernos tristes, al fin y al cabo nadie ha podido teñir el océano con un vaso de tinta. Si fuese comunista, iría a la sede del Partido Comunista.

Si eso pasa en la política, imagínense lo que sucede con las redes Wifi que toda empresa tiene por ahí: son muy propicias para que cualquiera quiera colgarse y aprovecharse.

Analicemos el problema y seamos honestos. Probablemente vuestra contraseña de Wifi empresarial sea algo bastante simple. La mayoría de la gente lo hace así pues debe convenir verbalmente dicha contraseña con nuevos usuarios, muchas veces molestos y realmente temporales, los cuales han de tipearlas en un incómodo Smartphone. De este modo que es probable que la contraseña no tenga 63 caracteres aleatorios y a lo sumo sea algo tontorrón, asi como "riverboca canchapelota".

Para contar con una verdadera seguridad, deberíamos emplear un certificado de encripción precompartido. Esto elevaría nuestra seguridad desde el concepto de "aquello que debemos saber" (nuestra contraseña de wifi) a "aquello que hemos de tener" (un archivo "llave" de certificado de encriptación).

Para ello existe el estándar RADIUS. Se trata de un acrónimo para "Servicio de Autenticación Remota para Usuarios Ingresante", y describe una serie de maneras para poder acceder a un servicio (en este caso, loguearnos a una red inalámbrica) sin necesidad de una clave memorizada, sino por medio de la revisión de un archivo certificado y con vencimiento, emitido por el mismo servidor.

La mayoría de los routers modernos cuentan con soporte para la norma WPA2-Enterprise, la cual establece el uso de un servidor de tecnología RADIUS para la autenticación de clientes.

Ahora bien, existen muchos esquemas versátiles en el que podemos usar la tecnología RADIUS, pero en aras de una sencillez y robustez Justicialista, os propondré una en la que se empleará un demonio basado en Ubuntu Server que generará certificados para los usuario, firmados digitalmente y con vencimiento de un año. Luego estos habrán de instalarlos en sus dispositivos.

Asumiremos que tenemos un router Wifi que soporta WPA2-Enterprise. Su punto de acceso debe estar configurado con una IP estática. También necesitamos un servidor con una dirección IP estática corriendo Ubuntu 16.04LTS, sobre el cual correremos el servidor RADIUS.

En primer nos conectamos al servidor como Conductores (root), a fin de instalar el paquete del demonio FreeRADIUS en él. Ya he expicado antes cómo instalar Ubuntu Server 16.04LTS a fin de emplearlo como router, de manera que podremos emplear dicho equipo. Una vez dispuestos en la consola del servidor ingresamos:

sudo su

...Tras autenticarnos con nuestra contraseña de administrador ingresaremos los consabidos Comandos de Organización:

apt-get update
apt-get install freeradius make

En breves instantes se descargará la paquetería necesaria. Acto seguido procederemos a configurar algunas cosas del demionio RADIUS en sí. Le desactivamos la opción de proxy del servidor (a no ser que la necesitemos), por medio de:

nano /etc/freeradius/radiusd.conf

Esto abrirá el editor de texto GNU Nano con el archivo de configuración radiusd.conf, el cual ya contendrá información. Hemos de modificar la cadena proxy_requests para que tome un valor negativo, de modo que quedará de la siguiente manera:

proxy_requests = no

También podrían querer revisar dentro del archivo radiusd.conf las funciones de registro en este archivo de configuración, para modificar qué información se registra y dónde se almacenará tal registro. En el bloque de texto log{} pueden emplear la cadena "auto=yes" a fin de que el servidor registre en su archivo bitácora toda vez que alguien se conecta al Wifi. También registrará allí a cuál punto de acceso se han conectado. Una vez concluidas las modificaciones al archivo en el editor Nano, lo grabamos con Ctrl+o y salimos del editor con Ctrl+x.

Vean señores, han de comprender que el cliente de RADIUS propiamente dicho no es en este caso la laptop o el teléfono del usuario. El cliente RADIUS es el Punto de Acceso Inalámbrico (normalmente el router Wifi), debido a que es éste quien realiza los pedidos de autenticación contra nuestro servidor Ubuntu dotado de FreeRADIUS. Por defecto, el demonio FreeRADIUS configurará el localhost en el servidor como un cliente también, pero como no necesitamos este proceder, lo desactivaremos. Ingresamos:

nano /etc/freeradius/clients.conf

...y desactivamos tal comportamiento, comentando mediante el agregado de "#" a las siguientes líneas:

#client localhost {
        #  Allowed values are:
        #       dotted quad (1.2.3.4)
        #       hostname    (radius.example.com)
#       ipaddr = 127.0.0.1

        #  OR, you can use an IPv6 address, but not both
        #  at the same time.
#       ipv6addr = ::   # any.  ::1 == localhost
...
#}

...acto seguido agregamos al fichero una entrada para nuestro router wifi "routerpirulo". Crearemos una nueva contraseña aleatoria que ingresaremos en el router wifi y el mismo la empleará para autenticarse contra el demoniu RADIUS. En el mismo archivo  /etc/freeradius/clients.conf modificamos:

client routerpirulo {
        ipaddr = 192.168.1.100
        secret = vIvApErOnCaRaJo
        require_message_authenticator = yes
}

Naturalmente modificamos las partes que se ejemplifican en negrita. Tendremos que agregar otras entradas similares en el archivo /etc/freeradius/clients.conf, una por cada cliente (router wifi o puntos de acceso inalámbrico) que se encuentren presentes en nuestra red. Os recomiendo emplear una contraseña distinta para cada uno de ellas, amén de necesitar una dirección IP estática para cada router wifi/punto de acceso. También debemos configurar dichos datos de cliente en el router/punto de acceso:

Configuración del EAP

A continuación habremos de editar el fichero de configuración para el Protocolo de Autenticación Extensible (EAP). En vez de indicarles qué líneas han de comentarse con "#", os indicaré qué necesitan hacer. Ingresamos:

nano /etc/freeradius/eap.conf

...y debemos asegurarnos que luzca de la siguiente manera:

# -*- texto -*-
# Archivo /etc/freeradius/eap.conf de ejemplo
eap {
 default_eap_type = tls
 timer_expire = 60
 ignore_unknown_eap_types = no
 cisco_accounting_username_bug = no
 max_sessions = 4096
 tls {
  certdir = ${confdir}/certs
                cadir = ${confdir}/certs
                private_key_password = micontraseñaserverkey
                private_key_file = ${certdir}/server.key
  certificate_file = ${certdir}/server.pem
  CA_path = ${cadir}
  CA_file = ${cadir}/ca.pem
  dh_file = ${certdir}/dh
  random_file = /dev/urandom
  cipher_list = "HIGH"
  make_cert_command = "${certdir}/bootstrap"
  ecdh_curve = "prime256v1"
  cache {
   enable = no # opcionalmente activar
   lifetime = 24 # horas
   max_entries = 255
  }
  verify {
   tmpdir = /tmp/radiusd
   client = "/usr/bin/openssl verify -CAfile ${..CA_file} %{TLS-Client-Cert-Filename}"
  }
  ocsp {
   enable = no # opcionalmente activar
   override_cert_url = yes
   url = "http://127.0.0.1/ocsp/"
  }
 }
 ttls {
  default_eap_type = md5
  copy_request_to_tunnel = no
  use_tunneled_reply = no
  virtual_server = "inner-tunnel"
 }
}

La contraseña "micontrseñaserverkey" indicada arriba deberá coincidir con la que emplearemos al general las claves del servidor mas adelante. Sugiero que sea complicada y aleatoria. Lo que hemos hecho principalmente es desactivar otros protocolos como LEAP y PEAP y MSCHAPv2 entre otros, ninguno de los cuales recomiendo emplear. Sólo activaremos el stack de protocolos peronista, el EAP-TLS.

Ahora hemos de desactivar los servidores por defecto. Para ello indicamos el siguiente comando de organización para borrarlos:

sudo rm /etc/freeradius/sites-enabled/*

...y procedemos a crear un nuevo fichero de configuración para el servidor con:

nano /etc/freeradius/sites-available/mynetwork

...y nos aseguramos que contenga algo como lo siguiente:

######################################################################
authorize {
 preprocess
 eap {
  ok = return
 }
 expiration
 logintime
}

authenticate {
 eap
}

preacct {
 preprocess
 acct_unique 
 suffix
 files
}

accounting {
 detail
 unix
 radutmp
 exec
 attr_filter.accounting_response
}

session {
 radutmp
}

post-auth {
 exec
 Post-Auth-Type REJECT {
  attr_filter.access_reject
 }
}

pre-proxy {

}

post-proxy {
 eap
}

Luego de guardar los cambios y salir del editor, lo enlazaremos con el directorio sites-enabled de la siguiente manera:

sudo su - 
cd /etc/freeradius/sites-enabled/ 
ln -s ../sites-available/mynetwork ./mynetwork

Podremos entonces detener el demonio FreeRADIUS y reiniciarlo en modo debug para asegurarnos que todo arranque correctamente y no "tire" errores. Ello lo haremos con los siguientes comandos de organización:

service freeradius stop 
freeradius -X

Si todo va bien, el servicio FreeRADIUS debería arrancar como un rastrojero, a la primera y sin toser. La terminal del sistema debería devolvernos la indicación Ready to process requests ("Listo para procesar pedidos"). Será ahora el momento para estar atentos a cualquier mensaje de error gorila que el servicio nos devuelva, y si eso sucede investigarlos. Una vez que finalicemos la evaluación, presionamos Ctrl+C para detener la ejecución del servicio en nuestro Servidor.

Configurar los Certificados SSL

Asumiendo que todo salió bien, ahora comenzaremos a generar los certificados SSL. Para ello comenzamos eliminando los inseguros certificados que vienen por defecto y a la vez haremos un trabajo de integrado básico:

cd /etc/freeradius/certs/ 
rm *.pem 
rm *.key 
mkdir /var/certs 
mkdir /var/certs/freeradius
chgrp ssl-cert /var/certs/freeradius 
chmod 710 /var/certs/freeradius 
cp /usr/share/doc/freeradius/examples/certs/* /var/certs/freeradius/ 
cd /var/certs/freeradius/ 
rm bootstrap 
chmod 600 * 
make destroycerts 
make index.txt 
make serial

A continuación, editamos el archivo ca.cnf con:

nano ca.cnf 

....y le modificamos algunas de las opciones por defecto. En particular, debemos prestar atención y modificaremos las siguientes líneas del fichero:

[ CA_default ]
..
default_days = 1825
default_md = sha1
..
[ req ]
default_bits = 4096
input_password = micontraseñaserverkey
output_password = micontraseñaserverkey
..

Observen bien. con 1825 días de validez, este certificado SSL del servidor durará unos buenos 5 años (podríamos cambiar los días indicados en la cadena default_days por los que querramos). La contraseña "micontraseñaserverkey" indicada arriba debe coincidir con la que pusimos en el archivo eap.conf anteriormente, y debería ser una cadena generada aleatoriamiente. Nunca deberíamos tener que ingresar esta contraseña a mano en ningún cliente, de modo que podemos asegurarnos que la misma sea realmente complicada.

Ahora generaremos el archivo ca.pem.

make ca.pem 
make ca.der 
make printca

Acto seguido, editamos el archivo:

nano server.cnf

...y realizamos cambios que reflejen los del archivo anterior:

[ CA_default ]
..
default_days = 1825
default_md = sha1
..
[ req ]
..
default_bits = 4096
..

Bajo la etiqueta "[server]" ingresamos nuestra información de contacto apropiada. Conforme esté todo listo, generaremos el archivo server.pem:

make server.pem

Crear los Certificados de Usuario

Conforme lleguemos a este punto, generaremos los certificados para los clientes. Para ello primero modificaremos el archivo Makefile con:

nano Makefile

...locallizamos las líneas que dicen:

client.p12: client.crt
  openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12  -passin pass:$(PASSWORD_CLIENT) -passout pass:$(PASSWORD_CLIENT)

client.pem: client.p12
  openssl pkcs12 -in client.p12 -out client.pem -passin pass:$(PASSWORD_CLIENT) -passout pass:$(PASSWORD_CLIENT)
  cp client.pem $(USER_NAME).pem

...y las cambiamos para que digan lo siguiente:

client.p12: client.crt
        openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12  -passin pass:$(PASSWORD_CLIENT) -passout pass:$(PASSWORD_CLIENT)
        cp client.p12 $(USER_NAME).p12

client.pem: client.p12
        openssl pkcs12 -in client.p12 -out client.pem -passin pass:$(PASSWORD_CLIENT) -passout pass:$(PASSWORD_CLIENT)
        cp client.pem $(USER_NAME).pem

client_android.p12: client.crt
        openssl pkcs12 -export -in client.crt -inkey client.key -certfile ca.pem -name "$(USER_NAME)" -out client_android.p12  -passin pass:$(PASSWORD_CLIENT) -passout pass:$(PASSWORD_CLIENT)
        cp client_android.p12 $(USER_NAME)_android.p12

Nota: las líneas anteriores se cortarán en su navegador, pero si se seleccionan, copian y pegan, deberían aparecer formateadas correctamente.

Debemos asegurarnos que las líneas adelantadas sean tabulaciones y no espacios, o el archivo no funcionará. Este cambio creará un caso especial para los certificados para Android, y renombrará los archivos para que sean más sencillos para identificar.

Editamos client.cnf para establecer nuestras opciones por defecto como lo hicimos anteriormente, pero esta vez para cualquier certificado de cliente. Para ello ingresamos:

nano client.cnf

Probablemente querramos acortar los días por defecto a 365 (necesitará regenerar las claves para el dispositivo cuando concluyan el año/fecha). Debemos cambiar la cadena default_md a sha1 y default_bits a 4096:

[ CA_default ]
..
default_days = 365
default_md = sha1
..
[ req ]
..
default_bits = 4096
input_password = contraseñacliente
output_password = contraseñacliente
emailAddress = mail@correcto.delcliente
commonName = nombre_del_cliente 
..

En la sección [ req ] del archivo client.cnf se encuentran las cadenas input_password e output_password. Ponga en ambas la misma, y tenga en mente que esta contraseña será necesaria cuando el certificado se instale en el cliente, de manera que deberá tener un teclado para tipearlas. La sección [client] identifica únicamente al usuario en los archivos de bitácora, de modo que asegúrese que las cadenas emailAddress y commonName estén configuradas correctamente.

Ahora generaremos los certificados de cliente con:

make client.pem 
make client_android.p12

Para generar otro certificado para otro cliente, simplemente editamos el archivo de nuevo con:

nano client.cnf

...lo modificamos con los datos y ejecutamos nuevamente los comandos make client.pem y make client_android.p12 para generar otro certificado nuevo, y repetiremos el procedimiento para cada dispositivo cuyo acceso deseemos permitir a nuestra red Wifi empresarial. Finalmente configurareos los permisos apropiados para los certificados y crearemos los enlaces que necesitamos, con los siguientes Comandos de Organización:

chmod 600 * 
chmod 640 ca.pem 
chmod 640 server.pem 
chmod 640 server.key 
chgrp ssl-cert ca.pem 
chgrp ssl-cert server.pem 
chgrp ssl-cert server.key 
cd /etc/freeradius/certs/ 
ln -s /var/certs/freeradius/ca.pem ca.pem 
ln -s /var/certs/freeradius/server.pem server.pem 
ln -s /var/certs/freeradius/server.key server.key

No debemos olvidar que si creamos nuevos certificados de clientes (por ejemplo, al cumplirse los 365 días) debemos volver a ejecutar las primeras cuatro líneas de los comandos anteriores a fin de asegurarnos que los permisos de los certificados sea nuevamente acorde a nuestras necesidades.

Cada Certficado en su Lugar

Para conectarse, los archivos pueden requerirse con la siguiente nomenclatura:
  • Linux: ca.pem y [usuario].p12
  • Android: [usuario]_android.p12
  • Window$: ca.der y [usuario].p12
Tengan en cuenta que al usar Wifi a través de un servidor RADIUS, las versiones recientes de Android mostrarán constantemente una advertencia de que su conexión está siendo monitoreada. Existen maneras en un smart Android rooteado de instalar el archivo [usuario]_android.p12 en la carpeta de root, pero aún así esto no afecta la operación del dispositivo.

jueves, 9 de febrero de 2017

¿Cómo configuro un poderoso router casero con Ubuntu?

En una reunión con obreros del gremio telefónico, Juan Perón explica los requerimientos del Movimiento y enseña a los técnicos cómo armar un Router casero munido de Ubuntu.

¡Trabajadores!

Existen tareas que por complejas que parezcan, deben poder ser realizadas por un Pueblo Justo, Libre y Soberano. Los paños de nuestras tres divisas son inmaculados, y como tal ha de ser el camino que hemos de seguir en pos de nuestra merecida felicidad.

Sin embargo, no es secreto para nadie que en ocasiones las tareas que deberían ser sencillas esconden para sí dificultades que enturbian el corazón de los hombres más formidables. El conocimiento permite al hombre hacer de si alguien mejor, pero no es algo que pueda adquirirse fácilmente en el ámbito individual: el conocimiento ha de lograrse de manera colectiva para que realmente sea apropiado y utilizado.

Poco sentido tiene que algo lo sepa uno solo. Ello parecería correcto para una sociedad vendida al Capital, pero un Pueblo como el nuestro necesita y merece una Comunidad Organizada capacitada no solamente para hacer uso del Software y Hardware puesto a su disposición, sino ser capaz de darse a sí misma las funcionalidades que le sean necesarias en pos de su sano existir.
Vean señores. Dios creó a la Tierra, y en un principio las comunicaciones se establecían a los gritos, luego con señales de humo, y hasta hace poco de forma descentralizada a través de la línea telefónica, empleando un módem telefónico en una modalidad punto a punto (síncrona). Con el advenimiento de la llamada "banda ancha", el acceso a Internet se hizo más centralizado. La conexión a nivel masivo se logró por medio de dispositivos de red hogareños (gateways) otorgados en comodato por los proveedores de internet. Estos puertos de entrada suelen tener la forma de módem ADSL, cablemódem, módem de fibra óptica, antena/suscriber, u otro aparato de para acceso al servicio de Internet. La entrada de estos aparatos recibida desde la vía pública varía de acuerdo a la tecnología utilizada (cable telefónico, cable coaxil, fibra óptica, etc), pero la salida al hogar suele ser un conector normalizado RJ45, a través de una interfaz Ethernet.
De un tiempo a esta parte la mayoría de estos puertos de entrada hogareños incorporaron también funciones básicas de enrutamiento hacia el hogar, e incluso la capacidad de punto de acceso WiFi. No es extraño que además hoy estos modem/routers con Wifi tengan funcionalidad VoIP para entablar comunicaciones de Voz a través de una suscripción Internet, y que la velocidad para la red LAN sea del tipo Gigabit (1000 Mbps por segundo).

En este escenario ustedes se preguntarán ¿para que podría querer armar un router casero? Las respuestas son múltiples. En primer lugar los modem/routers hogareños convencionales suelen ser limitados: cuentan con una memoria muy escasa (normalmente apenas unos 32MB), amén de un microprocesador ARM o MIPS de escasa potencia (400Mhz es una velocidad de referencia bastante extendida). Ello los torna ridículos en cualquier condición de real alta demanda. No tendremos problemas para compartir internet de 10MB entre cuatro o cinco computadoras, pero si nuestro uso es más holgado, nos encontraremos en instalaciones comerciales, educativas, etc, dicha capacidad puede tornarse en una extremadamente constrictiva. Por otro lado, un equipo especialmente armado para la función de router casero bien puede operar como servidor local de correo, de datos, etc. Algunos routers hogareños de alta gama disponen de estas funcionalidades a un nivel muy limitado. Naturalmente que podremos superarla con creces.

Por otro lado, también podremos armar un router con un equipo previamente descartado, o un equipo nuevo de muy bajo costo.

En este caso emplearemos una MiniPC sin fan (especialmente diseñada pensando en un bajo consumo eléctrico empleando disipadores pasivos). La placa madre de la misma trae un Intel Celeron 1037u doble núcleo de 1.8Ghz, dos puertos Ethernet Gigabit, cuatro puertos USB2, y el hardware de video video es Intel onboard con salida VGA y HDMI (que no utilizaremos normalmente). La memoria es de 2GB de RAM DDR3. Le colocaremos un SSD barato de 64GB.

Naturalmente existen opciones mucho más baratas (emplear memorias flash SD en lugar de disco rígido, o usar una PC de descarte con una placa LAN Ethernet común). Sin embargo, en tal caso tendremos elevado consumo eléctrico y generación de calor al ñudo.

¿Que hará el router peronista?

Un router es un dispositivo que acepta paquetes TCP/IP en uno de sus conectores (técnicamente interfases), y la reenvía a otra interfaz, de modo que esos paquetes estén más cerca de su destino eventual. Fundamentalmente debemos saber que el aparato debe entender y manejar cuatro cosas: debe rutear (algo que Linux puede hacer perfectamente), y tener capacidad DHCP,  DNS y NAT.

DHCP (Protocolo de Control Dinámico de Host) es el protocolo que le permite al router asignar a los clientes locales direcciones IP de forma dinámica y llevar control de las mismas de forma automática. DNS (Sistema de Nombre de Dominio) es un software traductor entre los nombres de dominio (ej www.ubuntuperonista.blogspot.com.ar) las direcciones IP (numéricas y difíciles de recordar) de dichos servidores. Técnicamente, emplea el programa BIND desarrollado en la Universidad peronista de Berkley.

Y NAT, en apretado resúmen, nos permite acceder a direcciones ruteables en internets desde direcciones locales y privadas no ruteables. Un router oficia de nodo aceptando tráfico desde la red local LAN, sustituyendo su propia dirección pública otorgada por el proveedor de internet - ya sea fija o dinámica (variable) por la dirección IP de la LAN desde donde viene el paquete, y enviando dicho paquete a internet. Cuando las réplicas del paquete regresan al router, este buscará cuál es la dirección IP local desde la cual se solicitó el paquete original, pondrá esa dirección IP de nuevo en el paquete en lugar de la suya propia, y reenviará el paquete a su destinatario local, a la máquina original.
Necesitamos el NAT debido a que no existen suficientes direcciones IP públicas para toda computadora personal y dispositivo existente. Técnicamente, debemos saber que el router lo hará realidad efectiva por medio de la función MASQUERADE del programa iptables.

Software para el Route



Existen varias distribuciones Linux pensadas para operar como router, como por ejemplo OpenWRT. En este caso emplearemos la versión LTS de Ubuntu Server, la cual descargamos desde su web oficial. Usando un pendrive de 2GB creamos el pendrive de instalación. El procedimiento de instalación consiste en iniciar la MiniPC desde el pendrive, e instalar en el disco SSD Ubuntu Server 16.04.1LTS con todas las opciones por defecto. La única opción relevante será ingresar nuestro nombre de usuario y contraseña de Conductor, así como si deseamos actualizaciones de seguridad automáticas (responderemos afirmativamente). Cuando todo finalice reiniciamos la MiniPC, nos logueamos con nuestro usuario y contraseña, y nos encontraremos ante el intérprete de comandos (una pantalla de solo texto).

Configurar las interfaces de red

Lo primero es asegurarnos cual nomenclatura de interfaz de la miniPC corresponde a qué puerto. Lo manera más sencilla es escribirle WAN o LAN a los puertos (si es que no están ya marcadas de alguna manera). Para averiguar bien conviene conectar el cable Ethernet de nuestro módem al conector que querremos usar como puerto WAN, y luego tipear el siguiente comando de organización:

ifconfig

...y al presionar Enter nos aseguramos cual de las interfaces que nos indique el sistema tiene una dirección IP: ¡y esta será nuestro puerto WAN!. En mi caso la MiniPC cuenta con dos puertos Ethernet, y la que recibe dirección IP figura como interfaz enp4s0. Naturalmente que la otra interfaz (en mi caso enp5s0) será el puerto LAN. Deberán tomar nota de cual es cual en vuestro caso particular pues es muy normal que su propia nomenclatura sea distinta a la de este ejemplo.

Nuestra acción siguiente será configurar las interfaces de red modificando el archivo /etc/network/interfaces, con el comando:

sudo nano /etc/network/interfaces

...se abrirá el editor GNU Nano con un archivo que ya contendrá configuraciones en forma de texto. La sección loopback debería ya estar allí, y es probable que a continuación también aparezca algo correspondiente para nuestras interfaces de red (enp4s0 y enp5s0 en este caso). Hemos de modificar/agregar las secciones para enp4s0 (nuestro puerto de salida a internet WAN) y enp5s0 (nuestro puerto local LAN) como se indica:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# La interfaz loopback de la red
auto lo
iface lo inet loopback

# La interfaz WAN a internet, aparece nomenclada LAN1 en la placa madre.
auto enp4s0
iface enp4s0 inet dhcp

# La interfaz LAN (red local), aparece nomenclada LAN2 en la placa madre.
auto enp5s0
iface enp5s0 inet static
 address 192.168.99.1
 netmask 255.255.255.0

Quienes conocer Linux dominan ya que las líneas que se inician con el carácter numeral ("#") no son procesadas por el sistema y se emplean como comentarios; son líneas que se agregaron como referencia al equipo en particular, y son importantes como anotaciones para futuras referencias. Siempre conviene comentar lo que intentamos hacer en nuestros archivos de configuración. Guardaremos los cambios con Ctrl+o y saldremos del editor Nano con Ctrl+x.

Habilitar el enrutamiento en /etc/sysctl.conf

Para que Linux sea capaz de enrutar paquetes debemos permitir el reenvío de los mismos entre las distintas interfaces del router. Esto será realmente simple. Ingresamos el comando:

sudo nano /etc/sysctl.conf

...y descomentamos (borramos el símbolo numeral "#") la línea que dice  #net.ipv4.ip_forward=1, de modo que quede como se indica a continuación (sin el "#"):
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1

Luego presionamos Ctrl+o, y Ctrl+x a fin de guardar los cambios al fichero de configuración y salir del editor.


Los cambios que hagamos se harán efectivos cuando reiniciemos el router con:

sudo reboot

Crear e iniciar un conjunto de reglas esqueleto

Conforme el sistema sepa que debe ser un router, el siguiente paso será asegurarnos de escoger qué tipo de información reenviará y cuando lo hará. Para ello debemos crear un conjunto de reglas de contrafuego (firewall), y asegurarnos que entren en vigencia antes de que las interfaces de red del router se activen. Primero ingresamos el comando

sudo nano /etc/network/if-pre-up.d/iptables 

...para crear un guión de inicio y le agregamos el siguiente contenido:

#!/bin/sh
/sbin/iptables-restore < /etc/network/iptables

Luego de guardar los cambios y salir del editor con Ctrl+o y Ctrl+x, ingresamos:

sudo chown root /etc/network/if-pre-up.d/iptables ; chmod 755 /etc/network/if-pre-up.d/iptables

Esto le dice al sistema que el guión es propiedad del root (conductor y administrador del sistema) y luego se le informa al sistema que sólo el root puede escribirlo y leerlo, pero que puede ser ejecutado cualquier usuario. Ya que nuestro guión fue creado en el directorio if-pre-up.d, será ejecutado antes que las interfases de red se inicien, asegurándonos que nunca quedaremos online sin reglas de cortafuego que nos protejan.

Archivo /etc/network/iptables

Para iniciar, vamos a crear un esqueleto mínimo de reglas necesarias para que  iptables-restore no sea gorila. Creamos un nuevo conjunto de reglas con el comando

sudo nano /etc/network/iptables
...y lo completamos de la siguiente manera:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Reglas de servicio
-A INPUT -j DROP

# Reglas de reenvío
-A FORWARD -j DROP

COMMIT
Tomémonos un momento para comprender el esqueleto de nuestro conjunto de reglas antes de agregarle músculos y órganos. Hemos creado dos secciones, *nat y *filter. Cada sección comienza con una *declaración apropiada y termina con COMMIT ("Consignar, proceder"). Si no hacemos esto bien (o sea, si omitimos algunas de las secciones, escribimos mal su nombre, o no agregamos la orden COMMIT al final) el conjunto de reglas directamente fracasarán. Y ello será gorila.

Por ahora, este esqueleto básico realmente no cumple demasiado, pero constituirá el marco sobre el cual construiremos los mejores años para hacer de nuestro equipo un excelente Router Peronista. Entender esto ahora, antes de echar las carnes, nos facilitará mucho el trabajo que nos demandará en breve.

Activar el NAT

En este punto tenemos una MiniPC que sabe cómo aceptar un paquete en una interfaz, y si está dirigido a una dirección en otra interfaz, reenviarlo allí. Debido a que por el momento no hemos consignado nuestro conjunto de reglas aún, el router peronista no va a discriminar sobre de quién viene, qué es, o a quién va. Solamente rutea. Tampoco realiza una Traducción de Dirección de Red (NAT, Network Address Translation),

Ahora que sabemos cual puerto es cual, hemos de activarlos y comentarlos en nuestro conjunto de reglas iptables. También procederemos a insertar una regla que active la NAT. Para ello ingresamos:

 sudo nano /etc/network/iptables

...y editamos el archivo de modo que quede: 
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz internet WAN, #enp5s0 es la interfaz local LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

COMMIT
Aquí lo tenemos. Una interfaz es la LAN, la otra es la WAN, y tenemos la Traducción de Dirección de Redes operando entre ambas. Aún no estamos demasiado listos para conectarnos a la Internet, pero falta menos. Probablemente querremos que nuestro Router Peronista otorgue direcciones IP a través de la interfaz LAN, como podría otorgar privilegios a nuestros niños. Para ello aplicamos el conjunto de reglas con NAT activado adecuado, por medio del comando de organización:

sudo /etc/network/pre-up.d/iptables

...esto refrescará el conjunto de reglas iptables con cualquier cosa nueva que hayamos incorporado al archivo /etc/network/iptables.
Este mismo comando  

sudo /etc/network/pre-up.d/iptables 
...es el que habremos de ejecutar toda vez que querremos modificar y aplicar el conjunto de reglas activo.

Configurar DHCP y DNS

Configurar nuestro router para que cumpla con la tarea de DHCP es sencillo. Ingresamos el comando:

sudo apt-get install isc-dhcp-server

...y lo configuramos con el comando:

sudo nano /etc/dhcp/dhcpd.conf

...modificándolo para que quede similar a:
subnet 192.168.99.0 netmask 255.255.255.0 {
 range 192.168.99.100 192.168.99.199;
 option routers 192.168.99.1;
 option domain-name-servers 192.168.99.1;
 option broadcast-address 192.168.99.255;
}
Probablemente ya puedan figurarse el significado. La red local será 192.168.99.x, el router mismo tendrá la IP 192.168.99.1, el router servirá DNS por sí mismo, y la dirección de emisión irá donde siempre debe ir. Para aplicar las configuraciones ingresamos el comando:

sudo /etc/init.d/isc-dhcp-server restart.

Ya estaremos entregando direcciones IP de forma dinámica.
Aun así nos falta proveernos de DNS locales, lo cual nuestro servidor DHCP promete otorgarnos gratuitamente. Hacer esto realidad efectiva es incluso más sencillo:  Ingresamos:

sudo apt-get install bind9.

...y no se requieren configuraciones adicionales

Habilitar a clientes acceso DNS y DHCP

En este punto básicamente tenemos todo configurado, pero nuestro router está completamente paranoiqueado. Esencialmente sabe cómo resolver interrogantes DNS, entregar direcciones IP a eventuales clientes y reenviarles tráfico, pero se niega categóricamente a hacerlo. Para que nuestro sistema proceda a hacerlo habremos de crear algunas reglas claras sobre lo que se permitirá reenviar y lo que se debe permitir aceptar. Para ello ingresamos:

sudo nano  /etc/network/iptables

...y le sumamos un conjunto de reglas de servicio como se indica:
# Reglas de servicio

# reglas de aceptación básicas - ICMP, loopback, traceroute, establecidas como "acepto todo"
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# permitir que salgan rechazos de traceroute
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable

# DNS - aceptarlo desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i enp5s0 -p udp --dport 53 -j ACCEPT

# SSH - aceparlo desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 22 -j ACCEPT

# pedidos de IP desde clientes de DHCP - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p udp --dport 67:68 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A INPUT -j DROP
Con esta configuración aún el router permanece muy paranoico como para dejar que el tráfico salga al exterior (la Internet), pero al menos ahora dejará que los equipos de nuestra LAN obtengan direcciones IP por sí mismos y resuelvan los nombres de host DNS. También permitirá funciones como los pings y traceroutes (en este caso, únicamente desde cualquier interfaz local). Finalmente, una regla especial permite el acceso Secure Shell (SSH) desde la LAN hacia el router, lo cual es útil pues ya no tendremos que conectar físicamente monitor y teclado al router peronista cada vez que querramos hacer un cambio, sino que podremos operarlo a través de SSH en la red local, con el comando:

ssh root@192.168.99.1

Si estáis copiando y pegando a lo puntero político, recuerden simplemente una cosa:  enp5s0 es mi interfaz local LAN, pero podría ser distinta en vuestro caso. Revisen sus notas para saber cuál interfaz es la que les corresponde en particular.

Permitir que el tráfico salga a Internet

Vamos a hacer esto supersencillo. Todas las máquinas tendrán permitido salir a internet y hacer lo que les venga en gana:
# Reglas de reenvío

# reenviar paquetes a lo largo de las conexiones establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde la el area local LAN (enp5s0) to internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A FORWARD -j DROP
En este punto ya tenemos un Router Peronista y creíble. La MiniPC entrega direcciones IP dinámicamente, resuelve pedidos DNS, enruta tráfico desde los puertos LAN e internet y viceversa. Además, nada de lo que venga de internet tiene permitido el acceso a la LAN. Aún así, debemos agregar una característica más antes de considerar al proyecto finalizado.

Reenvío de Puertos desde Internet a la LAN

Honestamente, este es la única parte dificultosa de hacer nuestro router peronista: crear reenvío en base a puertos, o sea, crear "filtros" desde Internet a los clientes conectados en la LAN. Normalmente los routers comunes cuentan con una interfaz web que lo hacen sencillo: escogemos una IP local, escogemos un protocolo y puerto, y lo configuramos "permitir tráfico para el puerto TCP n a la IP local xxx.xxx.xxx.xxx". Al emplear iptables será algo más difícil pues requerimos dos entradas separadas para cada servicio de reenvio. En este ejemplo, vamos a enviar el puerto de TCP número 80 (el servicio HTTP) a través del router) para una IP local. Esto es necesario si queremos evaluar la salida de WAN a la LAN de un router.

En primer lugar, creamos una entrada en la sección *nat:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz de internet WAN, #enp5s0 es la interfaz local LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

# filtro NAT: HTTP desde WAN a LAN
-A PREROUTING -p tcp -m tcp -i enp4s0 --dport 80 -j DNAT --to-destination 192.168.99.100:80

COMMIT
Esta línea de pre-enruteamiento le dice al router que un tráfico arbitrario desde la internet (tráfico que aún no está asociado con una conexión de salida desde la LAN) dirigido al puerto 80, debe ser reenviado a la máquina local en la dirección IP 192.168.99.100. Sin embargo, ya que tenemos una regla de descarte por defecto (DROP) en nuestro conjunto de reglas de reenvío, también necesitamos una regla allí que nos permita que este tráfico sea reenviado ahora que sabemos cómo reenviarlo:
# Reglas de reenvío

# reenviar paquetes a lo largo de las conexiones establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde LAN local enp5s0 a internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# permite el tráfico desde nuestro filtro NAT
-A FORWARD -p tcp -d 192.168.99.100 --dport 80 -j ACCEPT

# descartar (DROP) todo otro tráfico reenviado
-A FORWARD -j DROP
Si le erramos a esto (si olvidamos la regla PREROUTING o la regla FORWARD, o si ponemos la regla PREROUTING en la seccion *filter de la regla FORWARD, o la regla FORWARD en la sección *nat), nuestro router se pondrá gorila y se negará a cargar el conjunto de reglas o fracasará directamente al reenviar el tráfico hacia donde debe dirigirse a través del filtro. No es excesivamente difícil, pero si es algo estructurado que debemos conocer, por ello es que he recurrido a colores para indicar las interfaces, y a comentarios que explican todo.

El conjunto de reglas finalizado y completo

Ha sido necesario avanzar lentamente sobre cada sección de nuestro conjunto de reglas para asegurarnos de explicar y entender qué estamos haciendo. Aqui pasaré en limpio el conjunto de reglas completo, en una sola pieza y con comentarios para el beneficio de la Masa Popular, que es la más maravillosa música.

Por favor recuerden que sus nombres de interfaz probablemente sean diferentes al mío. ¡No copien a lo Tamborini-Mosca enp4s0 y enp5s0 y se pregunten porque no funcionan!.


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz internet WAN, #enp5s0 es la interfaz local LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

# Filtro NAT: HTTP desde internet WAN enp4s0 a la local LAN
-A PREROUTING -p tcp -m tcp -i enp4s0 --dport 80 -j DNAT --to-destination 192.168.99.100:80

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Reglas de Servicio

# reglas de aceptación básicas - ICMP, loopback, traceroute, establecidas como "acepto todo"
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# permitir que salgan rechazos de traceroute
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable

# DNS - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i enp5s0 -p udp --dport 53 -j ACCEPT

# SSH - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 22 -j ACCEPT

# pedidos de IP desde clientes de DHCP - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p udp --dport 67:68 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A INPUT -j DROP

# Reglas de Reenvío

# reenviar paquetes a lo largo de las conexiones establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde LAN local enp5s0 a internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# permite el tráfico desde nuestro filtro NAT
-A FORWARD -p tcp -d 192.168.99.100 --dport 80 -j ACCEPT

# descartar (DROP) todo otro tráfico reenviado
-A FORWARD -j DROP

COMMIT
Una vez que estamos seguros de tener todo el conjunto de reglas y que está adaptado adecuadamente a nuestras interfaces de red y equipamiento, es tiempo de aplicar todo con el comando: 

sudo /etc/network/if-pre-up.d/iptables

Con esto, finalmente tendremos nuestra MiniPC operando como excelente router y además, tendremos dicha máquina para operar como servidor. Con un poco de ingenio podremos montar un servidor Apache para dar servicio a páginas Web, MySQL para dar servicio de bases de datos relacionales, incluso hasta servidores de BBS. ¡Y todo gracias al Justicialismo!

miércoles, 9 de septiembre de 2015

¿Cómo puedo ejecutar programas en OpenWRT?

¡Trabajadores!

Como verdaderos apóstoles, hemos de instalar software libre en todos los dispositivos que tengamos a mano. Solo así nos aseguraremos de transitar la real senda de la Liberación.

He comentado ya del caso del router TP Link WR491ND y de su firmware de control alternativo y abierto OpenWRT. Gracias a el nuestro router dejará de ser un dispositivo bobo, y pasará a convertirse en un verdadero router peronista capaz de correr otras aplicaciones. OpenWRT es un firmware abierto, pensado para controlar enrutadores. Como tal, es un sistema operativo que convierte a nuestro router en una computadora de pequeñas dimensiones y potencia reducida, pero programable para conducir efectivamente una serie de tareas.

Por medio de OpenWRT y un router compatible, podremos crear un servidor de archivos, servidores pequeños de correo de status, controlar en horarios determinados dispositivos electrónicos a través de interfaces seriales, USB, o Ethernet.

Con un poco de dificultad, se pueden programar entonces dispositivos controlados a partir del router, como por ejemplo, aspersores que trabajen a horario, unidades de medición del clima que lean las condiciones de temperatura y humedad y la transmitan por internet, podremos controlar cámaras de seguridad, relays que enciendan luces, abran o cierren portones eléctricos, enciendan bombas o motores eléctricos, o con más software libre podremos convertir nuestro router en un dispositivo de transmisión de medios (fotos, audio e incluso video) para operar dentro de la red local, y muchso etcéteras

Sin embargo, no necesitamos tanta dificultad, aún así podremos desarrollar nuestras propias "aplicaciones caseras" por medio de código Ash. Dicho código comprende comandos y condicionales, de manera de poder realizar ciertas acciones útiles, con poco ingenio y habilidad.

Es importante si bien los guiones los almacenaremos dentro del directorio /root del router, los mismos han de concentrarse en operar dentro del directorio /tmp/ del router, ya que el mismo es la memoria RAM volátil. Esto es así pues los routers disponen de muy poco espacio físico (un chip EEPROM de 4 megabytes, y raramente más).

Para disponer nuestros scripts, crearemos dentro del router un directorio a tal efecto:

mkdir /root/scripts/
Por ejemplo, si nuestro proveedor nos da IP dinámica y quisiéramos saber cuáles nuestra dirección IP de salida actual para montar un servidor de juego o por cualquier motivo, podríamos crear un script que lo haga.

Para ello, hemos de utilizar siempre el básico editor Vi. Se trata de un editor mínimo incorporado dentro del router. Para editar texto debemos llamarlo con vi nombredelarchivo.

En este caso podriamos hacer:

vi /root/scripts/decimelaip

Presionamos i para entrar al modo edición, y le pegamos el siguiente código peronista:

#!/bin/sh
# Scropt decimelaip Informa la IP de salida.
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo La direccion IP actual de salida a internet es:
echo '' >> /tmp/log/ipactual.log
cat /tmp/log/ipactual.log


Para guardar el archivo y abandonar el editor, debemos presionar Esc y escribir :wq seguido de Enter.

Ahora podremos darle permisos de ejecución con:

chmod +x /root/scripts/decimelaip

y ejecutarlo con:

sh ~/scripts/decimelaip
 
También podríamos configurar un script que revise por medio de un ping a google.com, para saber si hay conexión WAN (al cablemódem), y si no la encuentra, que reinicie el router. Este microprograma puede ser útil para una tarea de administración remota.

Para ello editaríamos el archivo:

vi /root/scripts/pingreset

Activamos el modo de edición con i y le pegamos el siguiente código:

#!/bin/sh
# Programa para probar la conexion o resetear.
if ping -c 1 google.com > /dev/null ; then
echo "Todo OK, el cliente funciona y no necesita reiniciarse"
pingfail=0
else
 pingfail=$(($pingfail+1))
echo $pingfail " ping fracasados"
if [ $pingfail -gt 10 ];
then
echo "mas de 10 ping a google fracasados. RESETEANDO EL ROUTER!!"
reboot
fi
fi


Luego guardamos y salimos con Esc +:wq, y le damos permisos de ejecución con:

chmod +x /root/scripts/pingreset

Podremos ejecutarlo con:

sh ~/scripts/pingreset

Un script que conviene tener en el directorio root de nuestro router es uno que active o desactive la red wifi. Para ello editamos:

vi ~/wifionoff

Se abrirá el editor Vi con el archivo en blanco. Presionamos i y le insertamos el siguiente código:

#!/bin/sh
# Crea un archivo con el registro de estado del Wifi (on u off)
# Si el wifi está on lo apaga, si está off lo enciende.

STATEFILE="/tmp/wifionoff.state"
 
if [ $# -eq 1 ]; then
  case $1 in
    "up"|"on")
      STATE=off
      ;;
    "down"|"off")
      STATE=on
      ;;
  esac
else
  if [ ! -e ${STATEFILE} ]; then
    STATE=on
  else
    . ${STATEFILE}
  fi
fi
if [ -z ${STATE} ]; then
  STATE=on
fi
 
if [ ${STATE} == "on" ]; then
  /sbin/wifi down
  STATE=off
else
  /sbin/wifi up
  STATE=on
fi
 
echo "STATE=${STATE}" > ${STATEFILE}


Una vez realizado esto, podremos darle permiso con:

chmod +x /root/wifionoff

Con este archivo creado, podremos ahora apagar o encender el wifi con dicho comando (siempre que estemos conectados por cable, claro está).

En vista de dicho archivo y si por algún motivo necesitásemos reiniciar solamente la red inalámbrica, pero queremos hacerlo estando conectados por wifi, podremos crear un script a tal efecto.

Para ello ingresamos

vi /root/scripts/resetearwifi

Y le pegamos el siguiente código:

#!/bin/sh
#Programa para resetear el wifi estando conectado por wifi
# requiere script wifionoff en /root/
cd /root/
./wifionoff && ./wifionoff


Lo guardamos y salimos con Esc + :wq, y le asignamos permisos de escritura con chmod + /root/scripts/resetearwifi.

En el caso de necesitar scripts puros para encender o apagar el wifi (por ejemplo, para utilizarlos a través de una orden cronometrada Cron, y activar o desactivar el wifi en determinadas horas del día), podremos utilizar Vi para incorporar dos archivos:

Un archivo /root/script/wifion que contenga el siguiente código:

#!/bin/sh
# Enciende la WLAN (sin detener el dispositivo de emision radio0)
wifi up


...y un archivo /root/script/wifioff que contenga el siguiente código:


#!/bin/sh
# Apaga la WLAN (sin detener el dispositivo de emision radio0)
wifi down



Es siempre útil contar con un script que nos presente el status del router. Para ello podremos crear con Vi un archivo /root/status e insertarle el código:

#!/bin/sh
# Programa que devuelve datos de estado del router
date
uptime
echo Detalle de las Conexiones del router
ifconfig
echo Direcciones IP cedidas por DHCP
cat /tmp/dhcp.leases
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo '' >> /tmp/log/ipactual.log
echo La dirección IP actual de salida a internet es:
cat /tmp/log/ipactual.log


Guardamos el archivo con Esc + :wq y le damos permisos de ejecución con chmod +x /root/status.

Para ejecutarlo, podremos utilizar el comando ./status o sh /root/status.

Podremos crear otro programa de información aún mas detallado con facilidad. Por ejemplo, podríamos escribir un guion llamado /root/scripts/info con el siguiente contenido:

#scripts para detalles
echo INFORMACION DEL ROUTER - presione q para salir > /tmp/log/info
echo Dispositivo >> /tmp/log/info
cat /tmp/sysinfo/model >> /tmp/log/info
cat /proc/version >> /tmp/log/info
uname -mnrs >> /tmp/log/info
cd /tmp/
rm -f /tmp/log/ipactual.log
wget -q http://ipecho.net/plain -O /tmp/log/ipactual.log
echo '' >> /tmp/log/ipactual.log
echo La IP actual de salida a Internet es >> /tmp/log/info
cat /tmp/log/ipactual.log >> /tmp/log/info
echo INFORMACION DE LA CPU DEL ROUTER >> /tmp/log/info
cat /proc/cpuinfo >> /tmp/log/info

echo '' >> /tmp/log/info
echo ESTADO DE LA MEMORIA >> /tmp/log/info
cat /proc/meminfo >> /tmp/log/info

echo '' >> /tmp/log/info
echo MODULOS CARGADOS EN MEMORIA >> /tmp/log/info
cat /proc/modules >> /tmp/log/info

echo '' >> /tmp/log/info
echo DMESG DEL ROUTER >> /tmp/log/info
dmesg >> /tmp/log/info

echo '' >> /tmp/log/info
echo LOG INTERNO DEL APARATO >> /tmp/log/info
logread >> /tmp/log/info

echo '' >> /tmp/log/info
echo Generando archivo nuevo en tmp/log/info
cat /tmp/log/info | less
# Comentar para que no elimine el archivo al terminal el proceso:
rm /tmp/log/info


Con ello, al darle permisos de ejecución y ejecutar el script, nos devolverá una gran cantidad de información de status, en un paginador con le cual podremos movernos usando las flechas del cursor.
Para cerrar el paginador, debemos presionar q.

Red de invitados
En mi residencia de Puerta de Hierro dispongo de un único router que utilizo para mis quehaceres, pero en ocasiones debo montar el wifi para que mis invitados puedan utilizar sus dispositivos móviles. Es verdad que existen configuraciones específicas para el tema que nos aislan la red wifi de la red local, pero en mi caso no lo considero necesario de momento, por lo que simplemente dispongo una red wifi con una clave simple, diferente a la utilizada regularmente.

En tal caso, podremos preveer dos scripts que cambien la configuración de la red, y la activen. Cada uno de ellos depende de distintos archivos de parámetros generales.

En OpenWRT la red inalámbrica se configura a través del archivo /etc/config/wireless, el cual delimita las opciones de la red wifi, entre ellas el nombre de red (ssid) y la contraseña (key).

Para el funcionamiento adecuado crearé dos archivos de configuración. En el archivo /etc/config/wireless.normal indicaremos nuestros datos normales de la red, incluyendo su nombre de red y su contraseña. Por ejemplo, indicaré:

# configuracion de la red Wifi normal
config wifi-device 'radio0'
    option type 'mac80211'
    option hwmode '11ng'
    option path 'platform/ath9k'
    option disabled '0'
    option country 'AR'
    option txpower '20'
    option htmode 'HT40'
    option channel 'auto'

config wifi-iface
    option device 'radio0'
    option network 'lan'
    option mode 'ap'
    option ssid 'Wifi de Peron'
    option key 'eStA cLabe nO lA Bas A DeScUBrIr nI LoCO'
    option encryption 'psk2+ccmp'


En tanto, en el archivo /etc/config/wireless.invitado pondremos los datos que corresponderán a la red temporal para invitados:

# configuracion del Wifi para invitados
config wifi-device 'radio0'
    option type 'mac80211'
    option hwmode '11ng'
    option path 'platform/ath9k'
    option disabled '0'
    option country 'AR'
    option txpower '20'
    option htmode 'HT40'
    option channel 'auto'

config wifi-iface
    option device 'radio0'
    option network 'lan'
    option mode 'ap'
    option ssid 'Puerta de Hierro - Invitados'
    option key 'vivaperon'
    option encryption 'psk2+ccmp'
# Activarlo con el programa /root/scripts/confwifiinvitado
# Para volver a la wifi normal usar /root/scripts/wifinormal


Estos archivos de configuración no requieren permisos de ejecución.

Para poder activar la red Wifi de invitados o la red Wifi normal, debemos crear dos scripts y darles permisos de ejecución que las den de alta. En el archivo /root/scripts/confwifiinvitado ingresamos el siguiente código:

#!/bin/sh
#activa wifi invitado siguiendo el archivo /etc/config/wireless.invitado
cd /root
wifi down
rm -f /etc/config/wireless
cp /etc/config/wireless.invitado /etc/config/wireless
wifi up
echo Se activo la wifi de invitado!

Luego en el archivo /root/scripts/confwifinormal, le incorporamos el siguiente código:

#!/bin/sh
#activa wifi normal segun archivo /etc/config/wireless.normal
cd /root
wifi down
rm -f /etc/config/wireless
cp /etc/config/wireless.normal /etc/config/wireless
wifi up
echo Se reestablecio la wifi normal...


Tras editar ambos scripts, les otorgamos sus necesaarios permisos de ejecución con:

chmod +x /root/scripts/confwifiinvitado /root/scritps/confwifinormal:

Ahora, si ejecutamos el script confwifiinvitado, la red se llamara "Puerta de Hierro - Invitados" y la contraseña será "vivaperon". Y si ejecutamos confwifinormal, la red se llamará "Red de Peron" y la contraseña será la dificultosa "eStA cLabe nO lA Bas A DeScUBrIr nI LoCO".

viernes, 7 de agosto de 2015

¿Como puedo programar un botón de mi router con OpenWRT?

En la necesidad de modernizar diferentes industrias del país, Juan Perón invitó a un número de personalidades de la técnica, que estableciendo vínculos con la Argentina, pudieron mejorar los prospectos de la industria. De entre las enseñanzas, guardamos aquella de cómo programar los botones de nuestro router a través del firmware OpenWRT para darle nuevos usos.

(...)
Muchas veces me preguntaron porqué traje a los hombres de ciencia de un país derrotado a nuestro Vergel de Paz. Pero la respuesta era simple: los científicos Alemanes nos enseñaron los rudimentos de ciencia en la que nuestros hombres atrasaban, y nos permitieron afianzar la industria del país en un camino de grandeza como lo han tenido las Grandes Naciones del Tierra.


Todo lo que hemos aprendido ha sido bueno, y de lo que no hemos sacado rédito instantáneo, lo hemos hecho al tiempo. Así es como ha de lograrse un verdadero progreso. En ocasiones, nos hemos valido de la improvisación para encontrar un uso a la técnica y utillaje que siquiera sus creadores preveían.

La industria mecánica de Córdoba es un claro ejemplo, con su rastrojero iniciado a partir de utillaje aeronáutico y de circunstancias. Si este ejemplo puede encontrarse en el desarrollo de la industria pesada, cómo no va a haberlo en la telemática. Encontraremos ejemplos en lo que algo pensado para una cosa, termina siendo mejor aplicado para otra.

La mayoría de los enruteadores modernos disponen de un botón nomenclado como WPS. Dicho botón activa una funcionalidad telemática capaz de "asociar" un dispositivo Wifi a nuestra red local inalámbrica cifrada con contraseña sin necesidad de compartir la clave. Explicado de manera sencilla, al presionar el botón se dará inicio a una ventana de tiempo de dos minutos, durante el cual el router - en confianza - asociará a cualquier dispositivo Wifi en el que también se presione dicho botón. Una vez transcurrido los dos minutos, volverá a cifrarse y cerrarse la red inalámbrica.
La idea original estaba bien intencionada. Sin embargo, muchas cosas malas pueden hacerse en dos minutos, y si lo sabrá su madre. Nada impide que durante dicha ventana temporal, usuarios malévolos en las cercanías puedan asociarse a la red sin que tuviésemos maneras obvias de saberlo. Por lo tanto, la funcionalidad WPS - en lugar de hacer la vida más fácil al Pueblo - terminó perjudicándolo y llevándole inseguridad por partes iguales...

Pues bien, en tratados anteriores he relatado a la Masa que muchos routers (como por ejemplo, el TP-Link TL-WR941ND peronista) pueden ser dotados de un firmware libre que reemplaza al limitado programa interno original. He explicado como instalar dicho firmware libre OpenWRT en nuestro router y cómo configurarlo para hacer de él una potente máquina multifunción. ¡Lo hemos dicho! En vista de las mencionadas deficiencias con el sistema de asociación WPS, el firmware libre OpenWRT no usa esta característica, y ello significará que el botón WPS del router (nomenclado como "QSS" en los routers TP-Link) quedará "como cenicero de Pochoneta".

Sin embargo, gracias al Justicialismo y a nuestra doctrina de Software Libre, nos será bien posible utilizar el botón QSS para realizar otras acciones que nos plazcan, si sabemos configurarlo. Podremos programar el botón WPS/QSS para que nos sirva para apagar o encender el radioemisor de Wifi (y por lo tanto, de la red inalámbrica). Esto presenta algunas ventajas: podríamos dejar el router encendido 24x7 realizando tareas de enrutamiento por cable, servicio de correo, o un mini-servidor web, etc, pero decidir apagar el Wifi cuando no estamos en el hogar, o apagarlo de forma manual cuando nadie lo vaya a utilizar, o apagarlo automáticamente siguiendo un patrón de horarios.


Naturalmente que en primer lugar, debemos tener ya instalado y configurado OpenWRT en nuestro aparato (en este caso tomaré como referencia el TP-Link TL-WR941ND). Hemos de notar también que por la característica de esta tarea, nos convendrá conectarnos al router de manera cableada.

Acto seguido, será útil asegurarnos de que el botón QSS del router funciona, y conocer en particular cuál es su "nombre de hardware".

Para ello nos logueamos al router como se ha explicado en otros tratados (normalmente con ssh root@dirección_ip_del_router). Una vez dentro del router (el prompt podría indicar root@OpenWrt o similar) crearemos una carpeta donde irán las rutinas autoejecutables para los botones. Lo haremos ingresando en el router,:

mkdir -p /etc/hotplug.d/button

Ahora usaremos el editor peronista Vi para crear un archivo llamado buttons en dicho directorio, con el comando:

vi /etc/hotplug.d/button/buttons

Es importante conocer bien el funcionamiento del editor, para ser práctico a la hora de configurar el router. El editor Vi normalmente opera en modo revisión, por lo cual no podremos modificar ni agregar ningún texto. Para pasar al modo de inserción de texto hemos de presionar la tecla i. Solo entonces podremos escribir o pegar en la Terminal el texto que querramos. En este caso, hemos de pegar allí el siguiente código, pensado para evaluar el funcionamiento de los botones del router:

#!/bin/sh
# Script para que los botones reporten sus acciones.
logger el boton $BUTTON reporta accion $ACTION


Para guardar los cambios en el archivo recién editado en Vi, hemos de presionar Esc, y tipear el comando :wq que se encargará de grabar (w) y salir (q) del editor. Nos devolverá a la línea de comandos del router.

Conforme estemos en el prompt de nuestro enruteador, habremos de evaluar el botón correspondiente: en el caso del TP-Link TL-WR941ND presionamos el botón "QSS" que se encuentra en la derecha del panel frontal (es el único botón).
Hecho esto, en la terminal del router ejecutaremos el comando:

logread

...y nos devolverá un largo archivo, el cual al final debería indicarnos final algo como:

user.notice root: el boton wps reporta accion pressed
user.notice root: el boton wps reporta accion released


Esta información recabada es importante pues nos confirma el nombre de hardware del botón QSS, que en realidad es "wps", y los estadíos que puede tomar dicho botón de software: "pressed" (presionado) y "released" (soltado).

Sabiendo esto, agregaremos dos archivos nuevos para configurarlo. Unos es el archivo /etc/hotplug.d/button/00-button, que configura el funcionamiento general de los botones, y otro es el que especificará el funcionamiento particular el botón QSS. Para ello los agregamos con Vi:

vi /etc/hotplug.d/button/00-button

Una vez en el editor, presionamos i e insertamos el siguiente código:

#!/bin/sh
. /lib/functions.sh
do_button () {
        local button
        local action
        local handler
        local min
        local max
 
        config_get button $1 button
        config_get action $1 action
        config_get handler $1 handler
        config_get min $1 min
        config_get max $1 max
 
        [ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n "$handler" ] && {
                [ -z "$min" -o -z "$max" ] && eval $handler
                [ -n "$min" -a -n "$max" ] && {
                        [ $min -le $SEEN -a $max -ge $SEEN ] && eval $handler
                }
        }
}
 
config_load system
config_foreach do_button button

Guardamos los cambios y salimos de Vi con Esc + :wq.


Acto seguido, agregaremos la especificación de funcionamiento del botón QSS en el fichero configuración correspondiente, que es /etc/config/system. Para ello ingresamos el comando:

vi /etc/config/system

Las especificaciones de funcionamiento del botón QSS/WPS será la de apagar el emisor Wifi y la red inalámbrica al presionarlo brevemente (durante menos de un segundo). Si lo presionamos entre uno y cinco segundos, encenderá el Wifi y la red inalámbrica. Considerando esto, en Vi pasamos al modo inserción con la tecla i, y al final del archivo /etc/config/system, habremos de agregarle las siguientes lineas de configuración:

# Agregado al archivo /etc/config/system 
# para configurar el botón OSS/WPS del Router TP-Link
# Esto apaga el emisor Wifi y la red inalámbrica
# al presionar el boton QSS/WPS menos de 1 segundo.
config button
    option button 'wps'
    option action 'released'
    option handler 'uci set wireless.@wifi-device[0].disabled=1 && wifi'
    option min '0'
    option max '1'
 

# Esto enciende el emisor Wifi y la red inalámbrica
# si se presiona el boton QSS/WPS entre 1 y 5 segundos.
config button
    option button 'wps'
    option action 'released'
    option handler 'uci set wireless.@wifi-device[0].disabled=0 && wifi'
    option min '1'
    option max '5'



...guardamos los cambios y salimos del editor Vi con la consabida combinación de teclas Esc + :wq

Para probar los cambios, debemos reiniciar el router con:

reboot

Una vez que el router se reinicie, debemos presionar y soltar el botón QSS durante menos de un segundo, y se apagará el Wifi (podremos comprobarlo al comprobar el apagado de la luz "WLAN" del panel frontal del router. Para reencender el Wifi, debemos presionar el botón QSS entre 1 y 5 segundos (se encenderá la luz WLAN y podremos conectarnos inalámbricamente).

Configurar el encendido / apagado del Wifi a un horario determinado:

Hemos mencionado la potencia y versatilidad que nos permiten los scripts de Cron para activar o desactivar el Wifi en horarios particulares. Por ejemplo, supongamos que según nuestros horarios de trabajo y sueño nos conviene que el Wifi se apague automáticamente a la 23:30PM y se encienda a diana, a las 6:30 AM durante los días de semana.

Para ello será necesario crear dos scripts ejecutables, uno para encender el Wifi y otro para apagarlo, y programar el cronómetro del router (cron). Todo ello lo haremos también desde la terminal del router. Una vez logueados en él, podremos ingresar:

vi /root/wifioff

...presionamos i y le pegamos el siguiente código

#!/bin/sh
# Apaga la WLAN (sin detener el dispositivo de emision radio0)
wifi down


Una vez guardado el fichero y salido del editor (Esc + :wq), utilizaremos el siguiente comando para crear el archivo de encendido:


vi /root/wifion

...y nuevamente usamos i para pegarle su código correspondiente que figura a continuación:

#!/bin/sh
# Enciende la WLAN (sin detener el dispositivo de emision radio0)
wifi on


Guardamos y salimos con Esc + :wq


Conforme hayamos ingresado ambos archivos, nos será imprescindible otorgarles permisos de ejecución para que dichos guiones puedan utilizarse. Lo haremos con el comando:

chmod +x wifionoff wifion wifioff

Ahora podremos programar el cronómetro de ejecución (cron). Esto se hace por medio de una tabla de texto (crontab), modificando el archivo /etc/crontabs/root. Para hacer la tabla crontab editamos el archivo referenciado usando Vi, con el comando:

vi /etc/crontabs/root

...presionamos i para configurar al siguiente texto al final del archivo:

# Ejecuta este script wifioff todos los dias
# a las 23:30pm
30 23 * * * /root/wifioff
# ejecuta el script wifion a las 06:30am
# a las 6:30am

30 06 * * * /root/wifion

...guardamos la tabla de cron recién creada con Esc + :wq y al volver al prompt del router, debemos ejecutar el comando reboot para que surta efecto. Veremos que con ello el Wifi se apagará automáticamente a las 23:30 y se encenderá a las 06:30. Si necesitásemos encenderlo durante ese horario, bien podríamos presionar el botón del aparato durante 1 y 5 segundos para activarlo.


Podría ser que en determinadas ocasiones necesitemos un script distinto, que  si el Wifi está encendido lo apague, y si está apagado, lo encienda. Para ello, debemos ingresar el siguiente script:

vi /root/wifionoff

y le pegamos el siguiente código:

#!/bin/sh
STATEFILE="/tmp/wifionoff.state"

if [ $# -eq 1 ]; then
  case $1 in
    "up"|"on")
      STATE=off
      ;;
    "down"|"off")
      STATE=on
      ;;
  esac
else
  if [ ! -e ${STATEFILE} ]; then
    STATE=on
  else
    . ${STATEFILE}
  fi
fi
if [ -z ${STATE} ]; then
  STATE=on
fi

if [ ${STATE} == "on" ]; then
  /sbin/wifi down
  STATE=off
else
  /sbin/wifi up
  STATE=on
fi

echo "STATE=${STATE}" > ${STATEFILE}


Guardamos y salimos del editor Vi con Esc + :wq.