Pues dicho lo anterior, inauguraré yo mismo el hilo de configuraciones con una configuración básica de Módem-Router/Router ADSL/PCs en la que:
1.- Todos los dispositivos están en la misma red 192.168.1.x
2.- La página de configuración del módem es alcanzable desde los PCs detrás de openwrt (LAN).
3.- Se redirigen puertos para acceder al router openwrt por SSH desde Internet.
4.- Se redirigen puertos para acceder al router openwrt por LuCi desde Internet (poco aconsejable).
5.- Se configura una cuenta para acceso por DNS dinámico desde Internet.
6.- Se abren puertos para alcanzar desde Internet un servidor FTP localizado en el router openwrt.
7.- Se redirigen puertos para alcanzar desde Internet un servidor FTP localizado en un PC.
8.- Se redirigen puertos para hacer funcionar el Emule en un PC.
9.- Se controlan los cambios de IP del modem-router y se envía una advertencia a una cuenta de correo.
10.- Se comprueban los bloqueos de tráfico en la WAN y se relevantan las interfaces para eliminar cualquier fallo esporádico que pudiera bloquear el tráfico
11.- Se resetea el módem tras un periodo sin tráfico para forzar a hacer una reconexión limpia. Es dependiente de cada módem y en el ejemplo que pongo se reseteará un módem TP-LINK mediante una sesión telnet automática.
La configuración parte con los dispositivos con las siguientes IPs:
Módem: 192.168.1.2
Openwrt (WAN): 192.168.1.100
Openwrt (LAN): 192.168.1.1
PC: 192.168.1.140
Portátil: 192.168.1.175
Si bien es cierto que en la LAN podemos activar el protocolo DHCP para que las IPs se asignen dinámicamente, necesitamos que los dispositivos que vayan a estar disponibles para su acceso desde Internet tengan IP FIJA, ya que vamos a redirigir tráfico a unas IPs en concreto y necesitamos que sean inamovibles. El portátil no va a ser accesible desde internet así que podríamos activar DHCP para el portátil, no obstante yo siempre aconsejo poner IPs fijas y deactivar por completo DHCP a no ser que sea estrictamente necesario.
Necesitamos que el router openwrt tenga una interfaz WAN y otra interfaz LAN. Si nuestro router sólo tiene interfaz LAN podemos crear una interfaz WAN en una de las bocas del switch del router siguiendo este tutorial:
https://foro.seguridadwireless.net/openwrt/luci-configurar-puerto-lan-como-wan/Debemos anotar el nombre de la interfaz física del router que se haya asociado con nuestra WAN. Para saberlo podemos mirar en la página de LuCi -> Interfaces, el nombre que aparezca debajo de la interfaz WAN (generalmente será eth0.2). Si el nombre no es eth0.2 debemos cambiarlo por el adecuado en los scripts en los que se haga referencia.
Problema 1: La página de configuración del módem no es accesible desde la LAN dado que según la tabla de rutas del router cualquier tráfico dirigido a las IPs 192.168.1.x saldrá por la interfaz LAN. Sin embargo para acceder al módem necesitamos que el tráfico de la IP 192.168.1.2 salga por la interfaz eth0.2 (WAN).
Para solucionar esto debemos decirle al router que si el tráfico se debe dirigir al dispositivo 192.168.1.2, el tráfico debe salir por la interfaz eth0.2 (WAN) y no por la LAN dado que no está enchufado ahí.
Abrimos una sesión SSH al router y hacemos lo siguiente:
route
Nos debe devolver algo parecido a lo siguiente:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.2 0.0.0.0 UG 0 0 0 eth0.2
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
En la tabla vemos que el tráfico para la subred 192.168.1.x se dirige por la interfaz br-lan y que cualquier otro tráfico es sacado por la WAN eth0.2
Debemos agregar la ruta para decirle al router cómo encontrar el modem en 192.168.1.2
Para ello creamos un fichero en /etc/routes.bat
vi /etc/routes.bat
route add -host 192.168.1.2 dev eth0.2
route del -net 192.168.1.0 netmask 255.255.255.0 dev eth0.2
route add default gw 192.168.1.2
chmod +x /etc/routes.bat
/etc/routes.bat
Ahora la tabla de enrutamientos nos debe devolver algo parecido a lo siguiente:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.2 0.0.0.0 UG 0 0 0 eth0.2
192.168.1.0 * 255.255.255.0 U 0 0 0 br-lan
192.168.1.2 * 255.255.255.255 UH 0 0 0 eth0.2
Para probar que funciona, hacemos un ping 192.168.1.2. Nos debe de devolver el ping correctamente. Si no nos lo devuelve es que algo hemos hecho mal y debemos revisar lo que llevamos hecho hasta ahora.
root@WD-N750:~# ping 192.168.1.2
PING 192.168.2.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: seq=0 ttl=64 time=0.773 ms
64 bytes from 192.168.1.2: seq=1 ttl=64 time=0.749 ms
64 bytes from 192.168.1.2: seq=2 ttl=64 time=0.594 ms
64 bytes from 192.168.1.2: seq=3 ttl=64 time=0.594 ms
^C
--- 192.168.2.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.594/0.677/0.773 ms
Ahora nos vamos a editar el fichero /etc/rc.local
Agregamos esto antes del exit 0
/etc/routes.bat
Para que se ejecute cada vez que arranquemos el router.
Con esto podemos alcanzar el módem desde el router, ¿pero cómo lo alcanzamos desde un PC?
Lo vamos a solucionar utilizando el propio router como navegador y configurando un proxy desde el PC.
Para ello necesitaremos instalar el paquete:
tinyproxyUna vez instalado procederemos a configurarlo para tener acceso solamente desde la LAN por el puerto 4444.
Desde LuCi podemos configurarlo así:
Si queremos configurarlo sin LuCi, el fichero que hay que editar está en /etc/config/tinyproxy
config tinyproxy
option User 'nobody'
option Group 'nogroup'
option Port '4444'
option Timeout '600'
option DefaultErrorFile '/usr/share/tinyproxy/default.html'
option StatFile '/usr/share/tinyproxy/stats.html'
option LogFile '/var/log/tinyproxy.log'
option MaxClients '100'
option MinSpareServers '5'
option ViaProxyName 'tinyproxy'
option enabled '1'
list ConnectPort '443'
option MaxSpareServers '5'
option StartServers '5'
option MaxRequestsPerChild '5'
list Allow '127.0.0.1'
list Allow '192.168.1.0/24'
option LogLevel 'Warning'
Nos aseguramos de que TinyProxy se inicia al arrancar el router. Desde LuCi -> StartUp, miramos si tinyproxy está activo, y si no lo está, lo activamos:
Ahora, desde el PC con el que queramos acceder a la configuración del router, configuramos un navegador para utilizar el proxy del router. En el ejemplo pongo la configuración de un Mozilla Firefox:
Los parámetros del proxy son IP:192.168.1.1 y el puerto 4444.
Ahora navegamos hasta la IP del módem para ver si funciona:
http://192.168.1.2Si accedemos a la página de configuración del módem, hasta ahora lo hemos hecho bien...
Se recomienda sólo configurar el proxy en el navegador cuando vayamos a acceder a la configuración del módem, y quitar el proxy cuando vayamos a navegar simplemente por Internet, para no saturar el router navegando por nosotros por Internet...
Problema 2: ¿Cómo dirigimos el tráfico del módem hasta el router para administrar el tráfico?
Aqué tenemos varias posibilidades, y dependen del tipo de módem/router que tengamos, pero casi todos van a admitir o bien redirigir el tráfico de los puertos hasta una IP, o bien definir una IP a la que dirigir todo el tráfico entrante (zona DMZ).
El módem de ejemplo que pongo admite ambas opciones, así que he definido las dos:
Redirección del tráfico de todos los puertos a la WAN de openwrt:
También podemos seleccionar los puertos que específicamente queramos, por si no queremos dirigir todo el tráfico, pero en este caso sí que queremos dirigirlo todo al router openwrt y que sea éste quien enrute.
Redirección de todo el tráfico a la WAN de openwrt mediante DMZ:
Con lo anterior ya redirigimos todo el tráfico de internet al router openwrt y por lo tanto podemos configurar el router openwrt como si fuera un router neutro normal.
Ahora vamos a configurar el router openwrt para aceptar conexiones por SSH y a la página de configuración de LuCi (aunque esto último es poco aconsejable via Internet, lo pongo como ejemplo)
Para añadir un poco de seguridad, cambiaremos los puertos por defecto abiertos al exterior.
El puerto externo que vamos a usar para conectarnos a SSH va a ser el 22222 y lo vamos a redirigir al puerto 22 del router
El puerto externo que vamos a usar para conectarnos a LuCi va a ser el 11111 y lo vamos a redirigir al puerto 80 del router
Bajo LuCi nos vamos Network -> Firewall -> Port Forward y agregamos uno con las siguiente configuración:
Ahora agregamos uno más con esta otra configuración para LuCi.
Si queremos editar directamente el fichero, nos vamos a /etc/config/firewall y agregamos estas reglas:
Para SSH desde el exterior:
config redirect
option name 'SSH-Wan-redirect'
option src 'wan'
option proto 'tcp'
option src_dport '22222'
option dest_port '22'
option dest 'lan'
Acceso LuCi desde el exterior:
config redirect
option name 'LuCi-Wan-redirect'
option src 'wan'
option proto 'tcp'
option src_dport '11111'
option dest_port '80'
option dest 'lan'
Problema 3: Para acceder desde el exterior y con IP dinámica, ¿cómo lo hago?
Tenemos varias soluciones para esto. Voy a comentar cómo montar el servicio de IP dinámica con los scripts de openwrt y cómo mandarnos un correo a una cuenta cada vez que se detecte un cambio de IP.
Para utilizar el servicio de IP dinámica de openwrt debemos instalar el paquete
ddns-scripts si queremos configurarlo desde línea de comandos y
luci-app-ddns si queremos configurarlo desde LuCi.
Mi consejo es que lo hagáis desde LuCi porque es bastante más fácil.
Yo utilizo una cuenta en changeip.com porque es gratuíta y además te muestra el histórico de actualizaciones.
La página de configuración de dns dinámica está en Services -> Dynamic DNS.
Una configuración de ejemplo podría ser esta. Hay que sustituir los datos por los que tengáis en vuestra cuenta.
Páginas para averiguar la IP en texto plano podéis usar estas dos:
http://icanhazip.com
http://ipecho.net/plain
Si conocéis alguna otra sois libres de hacerlo.
Por si queréis realizar lo anterior desde línea de comandos, el fichero a editar es /etc/config/ddns
config service 'myddns'
option interface 'wan'
option use_syslog '1'
option use_https '0'
option force_interval '72'
option force_unit 'hours'
option check_unit 'minutes'
option retry_interval '60'
option retry_unit 'seconds'
option username 'username'
option password 'password'
option check_interval '99'
option enabled '1'
option ip_source 'web'
option service_name 'changeip.com'
option domain 'miservidor.dyndns.com'
option ip_url 'http://ipecho.net/plain'
Ahora hemos de decirle al router que ejecute el script cada vez que encendemos el router, ya que no sé por qué no funciona de forma automática.
Nos vamos a System -> Startup, y en la parte de abajo en el cuadro de Local Startup tecleamos esto antes del exit 0.
/usr/lib/ddns/dynamic_dns_updater.sh myddns &
Si queréis editarlo a mano, el fichero está en /etc/rc.local
myddns es el nombre que le hemos puesto a la cuenta al agregar la configuración a openwrt. Si la habéis cambiado de nombre, poned el nombre adecuado aquí también.
Ya podremos acceder al router desde internet utilizando nuestra dns dinámica. Por ejemplo para acceder a LuCi desde internet pondríamos en el navegador
http://miservidor.dyndns.com:11111
Supongamos ahora que queremos acceder a un servidor de FTP que hemos montado en el router (no voy a explicar aquí cómo montar el servidor porque me alargaría demasiado, pero explicaré cómo abrir los puertos para acceder desde Internet).
Nos vamos a Network -> Firewall -> Traffic Rules y agregamos una con la siguiente configuración:
Observad que ahora no hemos redirigido ningún puerto externo a uno interno, sino que simplemente hemos aceptado el tráfico desde la zona WAN, al router. Esto puede resultar peligroso ya que si el puerto usado es reconocible para algún tipo de servicio (21 en el caso de FTP) es más probable que nos lo localicen y nos ataquen por ese puerto si el programa que gestiona dicho puerto contiene algún bug, exploit o fallo.
Si queréis configurar directamente por fichero en lugar de por LuCi, el fichero a editar es /etc/config/firewall
config rule
option target 'ACCEPT'
option src 'wan'
option proto 'tcp'
option dest_port '21'
option name 'FTP'
Ahora supongamos que lo que queremos alcanzar desde Internet no es un FTP en el router, sino un FTP en un PC conectado al router, o queremos abrir los puertos al eMule, bitTorrent o algo similar.
El procedimiento que usaremos para acceder al FTP del PC va a ser redirigiendo el puerto 2121 del router al puerto 21 del PC en el que tendremos el servidor de FTP.
La regla a poner en /etc/config/firewall es:
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option src_dport '2121'
option dest_ip '192.168.1.140'
option dest_port '21'
option name 'FTP_PC'
En el caso de que lo que querams es abrir los puertos al eMule, debemos anotar los puertos que tengamos configurados en el eMule y abrirlos de forma análoga en el firewall.
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option src_dport '5145'
option dest_ip '192.168.1.140'
option dest_port '5145'
option name 'eMule_5145'
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp udp'
option src_dport '5146'
option dest_ip '192.168.1.140'
option dest_port '5146'
option name 'eMule_5146'
En el ejemplo anterior hemos destinado los puertos 5145 y 5146 al eMule del PC con la IP 192.168.1.140.
Con lo anterior realizado tenemos una configuración bastante básica y funcional con openwrt, pero vamos a rizar un poco el rizo. Vamos a hacer que cada vez que el router cambie de IP externa nos mande un correo a una cuenta de email.
Para ello necesitaremos instalar el paquete
msmtp para gestionar el envío de correo.
Una vez instalado, creamos un script que nos compruebe la IP del router cada cierto tiempo, y que al ver un cambio en ella nos envíe un correo a nuestra cuenta.
Creamos un script en /etc/checkip.bat con el contenido siguiente:
#/bin/sh
CHECKIPPAGE=http://ipecho.net/plain
#CHECKIPPAGE=http://icanhazip.com
IPADDRESS=$(wget -qO- ${CHECKIPPAGE})
echo "To: micuenta@micorreo.es" > /tmp/mail.txt
echo "From: miservidor.dyndns.com" >> /tmp/mail.txt
echo "Subject: Router IP change - ${IPADDRESS}" >> /tmp/mail.txt
echo "" >> /tmp/mail.txt
if [ -f "/tmp/.current_ip" ]
then
if [[ "${IPADDRESS}" != "$(cat /tmp/.current_ip)" ]]
then
echo ${IPADDRESS} >|/tmp/.current_ip
cat /tmp/mail.txt /tmp/.current_ip | sendmail -t -a default
fi
else
echo ${IPADDRESS} >|/tmp/.current_ip
cat /tmp/mail.txt /tmp/.current_ip | sendmail -t -a default
fi
Ahora para hacer el script ejecutable, hacemos un
chmod +x /etc/checkip.bat
El script básicamente lo que hace es comprobar nuestra IP con una página exterior, y comprobar si conincide con la anteriormente almacenada en /tmp/.current_ip. Si no coincide, la almacena y nos manda un correo.
Debemos también configurar los datos de la cuenta de correo en el fichero /etc/msmtprc
Esto es un ejemplo, lo tendréis que adaptar a vuestros parámetros y cuenta de correo:
# Example for a system wide configuration file
# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default
# The SMTP smarthost.
host smtp.1and1.es
port 587
auth on
auto_from off
maildomain micuenta@micorreo.es
from micuenta@micorreo.es
#subject "Router IP Change"
user usuariodecorreo
password passworddecorreo
tls on
tls_starttls on
tls_certcheck off
logfile /tmp/msmtp.log
# Construct envelope-from addresses of the form "user@oursite.example".
#auto_from on
# Use TLS.
#tls on
#tls_trust_file /etc/ssl/certs/ca-certificates.crt
# Syslog logging with facility LOG_MAIL instead of the default LOG_USER.
#syslog LOG_MAIL
account default es el nombre de la configuracion a la que se hace refencia en
sendmail -t -a defaultEl resto de parámetros como usuario y contraseña los tendréis que ajustar a los vuestros personales.
Ahora le decimos a openwrt que queremos ejecutar el script cada 10 minutos. No es conveniente hacerlo más a menudo porque nos podrían prohibir el acceso a la página de la IP.
Nos vamos a System -> Scheduled Tasks y agregamos lo siguiente:
*/10 * * * * /etc/checkip.bat
Si queremos editarlo manualmente, el fichero está en /etc/contabs/root
Ahora nos aseguramos de que las tareas se ejecuten automáticamente comprobando en LuCi que en System -> Startup la tarea cron esté activada.
Ahora vamos a rizar un poco más el rizo y vamos a intentar detectar cuándo el router o el módem se quedan bloqueados para resetar los parámetros e intentar recuperar la conexión sin que tengamos que tocar nada.
La primera versión nos inicializará la interfaz WAN del router para intentar recuperar errores en caso de que no tengamos acceso a Internet durante un rato.
Lo primero creamos un script como este:
/etc/check-adsl-modem.bat
#!/bin/sh
CHECKINTERFACE=eth0.2
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
(ifdown wan; ifup wan; /etc/routes.bat) &
fi
fi
fi
fi
Lo hacemos ejecutable:
chmod +x /etc/check-adsl-modem.bat
Recordad que
eth0.2 es nuestra interfaz WAN física. Si la vuestra es otra ajustad el nombre al adecuado.
Lo que hace es un ping a
www.google.es. Si no recibe respuesta en 40 segundos, nos reinicia la interfaz wan y vuelve a incluir las rutas para acceder al módem desde el PC.
Ahora le decimos a nuestra tarea cron que ejecute el script cada 10 minutos:
Nos vamos a System -> Scheduled Tasks y agregamos lo siguiente:
*/10 * * * * /etc/check-adsl-modem.bat
Si queremos editarlo manualmente, el fichero está en /etc/contabs/root
Esto está bien para intentar recuperar algunos errores, pero ¿qué pasa si es el módem el que se ha quedado tostado y hay que reiniciarlo?
Pues podemos poner una segunda versión de lo anterior, pero que depende del módem que tengáis y de cómo tengáis que acceder a él vía telnet o por http para hacer un reset, y que también depende de si al quedarse tostado, todavía es capaz de recibir este tipo de conexiones desde el router o no.
Voy a poner un ejemplo para resetear un módem/router TP-LINK mediante telnet automatizado, por si a alguien le sirve de inspiración para cualquier otra cosa.
Vamos a necesitar el paquete
empty para automatizar telnet mediante scripts (ya que expect no está disponible para openwrt)
Ahora creamos el script /etc/check-adsl-modem.bat con un añadido
#!/bin/sh
CHECKINTERFACE=eth0.2
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
if ! ping -q -c 1 -W 10 -I ${CHECKINTERFACE} www.google.es > /dev/null; then
(ifdown wan; ifup wan; /etc/routes.bat; /etc/reboot_modem.bat) &
fi
fi
fi
fi
Lo hacemos ejecutable:
chmod +x /etc/check-adsl-modem.bat
Como veréis es parecido al script siplificado del ejemplo anterior, pero ahora al resetear las interfaces, también llama a un script auxiliar para resetear el módem.
Pues vamos a crear el script para resetear el módem:
/etc/reboot_modem.bat
#!/bin/sh
# emtelnet.sh v.0.4
# telnet example for empty
# Copyright (C) 2005, 2006 Mikhail E. Zakharov
#
telnet="telnet" # (/full/path/to/)telnet
target="192.168.1.2" # target telnet-host
login="root" # username (Change it!)
password="password" # password (Change it!)
fifo_in="/tmp/empty.in" # input fifo
fifo_out="/tmp/empty.out" # output
file_out="/tmp/empty.tmp" # tempfile to store result
# telnet command examples. Chose one:
#telnet_cmd="$telnet -K $target" # connect FreeBSD from FreeBSD (SRA)
telnet_cmd="$telnet $target" # All other OSes
# -----------------------------------------------------------------------------
echo "Telnetting to modem"
empty -f -i $fifo_in -o $fifo_out -L $file_out $telnet_cmd
if [ $? = 0 ]; then
if [ -w $fifo_in -a -r $fifo_out ]; then
echo "Waiting Welcome Message"
empty -r -t 20 -i $fifo_out
sleep 2
empty -w -Sv -i $fifo_out -o $fifo_in -t 20 "username:" "$login\n"
#echo "Sending Password"
sleep 2
empty -w -Sv -i $fifo_out -o $fifo_in -t 5 "password:" "$password\n"
#echo "Sending Commands"
sleep 2
empty -s -o $fifo_in "dev version\n"
sleep 2
empty -w -v -i $fifo_out -o $fifo_in -t 5 "cmd:SUCC:" "dev serial show\n"
sleep 2
empty -w -v -i $fifo_out -o $fifo_in -t 5 "cmd:SUCC:" "dev reboot"
echo "Sending exit"
sleep 2
empty -s -o $fifo_in ''
sleep 1
empty -w -v -i $fifo_out -o $fifo_in -t 5 "exit telnet" 'e\n'
echo "Check results:"
sleep 1
cat $file_out
rm -f $file_out
else
echo "Error: Can't find I/O fifos!"
return 1
fi
else
echo "Error: Can't start empty in daemon mode"
return 1
fi
echo "Done"
Donde pone
login="root" # username (Change it!)
password="password" # password (Change it!)
Cambiad la parte entre comillas por vuestro usuario y contraseña para acceder al módem.
El resto del script es totalmente dependiente del módem TP-LINK 8840T, así que si tenéis otro os la tendréis que ingeniar para rehacer el script, pero yo pongo esto para que sirva de inspiración...
Lo hacemos ejecutable con
chmod +x /etc/reboot_modem.bat
Ahora le decimos a nuestra tarea cron que ejecute el script cada 10 minutos:
Nos vamos a System -> Scheduled Tasks y agregamos lo siguiente:
*/10 * * * * /etc/check-adsl-modem.bat
Si queremos editarlo manualmente, el fichero está en /etc/contabs/root
Y con esto y un bizcocho, ya está bien de dar la vara...
Recordad, usad esta información bajo vuestra cuenta y riesgo.
Editado para añadir el ejemplo de la configuración de la cuenta de correo
Editado para cambiar un nombre de paquete erróneo