Indice


Paquetes/apps básicas y opcionales

Todos mis routers tienen mínimo 16Mb de flash, por lo que instalo como esenciales los siguientes paquetes:

- htop                # Herramienta de monitorización al estilo top pero mejor
- bmon                # Monitorización de uso de red y estadísticas
- bwm-ng              # monitorización de ancho de banda usado en tiempo real por cada interfaz (refresca encima)
- ifstat              # monitorización de ancho de banda usado en tiempo real por cada interfaz (nueva linea al refrescar y puedes ver el historial)
- iftop               # Monitorización de conexiones de red y el uso de ancho de banda de cada conexión
- iperf               # Para testeos de velocidad de red/wifi contra otro equipo (iperf -s en el equipo server e iperf -c ip_server en el cliente)
- speedtest-netperf   # Lanza test de descarga y subida contra netperf.bufferbloat.net mientras mantiene y monitoriza pings y cpu. Ideal para testear QOS, bufferbloat y calidad de la linea.

- iwinfo              # Consultar informacion de dispositivo y redes wireless. (info, scan, txpowerlist, freqlist, assoclist, htmodelist)

- wget                # Para descargar ficheros o páginas web ( Si tienes wget-nossel -> opkg update && opkg remove wget-nossl --force-depends;opkg install wget )
- curl                # Para ver o descargar ficheros o páginas web
- gzip                # Comprimir y descomprimir
- unzip               # Descomprimir
- libcurl             # libreria necesaria para curl (en principio OpenWRT resuelve dependecias, si instalas curl te instalará también libcurl)
- diffutils           # Util para ver diferencias entre ficheros. `diff file1 file2`
- findutils-xargs     # Comando xargs para encadenar multiples comandos. Ej:  find /tmp/ -type f -maxdepth 1 | xargs -n 1 echo "  Fichero: "

- lsof                # Ver ficheros abiertos (revisa mi alias ofiles)
- hostip              # Para consultas dns. Puedes especificar el resolver con -r pero no el tipo de registro, solo A
- bind-dig            # Para consultas dns. Puedes especificar resolver y registro: ej: dig +short txt gmail.com @9.9.9.9
- mailsend            # Para enviar correos. Util para notificaciones en scripts

- adblock             # Filtrado de malware, publicidad y tracking por blackhole dns
- luci-app-adblock    # Filtrado de malware, publicidad y tracking por blackhole dns (luci)
- coreutils-sort      # Mejora un poco el procesado de algunas listas adblock

- luci-app-commands   # Puedes predefinir algunos comandos en luci para no tener que logearte por ssh para tareas simples
- luci-app-wol        # Para levantar maquinas locales que estén en reposo y lo permitan. Usa y depende de etherwake
- etherwake           # Para levantar maquinas locales que estén en reposo y lo permitan. Wake on lan.
- luci-app-ddns
- ca-bundle           # Lo necesitarás para descargar webs o ficheros con curl o wget por https, aunque se puede omitir que comprueben el certificado.
- luci-ssl-openssl    # Permite conexion https sobre luci (ojo, si tienes reglas que permiten conexion a puerto 80, tendrás que añadir el puerto 443)

Instalarlos todos: opkg install htop bmon bwm-ng ifstat iftop iperf iwinfo wget curl gzip unzip libcurl diffutils findutils-xargs lsof hostip bind-dig mailsend adblock luci-app-adblock coreutils-sort luci-app-commands luci-app-wol etherwake luci-app-ddns ca-bundle luci-ssl-openssl

Adicionales solo para routers, no necesarios en puntos de accesos

- ddns-scripts        # Scripts que permiten sincronizar con servicios de dns dinámicos
- luci-app-ddns       # Scripts que permiten sincronizar con servicios de dns dinámicos (luci)
- fwknopd             # Permite que le envies un certificado a un puerto que escucha de manera silenciosa y en base a eso puedes abrir/redirigir temporalmente un puerto al interior.
- luci-app-fwknopd    # Permite que le envies un certificado a un puerto que escucha de manera silenciosa y en base a eso puedes abrir/redirigir temporalmente un puerto al interior. (luci)
- kmod-ipt-geoip      # Para crear reglas geoip. En mi caso, esencial. Si quieres publicar tu NextCloud, puedes limitar el acceso a solo ips de España
- iptables-mod-geoip  # Para crear reglas geoip. En mi caso, esencial. Si quieres publicar tu NextCloud, puedes limitar el acceso a solo ips de España

    opkg install ddns-scripts luci-app-ddns fwknopd luci-app-fwknopd kmod-ipt-geoip iptables-mod-geoip

otros/opcionales:

- nmap                # Ojo con nmap que se lleva unos +4MB de flash y lo normal es que lo lances en tu equipo, no es necesario tenerlo en el router
- arp-scan
- netdiscover
- netperf             # Para tests de velocidad y bufferbload. Es como iperf, pero levanta un demonio y está siempre escuchando. Por defecto al puerto 12865 sobre ipv6
                      #  netperf -H 192.168.12.1 -f m -p 12865 -c -C

- wget                # Puede que realmente tengas wget con un enlace a wget-nossl.  cd /tmp && opkg download wget && opkg remove wget-nossl --force-depends;opkg install wget

Alias

    Para generarte tus propios alias de comandos en el terminal. Para hacerlo permanente en OpenWRT, como usa ash por defecto debes editar /etc/profile y esto es lo que suelo añadir al final del fichero
    Para ver tus alias, ejecuta "alias". Para añadir un alias, ejecuta  " alias comando='comando que quieres que lance' "

    #####    Mis alias
    alias conf='cd /etc/config'
    alias testdns='/etc/config/scripts/testdns.sh'

    alias l='ls -CF'
    alias la='ls -A'
    alias ll='ls -alF --color=auto' # Este viene por defecto en OpenWRT 18
    alias lla='ls -AlF'
    alias llt='ls -AlFst'
    alias lll='ls -AlFs'

    alias update="opkg update"
    alias filtra="opkg list | grep "
    alias nuevos="opkg list-upgradable"
    alias actualiza="opkg list-upgradable | cut -d ' ' -f 1 | xargs opkg upgrade "
    alias testactualiza="opkg list-upgradable | cut -d ' ' -f 1 | xargs opkg upgrade --noaction "

    alias lsblk="block info"
    alias blkid="block info"
    alias busca="find / | grep "
    alias ofiles='lsof | cut -d" " -f1 | sort | uniq -c | sort -k 1 -n'

    alias fw='iptables -nvL'
    alias fw6='ip6tables -nvL'
    alias con='netstat -nptua'
    alias listen='netstat -nlptu'
    #alias listen='ss -nlptua'

    # find /sys/ | grep temp    # Busca sensores de temperatura
    alias t1='temp_raw=$(cat /sys/class/thermal/thermal_zone0/temp | cut -b 1-3);temp=$(echo $temp_raw | cut -b 1-2);echo "${temp}.$(echo $temp_raw | cut -b 3)"'
    alias t2='temp_raw1=$(cat /sys/devices/platform/soc/soc:internal-regs/f1011000.i2c/i2c-0/0-004c/hwmon/hwmon0/temp1_input | cut -b 1-3);temp1=$(echo $temp_raw1 | cut -b 1-2);temp_raw2=$(cat /sys/devices/platform/soc/soc:internal-regs/f1011000.i2c/i2c-0/0-004c/hwmon/hwmon0/temp2_input | cut -b 1-3);temp2=$(echo $temp_raw2 | cut -b 1-2); echo "Core1 ${temp1}.$(echo $temp_raw1 | cut -b 3) - Core2 ${temp2}.$(echo $temp_raw2 | cut -b 3)"'
    alias t='t2'    # En Linksys WRT1900ACS

    alias halt="nlbw -c commit;vnstat -u;/sbin/halt"      # Lanza commit para guardar bases de datos a disco de nlbwmon y vnstat antes de apagar
    alias reboot="nlbw -c commit;vnstat -u;/sbin/reboot"  # Lanza commit para guardar bases de datos a disco de nlbwmon y vnstat antes de reiniciar

    alias BackupWRT='[ -d /etc/config/Backup ] || mkdir /etc/config/Backup ; cd /etc/config/Backup && opkg list-installed > list-installed.`date -I` && sysupgrade -b SysBackup_`date -I`.tar.gz'

    alias genseed="cat /dev/urandom |tr -dc A-Z9|head -c${1:-81}"
    alias genseed2='echo $(cat /dev/urandom | tr -dc A-Z9-9 | head -c81)'   # Importante comilla simple en vez de doble comilla

    genkeywg() {
        cd /etc/config/wireguard && wg genkey | tee wg_privatekey.$1 | wg pubkey > wg_publickey.$1
    }   # Crea clave privadas y publica con el nombre del argument pasado. ej: genkeywg pepe"

    genpass() {
        local :l=$1
        [ "$l" == "" ] && l=16
        tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
    }

    genstrongpass() {
        ASCII='!#$%&()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'   # Falta '"
        local length=$1
        [ "$length" == "" ] && length=2`< /dev/urandom tr -dc 0-9 | head -c1`
        tr -dc "$ASCII" < /dev/urandom | head -c ${length} | xargs echo
    }

Switch/VLAN

En el apartado Switch de luci (/etc/config/network) puedes jugar con los puertos del router, haciendo que todos ellos se vean (por defecto) o aislando unos de otros, con esto segmentamos y aislamos los puertos que queramos mediante vlans.
Openwrt tiene dos maneras de identificar a las vlan. Una es procesar una vlan por core, por lo que estarías limitado a tantos cores tengas y la otra es añadiendo una marca a los paquetes con el id de la vlan, esto además es lo habitual. En total, con las dos maneras tienes un límite de 1000 vlans.

Para los cores de la cpu tenemos tres estados:
    * Off           Esa cpu/core no procesará esa vlan. Si todas están a off para esa vlan, estará desactivada
    * untagged      Asigna esa cpu/core para que procese esa vlan sin añadir ninguna marca a los paquetes (una cpu/core puede tener como máximo una vlan asignada como untagged)
    * tagged        Asigna esa cpu/core para que procese esa vlan, añadirá una marca a los paquetes para identificar de que vlan se tratan

Para los puertos:
    * Off           Ese puerto no está en esa vlan, osea, el táfico de esa vlan no se enviará a este puerto por lo que el que esté conectado ahí no verá nada de esta vlan
    * untagged      Ese puerto forma parte y está conectado a la vlan. Si esa vlan es tipo tagged, eliminará el id que se añadió para reconocer el paquete, por lo que podrás conectar cualquier dispositivo.
    * tagged        Ese puerto forma parte y está conectado a la vlan. En el puerto los paquetes se enviarán con el id de la vlan por lo que el dispositivo que conectes tendrá que tener la vlan también configurada o no verá nada.

     La diferencia entre untagged y tagged es que, como untagged puedes conectar cualquier equipo pero si está como tagged, lo que se conecte a ese puerto debe tener configurada la vlan o no verá nada.
     Como las vlans no es más que añadir un identificador de la vlan al paquete,puedes enviar varias vlans a un mismo puerto, solo que aquel que se conecte solo verá las vlans que tenga configuradas, una o varias.
     Si tu vlan es del tipo untagged, para evitar carga procura elegir untagged en la cpu. Ya que de otra manera los paquetes añaden el id y luego al salir por el puerto lo quita, por lo que es innecesario si todos los puertos están como untagged.
     Luego podrás unir las vlans mediante un bridge a interfaces o wifis para que se junten con los que quieras. Las vlans se nombran en la configuración según el core asignado + el id. Por ejemplo como "eth0.1" o "eth1.832" (core1 y vlan1 o core2 y vlan 832)
     Los operadores de fibra envían la conexión a casa con los paquetes marcados con el id de una VLAN, por eso para poder ver esos datos en el apartado switch debes marcar el puerto de la boca wan como tagged y marcarás el id que utilice el operador.
     Es mejor que configures esto a través de luci, ya que queda más claro pues también se añade la complejidad de que algunos routers el numero no corresponde al puerto y es un lío, revisad la página de vuestro router en OpenWRT.org

    En /etc/config/network se configuran también interfaces y vpn wireguard, dejo solo la parte del switch. En mi caso los puertos 5 y 6 corresponden a los dos cores de la cpu y la numeracion de los puertos es invertida, 4,3,2 y 1 para bocas 1,2,3 y 4

        config switch
                option name 'switch0'
                option reset '1'
                option enable_vlan '1'

        config switch_vlan
                option device 'switch0'
                option vlan '1'         # Identificativo interno en orden conforme creas entradas, no es el id de la vlan
                option vid '1'          # Vlan id 1
                option ports '2 3 5'    # En Linksys WRT1900ACS 2 y 3 son puertos dos y uno. 5 es "cpu eth0"

        config switch_vlan
                option device 'switch0'
                option vlan '2'         # Identificativo interno en orden conforme creas entradas, no es el id de la vlan
                option vid '832'        # Vlan id 832 (WAN de Orange hasta que pueda migrar a Pepephone)
                option ports '4t 6t'    # 4 es el puerto wan y 6 es el puerto "cpu eth1" (notese la t detrás del número, tagged)

        config switch_vlan
                option device 'switch0'
                option vlan '3'         # Identificativo interno en orden conforme creas entradas, no es el id de la vlan
                option vid '2'          # Vlan id 2
                option ports '0 1 6'    # En mi caso 0 es el puerto 4 y 1 el puerto 3.  6 es "cpu eth1"

Equivaldría a esto en un Linksys WRT1900ACS:

ID VLAN CPU (eth0) CPU (eth1) LAN 1 LAN 2 LAN 3 Lan 4 WAN
1 untagged off untagged untagged off off off
2 off untagged off off untagged untagged off
832 off tagged off off off off tagged
        En mi caso utilizo vlans como untagged, ya que conecto detrás equipos normales. Excepto vlan 832 que es la conexión wan al operador de fibra.
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/network/vlan/switch_configuration
IDs de VLAN utilizados por operadores de fibra en España (bandaancha.st)
IDs de VLAN utilizados por operadores de fibra en España (testdevelocidad)

Luci / Admin web

Habilitar https sobre luci

Tan solo instala luci-ssl-openssl. Esto permite la conexión https sobre luci y añadirá dependencias openssl-util y libustream-openssl
Ojo, si tienes reglas que permiten conexion al puerto 80, tendrás que añadir antes tambiñen al puerto 443 o no te podrás conectar, ya que ahora siempre entrarás por https (443)


Wifi


Programador encendido/apagado de wifi

Existe el paquete luci-app-wifischedule que añade una opción en luci para automazar el encendido y apagado de la wifi, pero es más sencillo añadirlo en crontab. Para ello desde luci en la opción "System" -> "Scheduled Tasks" o en terminal con "crontab -e". Dejo un ejemplo con explicación de cada linea. Lo hago que se lance varias veces por si se ha reiniciado, ya que al reiniciar el estado inicial de la wifi es encendida.

    #########################   Programador Wifi   ############################
     00  2-4   *   *   1-5     wifi down                                     # Apaga a las 2, 3 y 4 de la madrugada (L a V)
     00  3-5   *   *   6-7     wifi down                                     # Apaga a las 3, 4 y 5 de la madrugada (finde)
     40  5-6   *   *   1-5     wifi status | grep '"up": false,' && wifi up  # Enciende si esta apagada a las 5:40 y 6:40 ( L a V )
     30  7-9   *   *    *      wifi status | grep '"up": false,' && wifi up  # Enciende si esta apagada de 7:30 a 9:30    (Alldays)  # Alt: iwinfo | grep -c ESSID || wifi up
Notas:
Puedes hacerlo selectivo por interfaz con "wifi down radio0". Para encender tmb, ej: wifi status radio0 | grep '"up": false,' && wifi up radio0
No es bueno lanzar "wifi up" si la wifi ya está encendida, ya que te reiniciará la conexión de todos los clientes, por eso el comando enceder compruebo que esté realmente apagada
Si un interfaz emite varios SSID y quisieras deshabilitar solo un SSID en concreto, deberías hacerlo con comandos estilo uci set wireless.default_wifinet0.disabled='1', seguido de uci commit

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/base-system/cron
https://openwrt.org/docs/guide-user/network/wifi/basic
https://openwrt.org/docs/techref/uci

802.11w conocido también como Protected Management Frames (PMF) o Management Frame Protection (MFP)

Confiere seguridad extra a los clientes que soportan y se conectan usando dicha función. Protegerá de algunos ataques hacia los clientes, tales como denegación de servicio, buscando repetidas desconexiones. Estos ataques suelen usarse en conjunción con falsos puntos de accesos y portal cautivo con los que, el usuario desesperado, no se da cuenta y se conecta al punto de acceso falso e introduce la contraseña en el portal cautivo atacante, en ese momento el atacante cesa su actividad, el usuario finalmente se conecta a su router de siempre y ya han averiguado tu contraseña atacando al usuario más débil.

Requisitos: Debes instalar wpad-full. Para ello:

    opkg remove wpad-basic && opkg install wpad 

Activación: Es muy fácil hacerlo a través de luci. Edita una señal y en "Wireless Security" la opción es "802.11w Management Frame Protection".
Por consola o editando el fichero tan solo es introducir la siguiente linea debajo de cada señal wifi que tengas. Tomo el ejemplo del SSID 'Invitados':

    config wifi-iface 'Invitados' 
        option ieee80211w '1'

Configuración:

    Las opciones son:
        0 -> Desactivado.
        1 -> Opcional.  Si el cliente lo soporta se conectara con 802.11w, sino se conectará de manera tradicional.
        2 -> Requerido. Solo permitirá la conexión de clientes que soporten 802.11w.

    Para redes de invitados puedes usar los modos 0 o 1. Teniendo en cuenta que con 1 podría haber clientes que pudieran no conectarse, aunque es más raro que poniendo un modo 2.
    Para redes internas lo ideal es configurar el modo 2, pero si tienes clientes no compatibles tendrás que bajar al modo 1.
Notas:
Una vez activas 802.11w es probable que necesites reiniciar el router para que cargue el driver de nuevo.
Me suena haber leído algunas incidencias usando WPA3 + 802.11w en primeras versiones de OpenWRT 19. Ojo.

Ventajas:
A un equipo que se conecte con este modo no se le podrán hacer ataques de denegación de servicio como deauth and deauthenticate flood attack or misassociation attacks.
Equipos con Windows y MAC que son los más sensibles a ataques, suelen ser 100% compatibles con el modo 2 y sin pérdida de rendimiento.

Inconvenientes:
Algunos drivers wifi del router pueden no soportarlo.
Algunos drivers de clientes pueden no conectarse en modo forzado pero también algunos equipos podrían no conectarse en modo opcional.
DoS attacks based on management frames not protected by 802.11w are still possible (e.g., association based attacks, beacon based attacks).
En algunos equipos se podría apreciar una considerable disminución de velocida. He llegado a notar en algun equipo de dos a seis veces menos con 802.11w.

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/network/wifi/basic?s[]=ieee80211w
https://www.cwnp.com/wireless-lan-security-and-ieee-802-11w/
https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=4590af20654cf2956bdc77fc121bd8efb1f864ea

Firewall / iptables / seguridad


Deshabilitar ipv6

En mi caso prefiero quitar por completo ipv6. En españa está poco implantado y mayormente en Dual Stack (Mezcla ipv4 y ipv6). Deshabilitandolo reduzco complejidad al centrarme solo en las reglas firewall ipv4.

Cambio o establece en el fichero /etc/sysctl.conf y, aunque no es necerario si modificas el anterior, por si acaso también /etc/sysctl.d/10-default.conf.
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.forwarding=0

Deshabilito el firewall ipv6. Edita el fichero /etc/config/firewall y añade esta linea dentro de config defaults (Esto hace que no procese ni cree reglas ipv6)
option disable_ipv6 '1'

A través de luci coloco al final de todo en Network -> Firewall -> Custom Rules: (O edita el fichero /etc/firewall.user el cual suele llamarse en una entrada de /etc/config/firewall)

    # Reglas DROP para ipv6
    ip6tables -P INPUT DROP                     # Establece politicas por defecto a DROP
    ip6tables -P OUTPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -I INPUT -j DROP                  # Crea una entrada que rechaza todo
    ip6tables -I OUTPUT -j DROP
    ip6tables -I FORWARD -j DROP
    ip6tables -t mangle -P INPUT DROP           # Para ver las reglas: ip6tables -nvL  (Tmb tienes si has colocado el alias fw6)
    ip6tables -t mangle -P OUTPUT DROP
    ip6tables -t mangle -P FORWARD DROP
    ip6tables -t mangle -I INPUT -j DROP        # Para ver las reglas: ip6tables -nvL -t mangle (Tmb tienes si has colocado el alias fw6)
    ip6tables -t mangle -I OUTPUT -j DROP
    ip6tables -t mangle -I FORWARD -j DROP
    ip6tables -t mangle -I PREROUTING -j DROP   # La tabla nat no existe en ipv6, ya que no tiene sentido y precisamente hay tantas ips para no tener que hacer nat.
    ip6tables -t mangle -I POSTROUTING -j DROP
Fuentes y más información/ayuda
https://forum.archive.openwrt.org/viewtopic.php?id=60799
https://openwrt.org/docs/guide-user/network/ipv6/ipv6.essentials

Port scan detection con módulo psd de iptables

El modulo psd de iptables permite detectar y entorpecer o fustrar los escaners de puertos.

Instalar con: opkg install kmod-ipt-psd iptables-mod-psd

Configurar añadiendo al fichero /etc/firewall.user la linea siguiente, donde debajo explico que es cada parámetro por si quieres modificar los valores:

    iptables -I INPUT ! -i lo -m conntrack --ctstate NEW -m psd --psd-delay-threshold 700 --psd-weight-threshold 9 --psd-lo-ports-weight 2 --psd-hi-ports-weight 1 -j DROP -m comment --comment "DropPortScanNew"
      Parámetros:
        --psd-delay-threshold valor         # Son centésimas de segundo de retraso que añadirá a las respuestas una vez se alcance el numero de hits en el que interpretará como un escaner de puertos (default 300)
        --psd-weight-threshold 9            # El numero de hits que debe alcanzar en el tiempo indicado en --psd-delay-threshold. Una vez lo alcanza dropea las siguientes conexiones (default 21)
        --psd-lo-ports-weight 2             # Cada impacto/conexión en los puertos menores al 1024 contarán como dos impactos (default 3)
        --psd-hi-ports-weight 1             # Cada impacto/conexión en puertos igual o encima del 1034, contarán como uno (default 1)
        -j DROP                             # Rechaza las conexiones que cumplan dicha regla
        -m comment --comment "DropPortScan" # Comentario para cuando hagas iptables -nvL reconozcas fácilmente cada regla.
        ! -i lo                             # Excluye (!) las conexiones locales. Podrías indicar al revés, para que se aplique solo sobre el interface de la wan (Revisa tu ip pública con ifconfig o ip addr)
        -m conntrack --ctstate NEW          # Lo añado para poder aplicar una regla más estricta dedicada solo a nuevas conexiones (TCP)  ( En iptables antiguos es lo mismo que -m state --state NEW )

      A tener en cuenta que si se pusiera esta regla antes de la que permite los returning packets de conexiones establecidas y no se especifica que se aplique sobre nuevas conexiones,
        podría ralentizar las conexiones salientes. Por eso excluyo al interface local y afino sobre paquetes NEW (solo tcp) para poder ser más estricto con el delay/hits y salten los time-out del escaner.

      Ojo por que la regla que no especificas los paquetes NEW podría dar falsos positivos aunque estuviera detrás de reglas que permiten los paquetes que retornan de conexiones establecidas,
        ya que el protocolo udp no es orientado a conexión y si por ejemplo tienen varios servidores dns en dnsmasq con un puertos diferentes en cada uno de ellos, podría cortarte algunas consultas.
        Rebaja o dehabilita esta regla si te sucede. Para testear, lanza hostip google.com rápidamente varias veces, usando la flecha hacia arriba para poder hacerlo rápido y testear el salto de la regla.
         Revisa los contadores con iptables -nvL | head o bien iptables -nvL | grep DropPortScan.

Aplicar reiniciando el firewall con /etc/init.d/firewall restart . ¡Ojo!, si tienes fwknopd tendrás que reiniciarlo también /etc/init.d/fwknopd restart

Test: (Probad desde otro equipo de la red antes y después de aplicar la regla para poder valorar las diferencias)

    nmap -sV ip_router   # Se puede bajar la velocidad del escaneo para intentar evadir la medida con -T <0-5>  ( -T 0 es el más lento y -T 3 es la velocidad por defecto )
                         #  Con la regla psd de arriba los resultados del escaneo por defecto ( -T 3 ) no son fiables y ocultará la mayoría de tus puertos abiertos.
                         #  Con la regla psd de arriba se llega a detectar hasta -T 2 pero todo depende del delay que hayas puesto en la regla y el time-out configurado en el escaner de puertos
                         #  Con -T 2 tarda diez vecez más que con -T 3. Un escaneo de todos los puertos sin psd son 5 minutos y con psd puede entorpecer a + 1h. Con -T 0 tardaría días..
                         #  También si aumentan el time-out en el escaneo hará que esta medida pueda ser evitada pero aumentará enormemente el tiempo de escaneo y les harás consumir más recursos.

Port Knock con fwknopd. Abrir puertos de manera segura

En desarrollo

Seguridad extra combinada con GeoIP cuando no puedes poner ips fijas en SOURCE.

    iptables -I INPUT -m geoip --src-cc es -j FWKNOP_INPUT # De esta manera solo aceptaras los paquetes SPA de ips geo-identificadas en el pais que indiques<br>
    iptables -D INPUT -j FWKNOP_INPUT                      # Eliminas la regla que crea fwknopd por defecto, ya que sino seguira aceptando de cualquier sitio

GeoIP firewall

Si quieres abrir puertos sensibles, de esta manera puedes acotarlo a solo los países en los que estás interesado en acceder y mostrarte para el resto como cerrado.
Me lo monto manual, ya que evito instalar excesivas cosas y cuando lo hice de esta manera, no vi que hubiera nada que integrase en OpenWRT la v2 de Geoip
Utilizo los ficheros de finales de diciembre de 2018 por que geoip v1 se descontinuó al inicio de 2019, pero como las ips v4 están agotadas, ya apenas hay movimientos y siendo julio de 2019 no he tenido incidencias

    opkg install iptables-mod-geoip kmod-ipt-geoip
    wget -P /tmp/ https://micorreo.email/LE.tar.gz                  # Descargo las Bases de datos de paises para geoip iptables, pero solo los ipv4 y LE para ahorrar espacio (puedes borrar paises que no te interesen)
    [ -d /etc/config/xt_geoip ] || mkdir /etc/config/xt_geoip       # Crea el directorio dentro de /etc/config/, de esta manera persistirá a los upgrades y se guardará en los Backups
    cd /etc/config/xt_geoip/ && tar -xvzf /tmp/LE.tar.gz            # Descomprime la base de datos de paises.  Los ficheros de países utilizan la iso 3166-2
    chown root:root /etc/config/xt_geoip/LE -R                      # Al descomprimir mantiene los permisos de mi equipo. Establece propietario y grupo a root
    ln -s /etc/config/xt_geoip/LE /etc/config/xt_geoip/BE           # Crea enlace de BE a LE. En OpenWRT GeoIP solo usa LE
    rm -r /usr/share/xt_geoip                                       # Borro la carpeta donde recoge geoip los ficheros de base de datos y
    ln -s /etc/config/xt_geoip /usr/share/xt_geoip                  # Establezco un enlace para que utilice nuestros ficheros de /etc/config/xt_geoip
    # Añade estas dos lineas al principio del fichero /etc/rc.local, de esta manera en los upgrades, no tendrás que repetirte.
        [ -L /usr/share/xt_geoip ]     || rm -r /usr/share/xt_geoip    ; [ -e /usr/share/xt_geoip ]     || ln -s /etc/config/xt_geoip     /usr/share/xt_geoip
        [ -L /etc/config/xt_geoip/BE ] || rm -r /etc/config/xt_geoip/BE; [ -e /etc/config/xt_geoip/BE ] || ln -s /etc/config/xt_geoip/LE /etc/config/xt_geoip/BE

Ahora en las reglas del firewall, en la opción Extra arguments, puedes restringir esa regla a los países que quieras.
Por ejemplo, para permitir solo a ips de origen de España y Andorra: -m geoip --src-cc es,ad
Los codigos de dos letras se basan en iso 3166-2

Como histórico, dejo la alternativa de hacerlo a mi manera antes de descontinuarse la v1:

        Debias instalar iptables-mod-geoip kmod-ipt-geoip iptgeoip
         iptgeoip es muy pesado al instalar todo los necesario para lanzar y procesar los scripts de MaxMind Geoip. En OpenWRT 18.06.1:
          perl perlbase-config perlbase-essential perlbase-getopt perlbase-base perlbase-bytes perlbase-errno perlbase-xsloader perlbase-fcntl perlbase-list perlbase-tie
          perlbase-posix perlbase-scalar perlbase-symbol perlbase-selectsaver perlbase-socket perlbase-io perlbase-dynaloader perl-text-csv_xs gzip unzip iptgeoip

        cd /etc/
        echo -e "UserId 999999\nLicenseKey 000000000000\n# Include one or more of the following ProductIds:\n\n# * GeoLite2-City - GeoLite 2 City\n# * GeoLite2-Country - GeoLite2 Country\n# * GeoLite-Legacy-IPv6-City - GeoLite Legacy IPv6 City\n# * GeoLite-Legacy-IPv6-Country - GeoLite Legacy IPv6 Country\n# * 506 - GeoLite Legacy Country\n# * 517 - GeoLite Legacy ASN\n# * 533 - GeoLite Legacy City\nProductIds GeoLite2-City GeoLite2-Country GeoLite-Legacy-IPv6-City GeoLite-Legacy-IPv6-Country 506 517" >GeoIP.conf

        mkdir -p /tmp/GeoIP; cd /tmp/GeoIP
        /usr/lib/xtables-addons/xt_geoip_dl          # Descarga en la carpeta en que estes: GeoIPCountryCSV.zip  GeoIPCountryWhois.csv  GeoIPv6.csv  (Descontinuados en enero del 2019)
        perl /usr/lib/xtables-addons/xt_geoip_build -D "/usr/share/xt_geoip/" /tmp/GeoIP/GeoIP*.csv  # Genera rangos de ips a partir de csvs descargados y deposita en formato DB iptables en /usr/share/xt_geoip/
        # Toda la base de datos GeoIP ocupa un montón. ~6MB.  Si voy justo de espacio:
        #  rm -r /usr/share/xt_geoip/BE && ln -s /usr/share/xt_geoip/LE /usr/share/xt_geoip/BE    # Ahorra unos 2,8MB.  Geoip solo usa la carpeta LE. Borro LE y dejo enlade a LE.
        #  find /usr/share/xt_geoip/ -name *.iv6 | xargs rm                                       # Ahorra unos 1,4MB+  Borrar los *.iv6 de /usr/share/xt_geoip/
        #  find /usr/share/xt_geoip/BE/* | grep -v -e AD.iv4  -e ES.iv4  -e FR.iv4 | xargs rm     # Ahorra unos 1.4MB+  Dejo solo los ficheros de los países que me interesan
        #Test: iptables -m geoip --help                                                           # Si da error es que no está cargado el modulo
        #Test: iptables -A INPUT -m geoip --src-cc CN -m comment --comment "Test"                 # Si da error es que no está cargado el modulo. Esta regla solo monitoriza, no te afectará.
        #  Se quitará cuando reinicies el firewall pero tmb puedes lanzar iptables -D INPUT -m geoip --src-cc CN -m comment --comment "Test"
Fuentes y más información/ayuda
Ejemplo con una redirección de puertos para NextCloud
Enlace a los codigos iso 3166-2 en la Wikipedia
MaxMing GeoIP
MaxMind GeoIP GeoLite2 Free

Baneo de ip a las que se excedan de fallos de autentificacion por ssh o luci. Estilo fail2ban

https://micorreo.email/fail2ban_openwrt.sh

El propio fichero de arriba tiene documentación.


Adblock (Filtrado de malware, tracking y publicidad por black-hole dns)

En OpenWRT hay muchas maneras de disponer filtrado de malware, anti tracking y publicidad mediante black hole dns. Tres de las semi-automáticas son:

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/ad-blocking


Banhostlist (Teniendo adblock y simple-adblock, no vale la pena, lo dejo como histórico)

No se actualiza desde 2015 y ya viene incluído en lista winhelp de adblock

    https://lede-project.org/packages/pkgdata/banhostlist
    https://github.com/openwrt/packages/tree/openwrt-18.06/utils/banhosts

    find / | grep banhostlist
     /overlay/upper/usr/lib/opkg/info/banhostlist.control
     /overlay/upper/usr/lib/opkg/info/banhostlist.postinst
     /overlay/upper/usr/lib/opkg/info/banhostlist.prerm
     /overlay/upper/usr/lib/opkg/info/banhostlist.list
     /usr/lib/opkg/info/banhostlist.control
     /usr/lib/opkg/info/banhostlist.postinst
     /usr/lib/opkg/info/banhostlist.prerm
     /usr/lib/opkg/info/banhostlist.list     # Descarga de http://winhelp2002.mvps.org/hosts.txt hacia /tmp/banhost
     /etc/hotplug.d/iface/80-banhosts        # Descarga de http://winhelp2002.mvps.org/hosts.txt hacia /tmp/banhost


simple-adblock (no me funcionó en un router GL#inet y desistí rápido ya que desde OpenWRT recomiendan "adblock")

    Instala:  libustream-mbedtls uclient-fetch simple-adblock luci-app-simple-adblock

    Si no encuentra los paquetes de simple-adblock, puedes agregar el repo del mantenedor:
        echo -e -n 'untrusted comment: LEDE usign key of Stan Grishin\nRWR//HUXxMwMVnx7fESOKO7x8XoW4/dRidJPjt91hAAU2L59mYvHy0Fa\n' > /tmp/stangri-repo.pub && opkg-key add /tmp/stangri-repo.pub
        ! grep -q 'stangri_repo' /etc/opkg/customfeeds.conf && echo 'src/gz stangri_repo https://raw.githubusercontent.com/stangri/openwrt-repo/master' >> /etc/opkg/customfeeds.conf
        opkg update; opkg install simple-adblock luci-app-simple-adblock


    Dependencias: uclient-fetch coreutils-sort dnsmasq
        coreutils-sort es opcional para mejorar rendimiento y si ya te viene con busybox, puedes forzar con: `opkg --force-overwrite install coreutils-sort`


    Habilitar:  Por defecto el servicio está deshabilitado. Ahora habilitalo a través de luci  en System -> Startup o a través de terminal con: uci set simple-adblock.config.enabled=1
                Ahora selecciona y habilita las listas que quieres que descargue y procese en el filtrado

    Nota: En un GL-iNet habia desinstalado uhttpd y me desinstalo simple-adblock, al instalar de nuevo simple-adblock me instala uhttpd.
           luci-app-simple-adblock solo funcionará sobre uhhtpd (no habitual, pero por defecto GL-iNet me venia con lighttpd)

    Comandos y ficheros de configuración:
        /etc/init.d/adblock status                      # Ver el estado
        /var/dnsmasq.d/simple-adblock                   # Fichero donde genera el listado adblock a usar por dnsmasq

        uci set simple-adblock.config.enabled=1         # Activar con uci
        /etc/init.d/adblock enable                      # Activar
        /etc/init.d/adblock start                       # Iniciar

        /etc/init.d/adblock query 3ad.doubleclick.net   # Testear
        hostip doubleclick.net -r 8.8.8.8               # Testear a resolver especifico
Fuentes y más información/ayuda
https://github.com/stangri/openwrt_packages/tree/master/simple-adblock/files
Traduccion de luci-app-simple-adbloc al castellano (No está traducido al completo: Échales una mano!)
https://forum.lede-project.org/t/simple-adblock-fast-lean-and-fully-uci-luci-configurable-adblocking/1327


adblock (recomendado)

    Instala: luci-app-adblock y adblock. Como opcional para mejorar el procesado de algunas listas, instala también coreutils-sort

    Una vez instalado el entorno web de luci es muy claro:
        - Seleccionas el servidor dns que utilizas, por defecto OpenWRT usa dnsmasq
        - En Startup Trigger pones la conexión que te da acceso a internet, por lo general, wan. Así detecta cuando conecta para levantar adblock.
        - Marcas las listas de bloqueo que quieres descargar. Yo utilizo la mayoría y me ocupa 1,5MB, así que tenlo presente si vas muy justo de memoria/flash (por defecto lo guarda en ram, sino machacaría mucho la flash)
        - En versiones <19, marca "Force Overall Sort". Elimina los duplicados, ya que pueden venir de diferentes listas. Tarda un poco más al levantar y actualizar las listas en equipos viejos pero luego es más rápido cuando consultes y reduce el tamaño de las listas
        - Marca "Flush DNS Cache" para asegurar que utilice la lista actualizada cuando acualices
        - En routers en la que guardes y tengas poca RAM es interesante activar la opción que elimina el ficero descargado despues de cargarlo en memoria con -> option adb_dnsfilereset '1'
        - Si tienes un pendrive o sd fijas, es interesante marcar "Enable Blocklist Backup" y elegir un directorio del pendrive donde descargar una copia de la bbdd. La utilizará en caso de que no haya internet cuando inicie
        - Si es un router de viaje con 4G, puede ser interesante "Backup Mode", no actualiza al iniciar, tomando lo que haya como backup y ahorrarás datos.
        - Opcional "Email Notification" para notificaciones por correo en caso de errores de proceso o lista vacías (Necesitaras instalar msmtp y ca-bundle)
        - En Advanced puedes editar las Blacklist, whitelist y hacer pruebas en "Query domains"
           "Query domains" es útil para comprobar falsos positivos. Busca entradas de las listas de bloqueo que contengan el texto que pongas
        - Si tu Wan es otra wifi, puedes añadir una espera antes de procesar adblock para asegurar que está levantada añadiendo *option adb_triggerdelay '6'* dentro de extras de */etc/config/adblock*

        Ojo al importar la configuración de antiguas versiones de OpenWRT. Es preferible configurarlo de 0, ya que con nuevas versiones de OpenWRT el fichero trae listas actualizadas. Si lo hiciste es probable que puedas recuperar /etc/config/adblock-opk

        Periodiza actualización de las listas con "Scheduled Tasks" en luci o "crontab -e" o "vim /etc/crontabs/root" por terminal para automatizar que actualize cada cierto tiempo, sino solo se actualizaría al iniciarse
            0 07 * * *    /etc/init.d/adblock reload                # Actualiza cada dia a las siete de la manana

        Configurar las notificaciones de correo:

            /etc/msmtprc                    # Aqui va la configuración de tu usuario, contraseña y datos del servidor de correo para enviar correos

                defaults
                auth            on
                tls             on
                tls_certcheck   off
                timeout         5
                syslog          LOG_MAIL

                account         default
                host            smtp.gmail.com
                port            587
                from            tucuenta@gmail.com
                user            tucuenta
                password        tupass

                account         adb_notify
                host            smtp.gmail.com
                port            587
                from            tucuenta@gmail.com
                user            tucuenta
                password        tupass

            /etc/adblock/adblock.notify             # Aqui van las opciones del envio y destino del correo.
                Cambia el destino en el campo mail_receiver, dale permisos de ejecución y lanza una prueba con "chmod +x /etc/adblock/adblock.notify && /etc/adblock/adblock.notify"
                Añade una notificación por correo si tu listado adblock es inferior a cierta cifra añadiendo *option adb_notifycnt '30000'* dentro de extras de */etc/config/adblock*

        Comandos interesantes por consola:
            /etc/init.d/adblock status
            /etc/init.d/adblock report              # Has de haber habilitado los reportes (option adb_report '1') pero añadirá coste de cpu ya que lo hace con tcpdump
            /etc/init.d/adblock query google.com    # Lanza tests como en "Query domains" en luci

            hostip doubleclick.net -r 127.0.0.1:53  # Test local a lo que servira tu router a los clientes. Si funciona el filtrado, dira que el dominio no existe.
            hostip doubleclick.net -r 1.1.1.1:53    # Test local a un proveedo externo, para que veas que realmente el dominio deberia responder (Proveedores diferentes pueden dar ips diferentes debido a la geolocalizacion. Es correcto)
            hostip doubleclick.net -r 9.9.9.9:53    # Test local a un proveedo externo, para que veas que realmente el dominio deberia responder (Proveedores diferentes pueden dar ips diferentes debido a la geolocalizacion. Es correcto)

Hacks, notas y resolución de posibles incidencias:

Doubleclick.net es un dominio que se suele filtrar siempre, pues son ads de google. En luci, en avanzados de adblock, puedes lanzar consultas y ver si se encuentra en alguna lista, añadir a whitelist, blacklist, etc...

Por defecto usa uclient-fetch para descargar las listas. Si no tienes instaladas las librerias ssl de libustream y tienes seleccionadas listas que requieren conexión ssl, puede generarte incidencias. Si tienes instalado luci-ssl-openssl ya te habrá instalado libustream-openssl y no necesitarás nada. En otro caso, instala libustream-openssl o alguna de las otras dos disponibles (solo una es necesaria).

En la blacklist suelo incluir el contenido de https://github.com/greatis/Anti-WebMiner/blob/master/blacklist.txt

Para la actualición de apps de NextCloud y otros, en la whitelist suelo poner:

    github-production-release-asset-2e65be.s3.amazonaws.com    # Apps NextCloud
    s3.amazonaws.com                                           # Apps NextCloud o listado de ips de newrelic
    raw.githubusercontent.com       # https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts (Probablemente NextCloud tmb)
Fuentes y más información/ayuda
OpenWRT ad-blocking
OpenWRT adblock
OpenWRT simple-adblock

Privoxy. Proxy web con filtrado de contenido indeseado

Privoxy es un servidor proxy sin cache muy ligero que además filtra de manera muy eficiente y sin romper el aspecto de la web, publicidad u otros contenidos indeseados no seguros como inyecciones XSS.

La ventaja o inconveniente de Privoxy es que es el router el que descarga y te sirve el contenido, por lo que la velocidad de la navegación puede quedar sensiblemente reducida si se le hace un uso intensivo, ya que no puedes comparar la potencia de un PC con un router en el que además van todas las conexiones de todos los equipos de la red.
En su ventaja está que realiza un filtrado muy eficiente y compensando al acelerar la carga por filtrar muchas de las peticiones innecesarias e indeseables que no va a realizar.

Al igual que hacemos con los dns y adblock, podríamos forzar todo el tráfico del puerto 80 para que pase por privoxy, forzando así un filtrado de la nevageción web sin necesidad de configurar el navegador ni de usar dns/adblock en el equipo cliente. No podemos forzar el tráfico del puerto 443(https), ya que los certificados se romperían y nos saltarían todos los avisos de los navegadores, pues es una de las buenas funciones de https, el aviasarnos si el tráfico ha sido comprometido. Para lo bueno y para lo malo en este caso, hoy en día la mayoría de tráfico va por https, por lo que realmente serán pocas las conexiones que pasarán por privoxy en modo forzado del puerto 80.

Privoxy escucha por defecto al puerto 8118, por lo que puedes establecer de manera manual el proxy en tu navegador apuntando al router con este puerto, de esta manera todo el tráfico quedará filtrado, tanto http como https.
Personalmente utilizo Firefox por defecto, pero en Chromium, en vez de configurar el navegador tienes opción a establecer el parámetro del proxy en el enlace tal que así: chromium-browser %U --proxy-server="192.168.1.1:8118". La ventaja del modo del enlace que he comentado arriba es que, si usas un portátil, cuando salgas fuera de tu red, no dispondrás del proxy, por lo que no podrías navegar si no lo desconfiguras del navegador, por lo que podrias tener dos enlaces diferentes y no tener que estar cambiando la configuración del navegador. También si tienes tu VPN podrías seguir utilizando el proxy como en casa, pero complicamos el esquema y otro punto es que si se cayese privoxy, te quedas sin poder navegar, pero llevo años usandolo y ha demostrado ser muy estable.

Una particularidad que has de tener es que si configuras un proxy en tu navegador, no necesitas ni dependes de dns. Si configuras el proxy con una ip realmente no necesitarías DNS, pues es el proxy el que hará las peticiones. Ten esto presente, pues el filtrado adblock se suele hacer por dns y el proxy estará usando los que tenga configurados el sistema del router y es por eso que suelo poner en el router que haga las peticiones a sí mismo a través de dnsmasq (127.0.0.1:53). Así cierro el circulo y con privoxy dispondrás de filtrado adblock adicional a privoxy. Luego lo explico.

Instalación

    opkg install privoxy luci-app-privoxy

Configuración:

    Por defecto escucha en el puerto 8118 y el filtrado por defecto ya funciona bien
    Con luci se edita muy bien y si tocas en el nombre del campo que estás tocando, te lleva al manual de esa opción.
    Si estás en un entorno seguro (en tu domicilio), basta con editar en "Acces Control" las opciones "Listen adresses" y "permit access"
    El fichero de configuración es /etc/config/privoxy y dejo el contenido de un fichero de ejemplo:

        # this file support all available configuration options of Privoxy web-proxy
        # the scripts move all options to the final privoxy readable configuration file
        #
        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        # !!! privoxy uses "-" in option names but uci only support "_"         !!!
        # !!! privoxy "listen-address" must be uci "listen_address"             !!!
        # !!!                                                                   !!!
        # !!! if you add entries please use                                     !!!
        # !!! option for options with one parameter (option confdir)            !!!
        # !!! list   for options with multiple parameters (list listen_address) !!!
        # !!!                                                                   !!!
        # !!! special handling for debug option                                 !!!
        # !!! privoxy option "debug 1024" must be uci option debug_1024 '1'     !!!
        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        #
        config  privoxy 'privoxy'
                option  confdir         '/etc/privoxy'
                option  logdir          '/var/log'                  # Donde almacenara el fichero de log. Ojo opciones de debug. Con el paso del tiempo el log puede llenar toda la ram/flash
                option  logfile         'privoxy.log'               # Nombre del fichero de log.          Ojo opciones de debud y privacidad. Se puede guardar todo el historial de navegacion.
                list    filterfile      'default.filter'
        #       list    filterfile      'user.filter'
                list    actionsfile     'match-all.action'
                list    actionsfile     'default.action'
        #       list    actionsfile     'user.action'
        #       list    listen_address  '127.0.0.1:8118'
                list    listen_address  '192.168.1.1:8118'          # La ip del router sobre la que escuchara.  Has de colocar cada ip del router de cada rango al que quieras aceptar que funcione.
        #       list    listen_address  '192.168.2.1:8118'          #  :8118 para todos (ojo, tmb wan y todos los interfaces/segmentos que tengas, aunque con la opción permit_access o con firewall se puede capar)
                option  toggle          '1'
                option  enable_remote_toggle    '1'                 # Si permitira activar/desactivar a traves de la url especifica para esto (http://config.privoxy.org/toggle)
                option  enable_remote_http_toggle       '0'         # Si permitira activar/desactivar a traves de la url especifica para esto (http://config.privoxy.org/toggle?set=enable y http://config.privoxy.org/toggle?set=disable)
                option  enable_edit_actions     '1'                 # Si permitirá editar la configuración con su url especifica (http://config.privoxy.org/show-status)
                option  enforce_blocks          '0'                 # Deshabilitar la opción que permite acceder a una web aunque haya sido filtrada
                option  buffer_limit            '4096'
                option  forwarded_connect_retries       '0'
                option  accept_intercepted_requests     '1'         # Debes colocarlo a 1 si quieres permitir el forzado como proxy transparente
                option  allow_cgi_request_crunching     '0'
                option  split_large_forms       '0'
                option  keep_alive_timeout      '300'
                option  socket_timeout          '300'
                list    permit_access           '192.168.1.0/24'    # Has de colocar a que rangos se les permitirá navegar
                list    permit_access           '10.8.0.0/29'       # Agrego por ejemplo un rango de la VPN a la que le permito hacer forward y acceder a la red local.
                option  debug_1         '0'                         # Log the destination for each request Privoxy let through. See also debug 1024
                option  debug_512       '1'                         # Common Log. Activandolo se registran las peticiones y se podria auditar los sitios por lo que navegas en el log.
                                                                    #              Para ver donde envía la telemetria google por ejemplo.   Ojo con el espacio  (por defecto en RAM).
                option  debug_1024      '0'                         # Log the destination for requests Privoxy didn't let through, and the reason why
                option  debug_4096      '1'                         # Startup banner and warnings
                option  debug_8192      '1'                         # Log non-fatal errors


    Configurar navegadores de los clientes:

            Firefox:      En el medú de Firefox: Preferencias - >General -> Configuración de red    # En versiones antiguas: Preferencias -> Avanzados -> Red -> Configuración
            Chromium:     Ejecutar:              chromium-browser --proxy-server="192.168.1.1:8118"

            Antiguamente configurando proxys corporativos había webs, especialmente internas en las que se añadía como exlusiones en la configuración del naevegador. En mi caso no he tenido incidencias con privoxy.

Administración remota de Privoxy

Privoxy tiene ciertas urls que funcionan internamente para manejar su administración:
Te redireccionan a la administración del proxy si sales a traves de el (Url acortada)
Te redireccionan a la administración del proxy si sales a traves de el
Te lleva a la página en la que puedes deshabilitar el proxy y naveges haciendo baypas (saltándotelo)
Enlace directo en el que habilita el filtrado
Enlace directo en el que deshabilita el filtrado
Introduces una web y te muestra las acciones que hace en el filtrado
Ver y editar opciones del filtrado
Ver las cabeceras que solicita tu navegador y lo compara con lo que realmente enviaría al destino privoxy

Tests y revisión de logs:

    logread | grep privoxy      # Ver que arranca correctamente
    cat /var/log/privoxy.log    # Log por defecto con las acciones realizadas. Está en flash y al reiniciar se pierde. En luci se ve bien; ve a Services -> Privoxy WEB proxy -> Log File Viewer
                                #  Puedes elegir selectivamente que se guarda en el log. Ojo, podria quedar aquí todo tu historial de navegación.
                                #   debug_1, 1024, 4096 and 8192 son utiles para localizar errores. El resto pueden ser muy especificos y generar un infierno de log, especialmente el 16
                                #    Si escojes nivel de log como el debug_512, puedes controlar que no se descontrole lo que ocupe con una tarea de cron como esta:
                                #       find /var/log/privoxy.log -size +20480k -exec rm {} \;  # Borra el fichero de log de privoxy si excede de 20MB

Hacks, notas y resolución de posibles incidencias:

Privoxy está orientado a uso en entornos de confianza y por defecto, todo aquel al que se le permite navegar a través de el, puede editar su configuración.
Si estás en un entorno no seguro, estaría bien limitar ciertas funciones como enable_remote_toggle, enable_edit_actions, enable_remote_http_toggle y enforce_blocks

Privoxy utiliza los DNS del sistema, por lo que si tienes adblock y quieres hacer que el sistema y privoxy también salgan por el como hacen los clientes de nuestra red, colocaremos la ip local como primera en los siguientes ficheros pero si la colocas como única mejor. Si la colocas como única y se te cae dnsmasq, privoxy y el router se quedarán sin resolución de nombres. Lo bueno de esto es que tienes doble filtrado, el de privoxy y el que tengas por adblock/dns. Cuando lo hayas editado, reinicia network con /etc/init.d/network restart

    /etc/config/network     # Edita los los interfaces que te den salida a internet, por lo general solo uno (wan). Dejo mi ejemplo:

        config interface 'wan'
                option _orig_ifname 'eth1'
                option _orig_bridge 'false'
                option proto 'dhcp'
                option delegate '0'
                option peerdns '0'
                option dns '127.0.0.1'
                #option dns '127.0.0.1 208.67.222.222 9.9.9.9 1.1.1.1 176.103.130.130 8.26.56.26 77.88.8.88'
                option ifname 'eth1.832'


    /etc/resolv.conf        # Este fichero no hará falta tocarlo, se genera a partir del que has retocado antes (/etc/config/network), por loq ue al reiniciar el servicio network ya te quedará tal que así:
        # Interface wan
        nameserver 127.0.0.1

Si tienes el INPUT de la zona firewall en la que vas a navegar como REJECT o DROP, necesitarás añadir una regla firewall en "Traffic Rules" para permitir que se conecten al puerto 8118. En mi caso solo lo uso en la red local de confianza, por lo que no me ha sido necesario.

Forzado/Proxy transparente:

        iptables -w 9 -t nat -I zone_lan_prerouting ! -s 192.168.1.1 ! -i eth1.832 -p tcp --dport 80 -j REDIRECT --to-ports 8118 -m comment --comment "Forzado HTTP Privoxy"

Lo más limpio es crear una regla en la tabla prerouting de cada zona que quieras forzar. (Ten presente las opciones listen_address y permit_access).
Para las reglas de port forward de la zona lan es zone_lan_prerouting, como en el ejemplo. En una zona que se llamase Invitados sería zone_Invitados_prerouting
Si utilizases las tablas PREROUTING o prerouting_rule se aplicarian a todas las zonas pero sería conflictivo. (Ojo tmb a opciones listen_address y permit_access).

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/proxy/overview
https://openwrt.org/docs/guide-user/services/proxy/privoxy
Privoxy en OpenWRT (Buen recurso)
Privoxy en OpenWRT con dnasguardian
Web oficial
Manual de la version actual en OpenWRT 18.06.4 (2019/07/21)
Manual de la última versión
FAQs

Tinyproxy (Nunca llegué a probarlo por el buen resultado de Privoxy).

Dejo unos enlaces que tenía anotados de hace muchos años los dos primeros enlaces actualizados de la web de OpenWRT:

    # https://openwrt.org/docs/guide-user/services/proxy/overview
    # https://openwrt.org/docs/guide-user/services/proxy/tinyproxy
    # https://wiki.openwrt.org/doc/howto/proxy.tinyproxy
    # https://tinyproxy.github.io/
    # https://alien.slackbook.org/dokuwiki/doku.php?id=slackware:proxy                                         # Tinyproxy con filtrado dns de dansguardian
    # https://jakehe.blogspot.com.es/2014/10/openwrt-site-filtering-with-tinyproxy.html                        # Tinyproxy con filtrado dns de dansguardian
    # https://broddlit.wordpress.com/2007/09/05/transparent-proxy-as-adblock-using-tinyproxy-and-dansguardian/ # Tinyproxy con filtrado dns de dansguardian (con regla iptables bien explicada)

DNS Server con dnsmasq

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/base-system/dhcp
https://openwrt.org/docs/guide-user/base-system/dhcp.dnsmasq
https://openwrt.org/es/doc/howto/dhcp.dnsmasq

Test de resultados a dnsmasq

Guarda este script por ejemplo en /etc/config/scripts como testdns.sh y dale permisos de ejecución con chmod +x /etc/config/scripts/testdns.sh

    if [ "$1" != "" ];then DomainTesting=$1; else DomainTesting=google.com; fi

    echo;echo
    echo " -- Ten presente que si usas stubby, a ojos de dnsmasq es un unico servidor pero puede estar usando varios y darte respuestas diferentes segun el que use en ese momento --"
    echo;echo

    echo
    echo "-------------------- Test dns server with nslookup --------------------"
    echo
    echo "Test al dns que usa el sistema router (/etc/resolv.conf generado por el interfaz wan con 'option dns' en /etc/config/network)"
    nslookup $DomainTesting | grep -e "name" -e "Address" | sed 's/Address: /\nServer:    /' | sed 's/Address / Address /'
    echo
    echo "Test servicio dnsmasq  (Servidor DNS que sirve a los clientes de la red)"
    nslookup $DomainTesting 127.0.0.1#53 | grep -e "name" -e "Address" | sed 's/Address:    /\nServer:    /' | sed 's/Address / Address /'
    echo
    echo "Test a lista de servidores que usa y consultara dnsmasq"
    grep "list server '[0-9]" /etc/config/dhcp | grep -v "#list server"  | cut -d "'" -f 2 | xargs -n 1 nslookup $DomainTesting | grep -e "name" -e "Address" | sed 's/Address:     /\nServer:    /' | sed 's/Address / Address /'
    echo;echo

También puedes descargarlo con mkdir -p /etc/config/scripts; wget -P /etc/config/scripts/ https://micorreo.email/testdns.sh; chmod +x /etc/config/scripts/testdns.sh

Al ejecutarlo con /etc/config/scripts/testdns.sh te lanzará test al dns que usa el sistema, al que sirve a los clientes de la red y a los diferentes servidores que tengas configurado en dnsmasq, para así poder comparar resultados o ver si alguno no responde.
Puedes pasarle como argumento una entrada diferente a testear, que por defecto es google.com, como por ejemplo: /etc/config/scripts/testdns.sh disroot.org.


Opciones de dnsmasq para cuando tienes más de un servidor dns externo configurado

En fichero /etc/config/dhcp:

    option strictorder '1' # Fuerza a seguir el orden de arriba abajo al usar los dns
    option allservers  '1' # Lanzas cada consulta a todos los servidores a la vez y devuelves el resultado que recibes primero

Por defecto:
Si no activas strictorder o allservers, OpenWRT marcará dnsmasq con strictorder '0' y allservers '0'.
Esto es que, dnsmasq utilizará el servidor que más le convenga cada vez, pudiendo llegar a elegir un servidor distinto a cada consulta que hagas.
De esta manera reparte la carga pero pierdes control en cuanto a preferencias de servidores. Si un servidor está caído, cumplirá timeout y pasará al siguiente, pero puede volver a utilizarlo más tarde y te puede acabar generando respuestas lentas si tienes servidores no confiables, aunque estén al final de la lista.

Ventajas de strictorder '1':
- Control: Te aseguras un orden preferente en las consultas.
- Privacidad: No envías las consultas a todos los dns a la vez y puedes dejar los servidores menos privados al final de la cola.

Inconvenientes de strictorder '1':
- Celeridad: Si se te cae el primero, las consultas han de cumplir el timeout para llegar al segundo, por lo que has de garantizar servidores estables al principio si no quieres respuestas muy lentas.

Ventajas de allservers '1':
- Velocidad: Consultas a todos los servidores a la vez y tomas la primera respuesta que recibes (el que te ha respondido más rápido entre todos)

Inconvenientes de allservers '1':
- Privacidad: Estas enviando todas tus consultas a todos los servidores, solo que intercepten el menos fiable que tengas ya tienen todas tus consultas.

Detalles:
- No tiene sentido tener las strictorder y allservers habilitados al mismo tiempo y no se como se comportaría dnsmasq.
- Si tienes DNS over TLS con stubby, en stubby puedes tener a su vez diferentes servidores, que a ojos de dnsmasq se verá como uno solo.
- Lo ideal sería que si tienes varios servidores dns y no tienes activado allservers '1', cada instancia tenga un time-out bajo para que, en caso de fallo, pueda haber un salto rápido al siguiente.
Para las instancias DNSCRypt v1 se hace creando el fichero /etc/resolv-crypt.conf conteniendo solo el texto "options timeout:1" (sin las comillas).


DNSSEC. Valida y comprueba la autenticidad de las respuestas DNS

Proporciona una firma sobre las respuestas DNS que permiten garantizar al cliente la autenticidad del resultado del servidor para poder detectar y descartar respuestas falsificadas
Para que DNSSEC funcione deben soportarlo tanto tu cliente y servidor DNS que consultes como el servidor del dominio al que realizas la petición.
A 2019 el soporte de DNSSEC en servidores públicos va creciendo considerablemente pero la adopción por parte de los dominios es muy lenta. Si quieres hacer pruebas, mi dominio si está configurado con DNSSEC.

Para que dnsmasq soporte DNSSEC se debe instalar la versión completa y desinstalar la actual. La versión completa también soporta cacheo de DNS, pero quizá no te interese activarlo.

    cd /tmp/; opkg install dnsmasq-full --download-only && opkg remove dnsmasq && opkg install dnsmasq-full --cache . && rm *.ipk  # Si lo quieres con la cache habilitada
    cd /tmp/; opkg install dnsmasq-full --download-only && opkg remove dnsmasq && opkg install dnsmasq-full && rm *.ipk            # Si lo quieres sin la cache habilitada (no se si funciona)

Configuración:

    Se puede configurar de dos maneras. Haciendo que sea dnsmasq quien valide las respuestas o traspasando el resultado para que decida el cliente (por ampliar).


    Edita la sección dnsmasq del fichero /etc/config/dhcp y cambia o agrega lo siguiente:

        option dnssec '1'
        option dnsseccheckunsigned '1'
        option cachesize '150'          # Por defecto 150. Algunos suben a 1000 entradas. Yo pero prefiero sin cache a '0' pero si tienes DNSSEC habilitado, no deja reducirla.
        option nonegcache '1'           # Por defecto 0. Deshabilita el cacheo de respuestas a registros inexistentes (negativas) del tipo “no such domain”.

    /etc/init.d/dnsmasq restart         # Reinicia dnsmasq

Tests y revisión de logs:

    logread | grep -i "dnssec" | grep -v pool.ntp.org

DNSSEC test
https://dnsleaktest.com/
Testea DNSSEC, ESNI, TLSv1.3 y si tu DNS es el de Cloudflare con DoT
Test online para ver si un dominio soporta respuestas con DNSSEC

Fuentes y más información/ayuda
https://web.archive.org/web/20190409161439/https://candrews.integralblue.com/2018/08/dnssec-on-openwrt-18-06/
https://openwrt.org/docs/guide-user/base-system/dhcp
https://web.archive.org/web/20190409161425/https://candrews.integralblue.com/2018/08/dns-over-tls-on-openwrt-18-06/
https://github.com/openwrt/packages/blob/master/net/stubby/files/README.md

DNS cifrado. DNSCrypt, DNSCrypt2, DNS over TLS y DNS over HTTPS. ¿Cual elegir? ¿Que es y a que afecta el SNI?

Los tres cifran de manera correcta las consultas. Particularmente me gusta DNSCrypt por los años que llevo con el, ser el proyecto más maduro, dar las respuestas más rápidas y encontrar servidores enfocados en la privacidad y seguridad.

DNSCrypt v1 está descontinuado pero lo sigo usando en OpenWRT 18. No lo usaría en la versión 19 de OpenWRT, ahí ya aconsejaría ir directamente a DNSCrypt v2.

DNSCrypt v2 no está en los repositorios de OpenWRT 18 y no lo implementaría en dicha versión. Si lo implementaría a partir de versiones de OpenWRT 19 o superiores.

DNS over TLS es muy reciente pero está siendo adoptado muy rápidamente por muchos operadores.

DNSCrypt y DNS over TLS utilizan su propio puerto, por lo que de cara a diagnostico y monitorización podrían ser los ideales, por ejemplo para entornos corporativos

DNS over HTTPS usa el mismo puerto https, por lo que quizá esto te interese. En OpenWRT no plantea otras mejoras e incluso es el más complicado a la hora de encontrar proveedores que puedan ser añadidos a la implementación disponible (https_dns_proxy), por lo que no lo recomiendo como tal.

DNS over HTTPS si es interesante configurarlo en el navegador, ya que es la única manera actual de que a la hora de navegar por redes no cifradas como VPN o TOR, el SNI no pueda ser espiado por los intermediarios de la conexión.

Los tres dan privacidad en las consultas pero para una privacidad completa en la navegación, deberías usar DNS over HTTPs en el navegador, es el único protocolo que habilitándolo en el navegador, cifra las cabeceras SNI que manda el navegador a la web solicitada y ademeás usa el mismo puerto HTTPS(443).

El SNI es una cabecera que envían los navegadores modernos a la hora de solicitar una web. Esta cabecera da más información que el dns, ya que es la url entera y lo grave es que, aunque estés navegando por https, va sin cifrar. Los intermediarios podrán ver todas tus peticiones y ya está siendo utilizado para espiar e incluso censurar la nevegación sobre ciertas webs.

Hay en marcha una actualización llamada "Encrypted SNI" (ESNI) para TLSv1.3, pero esta revisión de TLS todavía no está lo suficientemente extendida.

DNSSEC no es un protocolo de cifrado, lo que hace es firmar digitalmente cada entrada para que puedas comparar que la respuesta no ha sido alterada. A nivel de seguridad es muy interesante pero dependes de que el dominio que consultas también lo tenga activado.

Un esquema interesante es configurar Privoxy y añadirlo como proxy en tu navegador. Marca al sistema para que solo use los DNS de DNSMasq. Luego activa el cifrado sni junto a DNS over HTTPS en el navegador. En el Router dejaría los servicios de DNS cifrados habituales como DNSCRypt, DNS over TLS o ambos junto a adblock y por supuesto habilitando DNSSEC.

Fuentes y más información/ayuda
https://en.wikipedia.org/wiki/Server_Name_Indication
https://tools.ietf.org/html/draft-ietf-tls-esni-04
https://www.eff.org/deeplinks/2018/09/esni-privacy-protecting-upgrade-https
https://www.theregister.co.uk/2018/07/17/encrypted_server_names/
https://blog.cloudflare.com/encrypted-sni/
https://www.grepular.com/DNSCrypt_Reduces_Privacy

DNSCrypt-proxy v1 (Consultas DNS cifradas contra el proveedor/servidor DNS)

El protcolo DNS es un protocolo que va sin cifrar, por lo que cualquiera parte implicada en el camino de la petición podria no solo ver, sino modificar tu consulta y redirigirte hacia un sitio malicioso
De esta manera se establecen algunos de los bloqueos a webs pero también con otros fines usados de manera ilegal, como colocar malware del estilo finfinisher

DNSCrypt-proxy levanta un servidor DNS en tu router que a su vez lanza las consultas DNS a otros proveedores de DNS mediante una comunicación cifrada.

DNSSEC es un añadido a DNS que ayuda a garantizar la autenticidad de las respuestas, pero a 2019 todavía son pocos los servidores DNS y dominios que lo soporten. DNSSCrypt soporta DNSSEC

Actualmente existe la versión 2 de DNSCRypt, pero todavía no está integrado en OpenWRT y pese a que la cantidad de servidores disponible de la v1 ha menguado considerablememnte, todavía se puede usar.

DNSCrypt-proxy 2 no puede convivir con DNSCrypt-proxy v1. Si tienes la v2 este está obsoleto y cuando actualices a la v2, tendrás que desinstalr ésta antes (la v1).

Has de saber que DNSCRypt no es 100% infalible, los navegadores web envian la cabecera sni sin cifrar, aunque la comunicación sea por https y precisamente sni es la url que solicita el navegador, por lo que tu proveedor podria seguir espiandote y censurar selectivamente. Para tener una comunicación con el navegador web 100% cifrada se debe usar DNS over HTTPS

Instalación:

    opkg install libldns libsodium dnscrypt-proxy luci-app-dnscrypt-proxy dnscrypt-proxy-resolvers hostip  # hostip es una tool sencilla para hacer consultas DNS

Configuración:

    En el fichero */etc/config/dnscrypt-proxy* configurarás tantas instancias como quieras de proxy dnscrypt. Luego en el fichero dhcp(dnsmasq) los pondrás como tus servidores dns de consulta


        config dnscrypt-proxy 'ns1'         # Instancia de dnscrypt (Por defecto en OpenWRT 15 solo permite una instancia. En versiones posteriores, las que quieras)
            option address '127.0.0.1'      # A que ip escuchará y aceptará peticiones. 127.0.0.1 para local, ya que será dnsmasq el que internamente le lanzará las consultas
            option port '533'               # El puerto al que escucharemos. (algunos vienen por defecto con 5353 y puede dar conflicto con mDNS ZeroConf Daemon (avahi))
            option resolver 'adguard-dns-ns1' # El servidor que utilizaremos y pediremos consultas del listado csv indicado (uno por instancia)
            option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
            option ephemeral_keys '1'       # Mas anonimo, firmando cada peticion. Consume algo más de cpu pero un Linksys WRT1900ACS ni se entera
            option syslog '1'               # Enviar logs al syslog (Default=1). (DNSCrypt tiene otra opcion que logea consultas, pero ensuciaría mucho el log y se guardaría todo lo que consultas)
            option block_ipv6 '1'           # Las versiones de OpenWRT realmente no lo soportan. Lo dejo por si lo permitiesen en un futuro y reduciría tiempo de respuesta.
            # list blacklist 'fichero'      # La versión de OpenWRT no está compilada para soportarlo, pero DNSCrypt permite cargar listas de filtrado en el propio servicio.

        config dnscrypt-proxy 'ns2'         # Segunda instancia  # Cada instancia son unos 1,5MB de RAM
            option address '127.0.0.1'
            option port '534'               # Puerto donde levantará la segunda instancia
            option resolver 'dnscrypt.eu-dk'
            option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
            option ephemeral_keys '1'
            option block_ipv6 '1'

        config dnscrypt-proxy 'ns3'
            option address '127.0.0.1'
            option port '535'
            option resolver 'dnscrypt.org-fr'
            option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
            option ephemeral_keys '1'
            option block_ipv6 '1'

No todos los servidores que te configures tienen las mismas caracteristicas y muchos ya no están operativos para la v1. Facilito los detalles de los que uso o he usado.
Habían urls donde consultar esto fácilmente pero ya no están operativas. Puedes consultar directamente el fichero /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv

        'adguard-dns-ns1'           # Remove ads and protect your computer from malware (Filtra malware, ads y valida DNSSEC)
        'adguard-dns-ns2'           # Remove ads and protect your computer from malware (Filtra malware, ads y valida DNSSEC)

        'adguard-dns-family-ns1'    # Adguard DNS with safesearch and adult content blocking ( =adguard-dns-ns1 + filtro parental)
        'adguard-dns-family-ns2'    # Adguard DNS with safesearch and adult content blocking ( =adguard-dns-ns2 + filtro parental)

        'bn-fr0'                    # Non-logging, uncensored DNS resolver provided by Babylon Network
        'bn-fr1'                    # Non-logging, uncensored DNS resolver provided by Babylon Network
        'bn-nl0'                    # Non-logging, uncensored DNS resolver provided by Babylon Network

        'ns0.dnscrypt.is'           # DNSSEC enabled, non-logging, uncensored. Sponsored by 1984 Hosting
        'dnscrypt.eu-dk'            # Free, non-logged, uncensored. Hosted by Netgroup. (valida DNSSEC)
        'dnscrypt.org-fr'           # DNSSEC/Non-logged/Uncensored - ARM server donated by Scaleway.com

        # Los siguientes tengo probados que no funcionan a 2019/07/20 o los he dejado de utilizar por inconsistencia en las respuestas o no validar DNSSEC

        'cisco'                     # Son los de OpenDNS. Filtran malware pero no valida DNSSEC. Deje de utilizarlo cando habilite DNSSEC
        'cisco-familyshield'        # Son los de OpenDNS. = a 'cisco' pero con filtro parental añadido.
        'dnscrypt.ca-1'             # Uncensored DNSSEC validating and log-free
        'dnscrypt.ca-2'             # Uncensored DNSSEC validating and log-free
        'dnscrypt.eu-nl'            # Free, non-logged, uncensored. Hosted by Netgroup. (Valida DNSSEC)
        'dnscrypt.nl-ns0'
        'securedns'
        'yandex'                    # Yandex public DNS server (Chino)

Activar y empezar a usarlo:

    /etc/init.d/dnscrypt-proxy enable               # Para que autoarranque (En la v18 de OpenWRT creo que ya lo hace automático al instalarlo)
    /etc/init.d/dnscrypt-proxy start                # Arrancar              (En la v18 de OpenWRT creo que ya lo hace automático al instalarlo)

    Decir a dnsmasq que vaya a consultar dnscrypt-proxy editando /etc/config/dhcp (por defecto Openwrt usa dnsmasq)

        # option logqueries '1'                     # No lo habilito. Es para registrar las consultas en syslog (ojo si hay muchas te ensuciará el log y recuerda fail2ban_openwrt)
        # option resolvfile '/tmp/resolv.conf.auto' # Para DNSCRYPT debe estar comentado/disabled ya que /tmp/resolv.conf.auto hace que dnsmasq consulte a los DNS que te da por DHCP tu operador/ISP
        option noresolv '1'                         # Para DNSCRYPT debe estar habilitarse para que deshabilite /etc/resolv.conf por lo mismo que lo comentado arriba.
        list server '/pool.ntp.org/208.67.222.222'  # Las consultas DNSCryot son algo más lentas por lo que ntp puede verse afectado y dnscrypt es sensible a ello. Lo pongo primero por si usas 'strict order'
        list server '/pool.ntp.org/1.1.1.1'         # Las consultas DNSCryot son algo más lentas por lo que ntp puede verse afectado y dnscrypt es sensible a ello. Lo pongo primero por si usas 'strict order'
        list server '/openwrt.pool.ntp.org/208.67.222.222'
        list server '/openwrt.pool.ntp.org/9.9.9.9'
        list server '/openwrt.pool.ntp.org/1.1.1.1'
        list server '127.0.0.1#533'                 # Instancia de dnscrypt proxy que hayas configurado y levantado. La deshabilite cuando habilite DNSSEC, ya que OpenDNS no lo soporta
        list server '127.0.0.1#534'                 # Instancia de dnscrypt proxy que hayas configurado y levantado.
        list server '127.0.0.1#535'                 # Instancia de dnscrypt proxy que hayas configurado y levantado.
        # Ojo, si guardas a traves de entorno web (luci) perderas todos los comentarios de los ficheros

    /etc/init.d/dnsmasq restart                     # Reiniciar dnsmasq y ahora ya estará usando dnscrypt-proxy

Tests y revisión de logs:

    logread | grep "Proxying from"          # Ver que dnscrpt proxy ha arrancado correctamente
    logread | grep -n "using nameserver"    # Para ver si dnsmasq ha cargado los dns de dnscrypt-proxy que has configurado en el ficheor dhcp
    netstat -nltpua | grep dnscrypt         # Ver puestos enq ue está escuchando como servidor y conectando como cliente
    dnscrypt-proxy --version                # To support plugins for support blacklist dns, verify "Support for ldns-based plugins: present" and you have installed package libldns

    Con nslookup:

        nslookup google.com 127.0.0.1#533       # Test local a la primera instancia de dnscrypt
        nslookup google.com 127.0.0.1#534       # Test local a la segunda instancia de dnscrypt
        nslookup google.com 192.168.12.1#53     # Test de lo que servirá tu router a los clientes cuando le hagan consultas DNS (dnsmasq)
        nslookup google.com                     # Test de lo que consultara OpenWRT cuando haga peticiones por si mismo- Como updates.

    Con hostip:

        hostip google.com -r 127.0.0.1:533      # Test local a la primera instancia de dnscrypt
        hostip google.com -r 127.0.0.1:533      # Test local a la segunda instancia de dnscrypt
        hostip google.com -r 192.168.12.1:53    # Test de lo que servirá tu router a los clientes cuando le hagan consultas DNS (dnsmasq)
        hostip google.com                       # Test de lo que consultara OpenWRT cuando haga peticiones por si mismo- Como updates.

    Tests Online:
        http://dnssec.vs.uni-due.de/                        # Test DNSSEC
        https://www.dnsleaktest.com/                        # Lanza varias consultas DNS y te muestra que servidores DNS has utilizado para ello
        https://www.dns-oarc.net/oarc/services/dnsentropy/  # Comprueba si utiliza id y puertos aleatorios en las consultas, lo cual previene ataques por envenenamiento


    Hacer flush de cache dns en cliente linux:  sudo /etc/init.d/networking restart or sudo /etc/init.d/nscd restart
    hacer flush de cache dns en cliente win:    ipconfig/flushdns
    Probar consultas parando el servicio para ver si responde ok (si he dejado otros dns pueden resolver estos...)

Hacks, notas y resolución de posibles incidencias:

    Si dnscrypt-proxy no inicia al reiniciar el router puede ser por que lo intento antes de que la interface estuviera completamente activa
    Es una buena práctica igualmente añadir por precaución lo siguiente al fichero /etc/rc.local , por encima de la linea "exit 0"

        sleep 10                           # No me hizo falta pero no te olvides del enable de arriba para que autoarranque
        /etc/init.d/dnscrypt-proxy start   # Inicia dnscrypt-proxy despues de los diez segundos de pause, dando tiempo a que lso interfaces esten iniciados


    Crea el fichero /etc/resolv-crypt.conf con solo el texto "options timeout:1" (sin las comillas)
     Esto reduce el timeout de las consultas de dnsmasq a un segundos. Asi las respuestas son más rápidas si el primer servidor estubiera caído.

    La versión de DNSCrypt-proxy en OpenWRT está compilada sin todos sus plugins, pero con ellos tiene opciones muy interesantes.

    Las respuestas en DNSCrypt me tardan unos 0.05 segundos vs tiempos de 0.30s en Stubby con DNS over TLS (Ambos con DNSSEC habilitado)
Fuentes y más información/ayuda
https://github.com/openwrt/packages/blob/openwrt-18.06/net/dnscrypt-proxy/files/dnscrypt-resolvers.csv
https://oldwiki.archive.openwrt.org/inbox/dnscrypt
https://openwrt.org/docs/guide-user/services/dns/dnscrypt-proxy
https://openwrt.org/docs/guide-user/services/dns/dnscrypt_dnsmasq_dnscrypt-proxy
https://github.com/openwrt/luci/tree/master/applications/luci-app-dnscrypt-proxy/po/es
https://forum.lede-project.org/t/solved-cant-get-luci-dnscrypt-overview-page-to-work/6407
https://securityhacklabs.blogspot.com/2017/09/oculta-tu-trafico-incluso-tu-isp.html
https://dnscrypt.org/
https://geekland.eu/comprobar-el-funcionamiento-de-dnscrypt/
https://wuffleton.com/hacks/dnscrypt-openwrt/
https://forum.lede-project.org/t/dnscrypt-proxy-compiled-with-plugins-support/5675
https://github.com/kdave/dnscrypt-plugins/blob/master/README.md
https://forum.lede-project.org/t/dnscrypt-proxy-1-9-4-3-vs-1-9-5-1/3788

DNSCrypt-proxy v2 (Consultas DNS cifradas contra el proveedor/servidor DNS)

DNSCrypt-proxy 2, además de la versión dos del protocolo dnscrypt, también soporta DNS over HTTPS
DNSCrypt-proxy 2 no puede convivir con DNSCrypt-proxy v1, tendrás que desinstalarlo para poder instalar la versión 2.


Pendiente Estoy esperando a la versión 19 de OpenWRT para ver si facilitan su implementación. Por ahora estoy con DNSCrypt v1 y DNS over TLS


Fuentes y más información/ayuda
https://github.com/jedisct1/dnscrypt-proxy/wiki/Installation-on-OpenWRT
https://github.com/jedisct1/dnscrypt-proxy/wiki
https://github.com/jedisct1/dnscrypt-proxy
https://github.com/jedisct1/dnscrypt-proxy/releases
https://dnscrypt.info/public-servers/
https://download.dnscrypt.info/dnscrypt-resolvers/v2/
https://dc502wrt.org/dnscrypt/
https://dnscrypt.info/implementations
https://dnscrypt.info/

DNS over TLS. Consultas DNS cifradas contra el proveedor DNS utilizando stubby y dnsmasq

Instalaremos Stubby, el cual, al igual que con dnscrypt-proxy, levanta un servidor DNS local que a su vez nos hará de intermediario siendo cliente de los servidores DNS sobre TLS que le configuremos. Stubby soporta DNSSEC de dos maneras en conjunción con dnsmasq. En las dos dnsmasq requiere que instales la versión completa.

Instalación:

    opkg install stubby ca-certificates

Configuración /etc/config/stubby

    Por defecto ya viene configurado con las consultas hacia cloudflare. En mi caso comento los resolvers sobre ipv6 y añado los de cleanbrowsing y quad de ibm.
    Si quieres añadir más, tan solo debes clonar una instancia y cambiar la ip y nombre acorde al servidor.


        config stubby 'global'
               option manual '0'
               option trigger 'wan'
               # option triggerdelay '2'
               list dns_transport 'GETDNS_TRANSPORT_TLS'
               option tls_authentication '1'
               option tls_query_padding_blocksize '128'
               # option tls_connection_retries '2'
               # option tls_backoff_time '3600'
               option timeout '2000'
               option dnssec_return_status '1'
               option appdata_dir '/var/lib/stubby'
               # option trust_anchors_backoff_time 2500
               # option dnssec_trust_anchors '/var/lib/stubby/getdns-root.key'
               option edns_client_subnet_private '1'
               option idle_timeout '10000'
               option round_robin_upstreams '1'
               list listen_address '127.0.0.1@5453'
               # list listen_address '0::1@5453'
               option log_level '3'
               # option command_line_arguments ''
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'
               # option tls_max_version '1.3'

        # Upstream resolvers are specified using 'resolver' sections.

        config resolver
               option address '9.9.9.9'
               option tls_auth_name 'dns.quad9.net'
               option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '149.112.112.112'
               option tls_auth_name 'dns.quad9.net'
               option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '185.228.168.9'
               option tls_auth_name 'security-filter-dns.cleanbrowsing.org'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '185.228.169.9'
               option tls_auth_name 'security-filter-dns.cleanbrowsing.org'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '1.1.1.1'
               option tls_auth_name 'cloudflare-dns.com'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '1.0.0.1'
               option tls_auth_name 'cloudflare-dns.com'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '176.103.130.130'
               option tls_auth_name 'dns.adguard.com'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        config resolver
               option address '176.103.130.131'
               option tls_auth_name 'dns.adguard.com'
               # option tls_port '853'
               # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
               # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
               # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
               option tls_min_version '1.2'

        #config resolver
        #       option address '2606:4700:4700::1111'
        #       option tls_auth_name 'cloudflare-dns.com'
        #       # option tls_port '853'
        #       # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
        #       # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
        #       # option tls_ciphersuites 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
        #       # option tls_min_version '1.2'

        #config resolver
        #       option address '2606:4700:4700::1001'
        #       option tls_auth_name 'cloudflare-dns.com'
        #       # option tls_port 853
        #       # list spki 'sha256/yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc='
        #       # option tls_cipher_list 'EECDH+AESGCM:EECDH+CHACHA20'
        #       # option tls_ciphersuites 'TLS_AES_2

Activar y empezar a usarlo:

    Decir a dnsmasq que vaya a consultar DoT con Stubby editando /etc/config/dhcp

        # option logqueries '1'                     # No lo habilito. Es para registrar las consultas en syslog (ojo si hay muchas te ensuciará el log y recuerda fail2ban_openwrt)
        # option resolvfile '/tmp/resolv.conf.auto' # Debe estar comentado/disabled ya que /tmp/resolv.conf.auto hace que dnsmasq consulte a lso DNS que te da por DHCP tu operador/ISP
        option noresolv '1'                         # Debe habilitarse para que deshabilite /etc/resolv.conf por lo mismo que lo comentado arriba.
        list server '/pool.ntp.org/208.67.222.222'  # Las consultas por TLS son algo más lentas por lo que ntp puede verse afectado y las consultas DoT son sensibles a ello. Lo pongo arriba por si usas 'strict order'
        list server '/pool.ntp.org/1.1.1.1'         # Las consultas por TLS son algo más lentas por lo que ntp puede verse afectado y las consultas DoT son sensibles a ello. Lo pongo arriba por si usas 'strict order'
        list server '/openwrt.pool.ntp.org/208.67.222.222'
        list server '/openwrt.pool.ntp.org/9.9.9.9'
        list server '/openwrt.pool.ntp.org/1.1.1.1'
        list server '127.0.0.1#5453'                # Instancia de Stubby levantada (puede convivir con otros servidores como por ejemplo dnscrypt-proxy)
        list server '127.0.0.1#533'                 # Supuesta instancia de dnscrypt proxy que hayas configurado y levantado conviviendo con Stubby/DoT

    /etc/init.d/dnsmasq restart                     # Reiniciar dnsmasq y ahora dnsmasq ya utilizará a stubby como un servidor de consultas DNS

Tests y revisión de logs:

    hostip google.com -r 127.0.0.1:5453             # Test local a la instancia de stubby, el cual preguntara a sus resolvers configurados

    https://dnssec.vs.uni-due.de/
    https://dnsleaktest.com/

    netstat -nltpua | grep stubby                       # Ver puestos en que está escuchando como servidor y conectando como cliente
    logread | grep stubby                               # Ver que stubby ha arrancado correctamente
    logread | grep -n "using nameserver" | grep "#5453" # Para ver si dnsmasq ha cargado Stubby como cliente DNS configurado en el fichero dhcp
    stubby -V                                           # Version de Stubby
    stubby -i                                           # Ver la configuracion de /etc/stubby/stubby.yml (OpenWRT usa /etc/config/stubby por defecto, el cual genera /var/etc/stubby/stubby.yml)

Hacks, notas y resolución de posibles incidencias:

DNSSEC: Ve a la sección DNNSEC
Stubby en OpenWRT usa /etc/config/stubby pero nativamente utiliza /etc/stubby/stubby.yml, el cual existe y genera /var/etc/stubby/stubby.yml. Si quieres usar etc/stubby/stubby.yml, en vez del de OpenWRT, has de activar manual mode.

Fuentes y más información/ayuda
Wiki OpenWRT. DNS over TLS via Dnsmasq and Stubby
Wiki OpenWRT. Stubby
Github de Stubby for OpenWRT
Github de Stubby
Listado de servidores DNS con sus caracteríticas (Wikipedia)
DNS_over_TLS en Wikipedia
Servidores DNS de IBM Quad9 (Wikipedia)
Servidores DNS de IBM Quad9 (web oficial)
Servidores DNS de Cleanbrowsing (Wikipedia)
Servidores DNS de Cleanbrowsing (web oficial)
Servidores DNS de Cloudflare (web oficial)
Servidores DNS de Adguard (web oficial)
Servidores DNS de AdGuard (Github)
Archivo de una web caída con un tute de DNS over TLS para OpenWRT
https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby

DNS over HTTPS

Has de saber que las ventajas que aporta DNS over HTTPS no se aprovechan con OpenWRT. Lo interesante de DNS over HTTPS es configurarlo directamente en el navegador, de cara a que cifre el envío de cabeceras sni al solicitar peticiones web. Los navegadores modernos envían la petición de la web con la cabecera SNI y aunque pienses que https cifra esto, en ralidad no lo hacen actualmente y se envía en texto plano, cualquier intermediario podría analizar y ver incluso con mayor detalle que a nivel de dns plano, ya que en el sni viene todo el path y url entera.
Un esquema intermediario es configurarte Privoxy en el navegador y activar el cifrado sni junto a DNS over HTTPS en el navegador. En el Router dejaría los servicios de DNS cifrados habituales, DNSCRypt o DNS over TLS junto a adblock
Si pese a ello quieres experimentar, en OpenWRT se configura de manera similar a DNSCrypt-proxy v1. Instalarás un servicio de proxy DNS intermediario que escuchará las peticiones a nivel local y las retransmitirá en este caso por HTTPS, escuchando por un puerto a cada instancia y servidor que hayas añadido de DNS over HTTPS.

Instalar:

Por defecto, depende de la versión, te levantara una o dos instancias con google y cloudflare en 127.0.0.1:5053 y 127.0.0.1:5054. Puedes probarlo con: hostip google.com -r 127.0.0.1:5053

Configurar:

Ahora la idea es configurar los DNS que queramos añadir. Debemos saber las url e ips de los servidores pero el problema es que https_dns_proxy envía la petición en json y solo algunos lo soportan, siendo otras de las razones por la que en OpenWRT y al menos usando https:dns_proxy no es algo atractivo. Los que si lo soporten es probable que debas añadir algo a la url para especificar el formato json de nuestra petición. Los tres que si me han funcionado son CloudFlare, Quad(IBM) y google, pero google lo deshabilito. Algunos servidores como blahdns.com te rechazarán la consulta si el SNI no viene cifrado.

Editamos las instancias que queremos con el fichero /etc/config/https-dns-proxy (Antes de la 18.06.6 https_dns_proxy)

    #En versiones 18.06.6 o superiores de OpenWRT
    config https-dns-proxy
            option bootstrap_dns '1.1.1.1,1.0.0.1'
            option resolver_url 'https://cloudflare-dns.com/dns-query'
            option listen_addr '127.0.0.1'
            option listen_port '5053'
            option user 'nobody'
            option group 'nogroup'

    config https-dns-proxy
            option bootstrap_dns '9.9.9.9,149.112.112.9'
            #option url_prefix 'sdns://AgMAAAAAAAAABzkuOS45LjmAABJkbnM5LnF1YWQ5Lm5ldDo0NDMKL2Rucy1xdWVyeQ'
            option resolver_url 'https://dns9.quad9.net:443/dns-query'
            option listen_addr '127.0.0.1'
            option listen_port '5054'
            option user 'nobody'
            option group 'nogroup'
            option subnet_addr ''
            option proxy_server ''

    #config https-dns-proxy
    #        option bootstrap_dns '8.8.8.8,8.8.4.4'
    #        option resolver_url 'https://dns.google/dns-query'
    #        option listen_addr '127.0.0.1'
    #        option listen_port '5055'
    #        option user 'nobody'
    #        option group 'nogroup'


    #En versiones anteriores a la 18.06.6 (El fichero se llamaba https_dns_proxy en vez de https-dns-proxy)
    config https_dns_proxy
            option dns_servers '1.1.1.1'
            option url_prefix 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&'
            option listen_addr '127.0.0.1'
            option listen_port '5053'
            option user 'nobody'
            option group 'nogroup'
            option subnet_addr ''
            option proxy_server ''
            
    config https_dns_proxy
            option dns_servers '9.9.9.9'
            #option url_prefix 'sdns://AgMAAAAAAAAABzkuOS45LjmAABJkbnM5LnF1YWQ5Lm5ldDo0NDMKL2Rucy1xdWVyeQ'
            #option url_prefix 'https://dns9.quad9.net:443/dns-query'
            option listen_addr '127.0.0.1'
            option listen_port '5054'
            option user 'nobody'
            option group 'nogroup'
            option subnet_addr ''
            option proxy_server ''

    #config https_dns_proxy
    #       option dns_servers '8.8.8.8'
    #       option url_prefix 'https://dns.google.com/resolve?'
    #       option listen_addr '127.0.0.1'
    #       option listen_port '5055'
    #       option user 'nobody'
    #       option group 'nogroup'
    #       option subnet_addr ''
    #       option proxy_server ''

Reiniciamos y hacemos pruebas

    /etc/init.d/https_dns_proxy restart
    ps | grep https                                                               # En el proceso poremos ver que que cargue bien nuestra configuración
    hostip linuxmint.com -r 127.0.0.1:5053;hostip linuxmint.com -r 127.0.0.1:5054 # Pruebas de resolución
    

Añadir https_dns_proxy a dnsmasq:

Para que el router consulte estos dns a traves de dnsmasq, se debe especificar las instancias que hayamos configurado en el fichero /etc/config/dhcp. Al igual que con DNSCrypt y DNS over TLS, nos interesa que el router no consulte a los dns del operador, de ahí la opción noresolv '1'

/etc/config/dhcp with:

    list server '/openwrt.pool.ntp.org/9.9.9.9' # Anular el cifrado DNS para el proveedor de NTP para evitar el estado de bloqueo si la hora del sistema no está sincronizada. Tenga cuidado con los problemas de tolerancia a fallos. Ponlo primero por si usases 'strict order'
    list server '/openwrt.pool.ntp.org/1.1.1.1' # Anular el cifrado DNS para el proveedor de NTP para evitar el estado de bloqueo si la hora del sistema no está sincronizada. Tenga cuidado con los problemas de tolerancia a fallos. Ponlo primero por si usases 'strict order'
    list server '/openwrt.pool.ntp.org/208.67.222.222'
    list server '/pool.ntp.org/208.67.222.222'  # Anular el cifrado DNS para el proveedor de NTP para evitar el estado de bloqueo si la hora del sistema no está sincronizada. Tenga cuidado con los problemas de tolerancia a fallos. Ponlo primero por si usases 'strict order'
    list server '/pool.ntp.org/1.1.1.1'         # Anular el cifrado DNS para el proveedor de NTP para evitar el estado de bloqueo si la hora del sistema no está sincronizada. Tenga cuidado con los problemas de tolerancia a fallos. Ponlo primero por si usases

    list server '127.0.0.1#5053'                # Instancia uno de https_dns_proxy (Quad)
    list server '127.0.0.1#5054'                # Instancia dos de https_dns_proxy (Cloudflare)
    #list server '127.0.0.1#5055'               # Instancia tres de https_dns_proxy (Google)

    # option resolvfile '/tmp/resolv.conf.auto' # Debe estar comentado/disabled ya que /tmp/resolv.conf.auto hace que dnsmasq consulte a los DNS que te da por DHCP tu operador/ISP
    option noresolv '1'                         # Debe habilitarse para que deshabilite /etc/resolv.conf por lo mismo que lo comentado arriba.

Nota: https_dns_proxy soporta dnssec pero no que lo tengas habilitado directamente en dnsmasq. Si tienes las siguientes opciones en dnsmasq, tendrás que comentarlas o deshabilitarlas. Esto puede entrar en conflicto en como tengas activado DNSSEC con los servidores que tuvieras antes.

    #option dnssec '1'
    #option dnsseccheckunsigned '1'

Activar el cifrado de la cabecera SNI en Firefox:

Ahora debes activar el cifrado de la cabecera SNI de HTTP en el navegador, que es lo tiene de bueno DNS over HTTPS respecto al resto de servidores DNS cifrados.
Para ello introduce about:config en firefox, si te salta una warning, aceptamos. Busca el texto "network.security.esni.enabled" y hazle doble click para que quede activado en negrita.

Aunque lo actives, el cifrado de la cabecera SNI solo te funcionará realmente si configuras DNS over HTTPs en el navegador. No usandolo en el router. Pero está bien que lo dejes activado y preparado.

DNS over HTTPS directamente en Firefox sin tener que tocar el router:

En Firefox hay una opción para que el propio navegador consulte DNS over HTTPS sin necesidad de que configures el router. Ve a Preferencias, General, Configuración de red (abajo del todo) y marcamos "Activar DNS sobre HTTPS". Esto no excluye que debas activar el cifrado de sni para que se cifre adecuadamente. Puedes elegir el que viene por defecto pero aquí podrás elegir algunos adicionales. Algunos servidores como blahdns.com te rechazarán la consulta si el SNI no viene cifrado, no olvides activarlo.

Testear, log y solución de problemas:

Para testear si el sni del navegador se está enviando cifrado: https://www.cloudflare.com/ssl/encrypted-sni/#
Para ver que DNS estás utilizando: https://dnsleaktest.com/

    hostip google.com -r 127.0.0.1:5053  # Consulta dns a instancia https_dns_proxy
    nslookup google.com 127.0.0.1#5053   # Consulta dns a instancia https_dns_proxy
    logread -e https_dns_proxy           # Revisar en el log
    uci show https_dns_proxy             # Si encuentra errores te dirá en que linea.
    uci show dhcp                        # Si encuentra errores te dirá en que linea.
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/dns/doh_dnsmasq_https-dns-proxy
https://github.com/aarond10/https_dns_proxy
https://www.quad9.net/quad9-resolvers.md

Sitios donde conseguir servidores DNS over HTTPS para configurar en el navegador
https://kb.adguard.com/en/general/dns-providers
https://www.quad9.net/doh-quad9-dns-servers/
https://www.quad9.net/quad9-resolvers.md
https://cleanbrowsing.org/guides/dnsoverhttps
https://ibksturm.synology.me/
https://github.com/ibksturm/dnscrypt-switzerland
https://blahdns.com/
https://github.com/ookangzheng/blahdns

Soporte USB (requerido para añadir soporte a pinchos wifi o de storage/almacenamiento usb)

Instalaras kmod-usb-core, usbutils y el modulo correspondiente a las versiones de los puertos usb que tiene tu router
Si tu router es USB 1.1 tendrás que averiguar si utiliza OHCI o UHCI e instalar solo el modulos de kernel adecuados y no los dos.
Instala usbutils y podrás ver un desglose de lo que dispone tu router con lsusb -t (mira si tiene ohci, uhci, ehci o xhci)
Recuerda que cuando instalas modulos del kernel, debes reiniciar el router completo para que los cargue (paquetes con kmod*)

        Name                Size    Required    Desciption
        usbutils            206985  no          USB devices listing utilities: lsusb, …
        kmod-usb-core       74274   yes         Kernel support for USB.

        kmod-usb-ohci       14935   specific    Kernel support for USB1 OHCI controllers (USB 1.1)
        kmod-usb-uhci       14897   specific    Kernel support for USB1 UHCI controllers (USB 1.1)
        kmod-usb2           24752   specific    Kernel support for USB2 EHCI controllers (USB 2.0)
        kmod-usb3                   specific    Kernel support for USB3 XHCI controllers (USB 3.0)

        kmod-ledtrig-usbdev 3502    no          Kernel module to drive LEDs based on USB device presence/activity. (Si no dispones kmod-usb-ledtrig-usbport)
        kmod-usb-ledtrig-usbport    no          Kernel module to drive LEDs based on USB device presence/activity. (Es preferible éste a kmod-ledtrig-usbdev)

        En Comtrend AR-5387un instalo: kmod-usb-core usbutils kmod-nls-base kmod-usb2 kmod-usb-ohci (No instalar kmod-usb-uhci)
        En Xiaomi Router Mi3G instalo: kmod-usb-core usbutils kmod-nls-base kmod-usb2 kmod-usb3
        En Linksys WRT1900ACS instalo: kmod-usb-core usbutils kmod-nls-base kmod-usb2 kmod-usb3 (tiene un puerto usb3 y otro usb2.0 compartido con el esata)
Fuentes y más información/ayuda
https://wiki.openwrt.org/doc/howto/usb.essentials
https://openwrt.org/docs/guide-user/storage/usb-drives

USB Storage / SAMBA / Montar pendrive

Requiere basicos para USB (Ve a la sección Soporte USB donde lo detallo)
Recuerda que cuando instalas modulos del kernel, debes reiniciar el router completo para que los cargue (paquetes con kmod*)
Prefiero particionar el pendrive/tarjeta en el ordenador para no tener que hacerlo desde el router e instalar más paquetes

        Instala:
        kmod-usb-storage        # Añade soporte USB al kernel para al almacenamiento usb.
        block-mount             # Permite montar directorios.   # Se integra con luci y aparece en sección "Mount Points"
        kmod-usb-storage-uas    # Para USB 3.0
        kmod-fs-ext4            # Debes añadir el sistema de ficheros que utilice el disco/pendrive. Lista los disponibles con opkg list kmod-fs-*

        Chequea con:
            ls -l /dev/sd*
            block info | grep "/dev/sd"

        Crea el directorio donde lo montarás:  mkdir /mnt/sda1

        Monta con luci(Mount Points) o con editando el fichero /etc/config/fstab

            config global
                    option anon_swap '0'
                    option anon_mount '0'
                    option auto_swap '0'
                    option auto_mount '1'
                    option delay_root '5'
                    option check_fs '0'

            config mount
                    option target '/mnt/sda1'
                    # option device '/dev/sda1'                         # Prefiero con el identificador UUID
                    option uuid '867ab5cf-84a2-428c-914d-fadbd54da6e8'
                    option enabled '1'
                    option fstype 'ext4'
                    option options 'noatime'                            # o 'relatime,nodiratime'
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/storage/usb-drives
https://wiki.openwrt.org/doc/recipes/usb-storage-samba-webinterface
https://elblogdelazaro.gitlab.io/post/2018-04-19-openwrt-usb-storage.html
https://openwrt.org/es/doc/howto/usb.storage

USB Wifi / Pinchos Wifi

Requisitos:
   Revisa la sección SoporteUSB, tendrás que habilitar los puertos USB añadiendo soporte para los tipos de puertos que tenga tu equipo. USB 1.1, USB 2.0 o USB 3.0
   Estaría bien saber el tipo de chip que utiliza tu dispositivo wifi USB, ya que una vez tengas habilitado el soporte USB al kernel, debes añadirle también el soporte para tu modelo.

Algunos ejemplos:

Notas:
   El número delante de T y R son las antenas que tiene para transmisión y recepción. La de delante de la S son las que puede usar al mismo tiempo (streams)
   Cada stream de datos en Wifi n a 40MHz son 150Mbits/s. Con dos sería un enlace máximo teórico de 300Mbits/s.
   Los chips Atheros son de los más compatibles con Linux y OpenWRT, pero no hay de tipo ac.

Fuentes y más información/ayuda
Último listado de chipsets Rraltek antes de que cerrase Wikidevi:
https://web.archive.org/web/20190921153258/https://wireless.wiki.kernel.org/en/users/Drivers/rtl819x

Testing

Ve a la sección "Alias", allí tengo recopiladas varias herramientas interesantes de testeo de red.


Monitorización de tráfico

Dispones varias herramientas visuales por web, como por ejemplo luci-app-nlbwmon y luci-app-vnstat

Consola

- bwm-ng                    # Muy simple. Muestra el de ancho de banda usado actual por interfaz
- bmon                      # Monitoriza trafico de red por consola (se puede linar a web) Instala: confuse libnl libncursesw
- iftop                     # Muestra conexiones establecidas y ancho de banda usado en tiempo real
- cat /proc/net/nf_conntrack

Luci (web)

- luci-app-statistics # Varias herramientas de monitorización, entre las que se encuentran los datos usados por interface y wifi.
- luci-app-nlbwmon    # Muestra tráfico total de subida/bajada por equipo e incluso desglosa por protocolo. Visualmente atractivo.
- luci-app-vnstat     # Muestra totales de equipo por dia y mes. Visualmente no me acaba de gustar pero a veces le doy utilidad.
- luci-wrtbmon        # Muestra el ancho de banda usado actualmente y total. No disponible, instalación externa.
- bandwithd           # Estadísticas de tráfico por ip. Muy costoso a nivel de cpu. No recomendado para routers.
- iptmon              # Script que se compagina con iptables y luci-app-statistics para mostrar datos subidos/bajados por cada cliente dhcp.
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/network_monitoring/bwmon
https://forum.lede-project.org/t/monitoring-bandwidth-used-per-user-because-metered-internet/2167

Monitorización con vnstat

Muestra ancho de banda usado por equipo en diferentes periodo, pudiendo desglosar hasta por cada minuto. Visualmente no me resulta atracivo en la gui, pero plantea utilidades interesantes.

Instalar:

    opkg install vnstat vnstati luci-app-vnstat

Configuración:

    Solo debes elegir que interface deseas monitorizar. No he notado que tenga consuma apenas recursos.

    Persistencia de la base de datos:
        Por defecto guarda lo que tiene en memoria en /var/lib/vnstat cada 30 minutos. Eesta carpeta está en ram, por lo que se perderá al reiniciar.
        Hay una opción en la que con un script se guarda la base de datos antes de reiniciar y se recupera al arrancar. Revisa los enlaces en "Fuentes y más información/ayuda"
        Si tienes un pendrive o sd, puedes hacer que escriba allí los datos para hacerlos persistentes y estaría bien aumentar tmb el tiempo de guardado.

        Edita: /etc/vnstat.conf

            DatabaseDir "/mnt/sda1/vnstat"    # En mi caso cambio /var/lib/vnstat para guardar en un pendrive
            Interface "br-lan"                # Puedes cambiar el interface por defecto (eth0), te será util a la hora de lanzar comandos.
            SaveInterval 60                   # how often (in minutes) data is saved to file             
            OfflineSaveInterval 60            # how often (in minutes) data is saved when all interface are offline

        El máximo tiempo de guardado es solo 60 (minutos) y no acepta valores mayores. (Por defecto usa 30)
         Ten presente que ante un reinicio perderás lo que no haya volcado de la memoria a disco desde el último guardado.

Comandos:

    vnstat               # Muestra los datos de todos los interfaces
    vnstat -u            # Comando para decirle que guarde la base de datos en memoria a disco (ideal para antes de reiniciar)
    vnstat -i br-lan     # Muestra los datos del interface (Cuando seleccionas un comando especifico usará por defecto eth0)
    vnstat -h -i br-lan  # Muestra datos por horas del interface br-lan
    vnstat -d -i br-lan  # Muestra datos diarios del interface (-w para semanales y -m mensuales)
    vnstat -t -i br-lan  # Muestra los diez días con mayor uso de datos del interface
    vnstat -l -i br-lan  # Monitoriza en tiempo real
    vnstat -tr -i tun1   # Calcula el ancho de banda usado en cinco segundos que monitoriza
    vnstat --help        # Ayuda

Truco:

    Si usas la base de datos persistente, antes de reiniciar deberías guardar la base de datos, aunque solo se perderían máximo 60 minutos si no lo haces.
    Estos alias serán utiles para que lo haga automáticamente sin que debas preocuparte. Puedes combinarlo con el commit de nlbwmon. Revisa la sección Alias arriba del documento.

           alias halt="vnstat -u;/sbin/halt"
           alias reboot="vnstat -u;/sbin/reboot"
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/network_monitoring/vnstat
https://humdi.net/vnstat/
https://humdi.net/vnstat/man/vnstat.conf.html

Monitorización con iptmon

Monitoriza el total de datos bajados y subidos mostrando una media de velocidad en un histórico con gráfio a través de luci-app-statistics Para ello establece unas reglas iptables en la tabla mangle de aquellos equipos que reciben una ip por dhcp. Cuando caduca se elimina la regla.

Instalar:

Lanza los siguientes comandos:

    opkg update && opkg install collectd-mod-iptables luci-app-statistics           # Instalar

    [ -d "/etc/collectd/conf.d/" ] || mkdir -p /etc/collectd/conf.d/
    wget https://raw.githubusercontent.com/oofnikj/iptmon/master/etc/collectd/conf.d/iptables.conf -O /etc/collectd/conf.d/iptables.conf # Descarga
    wget https://raw.githubusercontent.com/oofnikj/iptmon/master/usr/sbin/iptmon -O /usr/sbin/iptmon                                     # Descarga
    chmod +x /usr/sbin/iptmon   # Da permisos de ejecucion al script

    echo -e '\n\n# Para iptmon https://github.com/oofnikj/iptmon\ndhcp-script=/usr/sbin/iptmon\n' >> /etc/dnsmasq.conf  # Configura que dnsmasq llame a iptmon con cada nuevo cliente dhcp
    echo -e '\n\n# Para iptmon https://github.com/oofnikj/iptmon\n/usr/sbin/iptmon init\n' >> /etc/firewall.user        # Crea las cadenas al iniciar iptables

    uci set luci_statistics.collectd.Include='/etc/collectd/conf.d'
    uci commit
       # Estas dos lineas de antes revisan que /etc/config/luci_statistics tenga al menos esta linea dentro la sección siguiente:
       #     config statistics 'collectd'
       #         option Include '/etc/collectd/conf.d'

    # La siguiente linea agrega para que se haga backup de los ficheros. iptables.conf, iptmon y dnsmasq.conf
    echo -e '\n\n# Para iptmon https://github.com/oofnikj/iptmon\n/etc/collectd/conf.d/iptables.conf\n/usr/sbin/iptmon\n/etc/dnsmasq.conf\n' >> /etc/sysupgrade.conf

    # Edita el fichero /etc/config/luci_statistics y busca el campo "config statistics 'collectd_iptables'" y marca el enable a 1 como las dos lineas de abajo (sin los #):
    # config statistics 'collectd_iptables'
    #    option enable '1'

    reboot # debería servir pero no me funciono con solo:  service firewall restart y service luci_statistics restart
Notas:

iptmon solo monitoriza equipos que obtienen la ip mediante dhcp. Puedes añadir dos entradas como las de este ejemmplo al final de /etc/firewall.user para cada equipo que quieras monitorzar sin dhcp:

    iptables -t mangle -A iptmon_rx -s 0.0.0.0/0 -d 192.168.0.163 -m comment --comment "rx_NEO2" -j RETURN
    iptables -t mangle -A iptmon_tx -s 192.168.0.163 -d 0.0.0.0/0 -m comment --comment "tx_NEO2" -j RETURN
Fuentes y más información/ayuda
https://github.com/oofnikj/iptmon
https://www.reddit.com/r/openwrt/comments/fi05c4/iptmon_a_simple_iptablesbased_perhost_bandwidth/

Monitorización con nlbwmon

    Monitorización de tráfico desglosado por equipo y protocolo visualmente atractivo y no he visto que consuma muchos recursos
    Al estilo luci-wrtbwmon pero más completo y visual. Escucha conntrack en vez de reglas iptables

    opkg install nlbwmon luci-app-nlbwmon   # Instala adicional: kmod-nfnetlink kmod-nf-conntrack-netlink nlbwmon

    /etc/config/nlbwmon
        config nlbwmon
            option refresh_interval '30s'                           # Cada cuanto refrescará los contadores de tráfico de las conexiones establecidas de netlink
            option database_interval '1'                            # 1 = primer dia de mes. -2 = second last day of month, ej: 30th in March. '2017-01-17/14' = every 14 days, starting at Tue
            option protocol_database '/etc/config/myconfig/protocols_nlbmon' # Por defecto en /usr/share/nlbwmon/protocols.
                                                                    # Si no te lo coje, yo creo un enlace con:  rm /usr/share/nlbwmon/protocols && ln -s /etc/config/myconfig/protocols_nlbmon /usr/share/nlbwmon/protocols && reboot
            option database_limit '99999'                           # Maximas entradas en la bbdd. 10000 por defecto, 0 para unlimited
            option database_generations '0'                         # Limite de histórico de ficheros de bbdd generados (uno por mes). 0 sin limite
            option commit_interval '12h'                            # Por defecto guarda en memoria y con este intervalo escribe a fichero (ojo si escribes en flash, no muy frecuente)
            option database_directory '/mnt/sda1/nlbwmon'           # Donde escribirá el fichero en el intervalo elegido. Por defecto en memoria con /var/lib/nlbwmon
            option database_prealloc '1'                            # Reserva toda la memoria que podria usar para asegurarla en equipos que vayan justos (ojo a los límites que tengas puestos)
            option database_compress '1'                            # Accederás al historico más lento pero se reducirá bastante el espacio al comrpimirla
            list local_network '192.168.0.0/16'                     # Only conntrack streams from or to any of these subnets are counted.
            list local_network '172.16.0.0/12'
            list local_network '10.0.0.0/8'
            list local_network 'WireGuard_Guest'                    # Logical interface names may be specified to resolve the local subnets on the fly
            list local_network 'WireGuard_Home'
            list local_network 'OpenVPN_Home'
            list local_network 'VPN_2_CPD'
            list local_network 'Invitados'
            list local_network 'Servers'
            list local_network 'lan'

    Comandos consola de ejemplo:
        nlbw -c commit                                              # Guarda los datos de memoria en la bbdd.
        nlbw -c show -g host -o host                                # -c show para mostrar por pantalla
        nlbw -c show -g mac,fam -o conn                             # -g para agrupar por lo que indiques
        nlbw -c show -g mac -o -conn,-tx                            # -o para ordenadr por lo que indiques.  Con un - delante para invertir el orden
        nlbw -c csv -g mac -o mac -q                                # Exporta a csv para ser interpretado por otro equipo. P.e. rrdcollect
        nlbw -c json                                                # Dump database to json
        nlbw -t 2019-06-01 -c csv -g mac -o mac -q                  # Consultar una base de datos en concreto (yo guardo por mes)

    Consejos si usas que la base de datos sea persistente en disco:
        Antes de reiniciar lanza un commit con nlbw -c commit
        Estos alias serán utiles. Revisa la sección Alias arriba del documento.            
            alias halt="nlbw -c commit;/sbin/halt"
            alias reboot="nlbw -c commit;/sbin/reboot"
Fuentes y más información/ayuda
https://github.com/jow-/nlbwmon

Monitorización con wrtbmon (Usage)

    No disponible en OpenWRT.  A mi me entra en conflicto con nlbwmon. Hasta que no entro a luci, no activa la monitorización. Mejor opta por uno o el otro.
    Muestra el ancho de banda actual y total por equipo. Visualmente sencillo y muy claro e inteligible

    wrtbwmon crea reglas iptables para monitorizar
    luci-wrtbwmon es la interfaz luci para wrtbwmon

     Usage (Instalar):
        cd /tmp/
        wget https://github.com/pyrovski/wrtbwmon/releases/download/0.36/wrtbwmon_0.36_all.ipk --no-check-certificate
        opkg install /tmp/wrtbwmon_*_all.ipk && rm /tmp/wrtbwmon_*_all.ipk
        /etc/init.d/wrtbwmon enable
        /etc/init.d/wrtbwmon start
        wget https://github.com/Kiougar/luci-wrtbwmon/releases/download/v0.8.3/luci-wrtbwmon_v0.8.3_all.ipk --no-check-certificate  # 20190610 (No probado)
        # wget https://github.com/Kiougar/luci-wrtbwmon/releases/download/v0.7.0/luci-wrtbwmon_0.7.0_all.ipk --no-check-certificate   # 20180203
        # wget https://github.com/Kiougar/luci-wrtbwmon/releases/download/v0.6.0/luci-wrtbwmon_0.6.0_all.ipk --no-check-certificate   # 20170605
        opkg install /tmp/luci-wrtbwmon_*_all.ipk && rm /tmp/luci-wrtbwmon_*_all.ipk
        rm /tmp/luci-indexcache            # Borra la cache de Luci (entorno web)
        /etc/config/scripts/Gen_tmp_dnsmask.conf_for_wrtbwmon.sh    # Script mio para que Usage muestre el nombre del equipo. Como openwrt no usa /tmp/dnsmasq.conf lo genero como seria con los datos de /etc/config/dhcp

      Desinstalar:
        wrtbwmon remove
        opkg remove wrtbwmon
        opkg remove luci-wrtbwmon
Fuentes y más información/ayuda
https://github.com/pyrovski/wrtbwmon
https://github.com/Kiougar/luci-wrtbwmon
Descargar la ultima versión del ipk de wrtbwmon
Descargar la ultima versión del ipk para luci-wrtbwmon
info en OpenWRT. Sigue mejor el proceso de https://github.com/Kiougar/luci-wrtbwmon

Monitorización con bandwithd (no aconsejado)

    Estadísticas de tráfico por ip. Muy costoso a nivel de cpu. No recomendado para routers. A mayor ancho de banda, todavía más costoso.
    Es un sniffer y analizador/inspector de trafico, excesivamente costoso si encima procesas la bbdd y genera graficas localmente.
    Hay varias versiones según como quieres almacenar y mostrar los datos.
    Servira web en http://TuRouterWRT/bandwidthd
Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/network_monitoring/bandwidthd
https://wiki.openwrt.org/doc/howto/bandwidthd
https://oldwiki.archive.openwrt.org/doc/howto/bandwidthd

Notificar cada vez que alguien se conecta a nuestra wifi

Esta es la parte superior del script con los valores y opciones que podrás configurar:

    Reporta_Nuevas_Conexiones_a_Wifi_eMail=True   # Reporta cuando alguien se conecta a nuestra wifi enviando un email
    Reporta_Nuevas_Conexiones_a_Wifi_botTG=False  # Reporta cuando alguien se conecta a nuestra wifi con un mensaje de Telegram
    Reporta_Acciones_Fwknopd_eMail=True           # Reporta cuando fwknopd acepta una peticion de apertura o redireccion de puertos (por correo)
    Reporta_Acciones_Fwknopd_botTG=False          # Reporta cuando fwknopd acepta una peticion de apertura o redireccion de puertos (por telegram)
    Registra_ControlHorario=True                  # Funciona en conjuncion con el script ControlHorario.sh, que se lanzara antes de finalizar cada dia
    PathForControlHorario="/tmp/ControlHorario"   # Si no existe la carpeta, la creara. Aqui creara los ficheros FirstWcon.<NombreEquipo>.<YYYY-MM-DD> y LastWcon.<NombreEquipo>.<YYYY-MM-DD>
                                                  # Ten presente que /tmp esta en ram y se borra al reiniciar. Valora anadir un pendrive para no machacar la flash:  https://micorreo.email/OpenWRT.html#USBStorage

    #### Opciones de reporte conexiones a wifi ####

    Omite_Reservas_DHCP=True                                       # Omitira las mac que aparezcan en el fichero /etc/config/dhcp (reservas de DHCP)
    Omite_Ficheros="/etc/config/myconfig/MailNewClients_Whitelist" # Omitira las mac que aparezan en este fichero. Puedes poner varios ficheros, ej: "/path/file1 /path/file2".
                                                                   # El fichero debe tener una mac por linea y acepta un espacio y comentario, ej: 00:00:00:00:00:00 # Ejemplo

    ####### Datos para los envios de correo #######

    SMTP_SERVER=smtp.gmail.com   # Si pones la ip podras recibir notificaciones aunque todavia no haya levantado dnscrypt/adblock o haya alguna incidencia al respecto
    SMTP_SERVER_PORT=587
    SMTP_AUTH=tucorreo
    SMTP_PASS="tupass"
    MAIL_FROM=$SMTP_AUTH
    MAIL_TO=correodestino
    MAIL_SUBJECT_FWKNOPD="Nueva regla fwknopd en $(uname -n)"
    MAIL_SUBJECT_WIFI="Nuevo dispositivo conectado en $(uname -n)"

    #### Datos para la notificacion por Telegram ####

    BOT_TG_CHAT_ID='[CHAT_ID]'
    BOT_TG_TOKEN_KEY='[TOKEN_KEY]'
    BOT_TG_API="https://api.telegram.org/bot$BOT_TG_TOKEN_KEY"   #  Crea bot con @BotFather para enviar info directamente a tu chat.  https://core.telegram.org/bots#6-botfather

Notificar cada vez que fwknopd acepta una petición de apertura/redirección de puerto

En la sección para notificar cada vez que alguien se conecta a nuestra wifi esta la parte superior del script con las opciones que puedes configurar


DNS Dinámico (Cliente DDNS)

Si tienes una ip dinámica, se trata en mantener un registro DNS actualizado cuando tu ip cambie. Hay varios servicios en internet que te ofrecen esto de manera gratuita.

Tan solo debes instalar: ddns-scripts, luci-app-ddns (para el entorno web), desinstala wget-nossl si lo tienes e instala wget (para actualizar por tls) y editar a través de una de las dos opciones:
-Via web (luci) en Services -> Dynamic DNS
-Via terminal/ssh con el fichero /etc/config/ddns

Nota: Piensa que son servicios gratuitos que se usan masivamente. Por favor, no configures las actualizaciones de manera agresiva.
Nota: Cada vez que haces cambios en el fichero, para que los tome debes reinicar els servicio con: /etc/init.d/ddns restart
Nota: Algunos servicios deben ver que hay actividad. Por eso los campos force_interval y force_unit se hacen importantes aunque no te cambie la ip.
Truco: Cuando lo configures por primera vez puedes ampliar el nivel de log y una vez lo tengas funcionando, desactivarlo para rebajar recursos o poner use_syslog a 5 para solo errores.
Truco: Si tienes un dominio tuyo, puedes crear una entrada CNAME en tu DNS que apunte al servicio ddns. Te será más fácil de recordar por ejemplo casa.midom.es y si algún dia has de cambiar de ddns, tan solo lo configuras en openwrt y cambias el cname y el resto todo seguira igual. Puedes registrar en dondominio.com dominios .com.es por 3€ al año y tmb tienen api para actualizar DNS

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/ddns/client
https://openwrt.org/docs/guide-user/base-system/ddns

DDNS con no-ip.org

Revisa las opciones genéricas en la sección DNS Dinámico (Cliente DDNS)
No recomendado. Te obligan a logearte cada 30 días y si te descuidas, te cancelan el host (aunque se esté actualizando con el cliente).

config service 'NOIP'
    option enabled '1'
    option interface "wan"   # Cuando arranca/cambia este interface, lanza el script para comprobar/actualizar la ip
    option use_syslog  '5'   # Log sobre syslog(logread)            0=disable, 1=2+info, 2=3+notice, 3=4+warning, 5=solo errores. Por defecto 0.
    option use_logfile '1'   # Log en /var/log/ddns/Instancia.log   Por defecto 1 y se trunca a máximo 250 lineas

    option lookup_host 'host.no-ip.com'
    option service_name 'no-ip.com'     # service_name y update_url no pueden estar al mismo tiempo. Uno o el otro.
    option check_interval '33'
    option check_unit 'minutes'
    option retry_interval '6'
    option retry_unit 'minutes'
    option force_interval '28'
    option force_unit 'days'

    option ip_source 'network'  # Con web se conecta a una *web* especificada en *ip_url* para averiguar tu ip. Con *network* la toma del interface que le especifiques en *ip_network* y si no lo autodetecta
    option ip_network 'wan'     # Tomará de este interface para actualizar la ip si configuraste ip_source como 'network'
    option domain 'TuHost.no-ip.org'
    option username 'TuUsuario'
    option password 'TuPassword'
    option use_https '1'        # Por defecto tomara las CAs para validar los certificados de /etc/ssl/certs que se habrán descargado con el paquete "ca-certificates".
    option cacert 'IGNORE'      # Le puedes especificar otro path o fichero de CAs para validar los certificados para la actualización cifrada. Por defecto '/etc/ssl/certs'
    option cacert '/etc/ssl/certs' # Le puedes especificar otro path o fichero de CAs para validar los certificados para la actualización cifrada. Por defecto '/etc/ssl/certs'

DDNS con Duckdns.org

Revisa las opciones genéricas en la sección DNS Dinámico (Cliente DDNS)
Cambia <subdomain> y <duckdns-token> con tus valores

config service "duckdns"
    option enabled     '1'
    option interface   'wan' # Cuando arranca/cambia este interface, lanza el script para comprobar/actualizar la ip
    option use_syslog  '5'   # Log sobre syslog(logread)            0=disable, 1=2+info, 2=3+notice, 3=4+warning, 5=solo errores. Por defecto 0.
    option use_logfile '1'   # Log en /var/log/ddns/Instancia.log   Por defecto 1 y se trunca a máximo 250 lineas

    option check_interval '1'
    option check_unit     'hours'
    option force_interval '28'
    option force_unit     'days'

    option ip_source    'network'   # Con web se conecta a una *web* especificada en *ip_url* para averiguar tu ip. Con *network* la toma del interface que le especifiques en *ip_network* y si no lo autodetecta
    option ip_network   'wan'       # Tomará de este interface para actualizar la ip si configuraste ip_source como 'network'
    option domain       '<subdomain>.duckdns.org'
    option username     '<subdomain>'
    option password     '<duckdns-token>'

    option update_url   'http://www.duckdns.org/update?domains=[USERNAME]&token=[PASSWORD]&ip=[IP]'         #service_name y update_url no pueden estar al mismo tiempo. Uno o el otro
    option use_https    '1'         # Por defecto tomara las CAs para validar los certificados de /etc/ssl/certs que se habrán descargado con el paquete "ca-certificates".
    option cacert '/etc/ssl/certs'  # Le puedes especificar otro path o fichero de CAs para validar los certificados para la actualización cifrada. Por defecto '/etc/ssl/certs'
Fuentes y más información/ayuda
https://www.duckdns.org/install.jsp#openwrt
https://openwrt.org/docs/guide-user/services/ddns/duckdns
https://www.duckdns.org/spec.jsp

DDNS con Nsupdate.info

Revisa las opciones genéricas en la sección DNS Dinámico (Cliente DDNS)
Ofrece cuatro dominios diferentes. Suelo usar urown.cloud, ya que el DNS responde con DNSSEC y el correo está restringido mediante SPF y DMARC.
Ojo, si entras a la web y pulsas en show configuration, te resetea y cambia la contraseña automáticamente por lo que deberás cambiarla en el cliente
Es OpenSource, por lo que si tienes tu propio dominio y servidor, te lo puedes montar tu mismo.

[ -d /etc/ssl/certs ] || mkdir -p /etc/ssl/certs            # Deberías tenerla ya creada, pero por si acaso lo chequea y crea en caso de no ser así
wget -P /etc/ssl/certs http://curl.haxx.se/ca/cacert.pem    # Descarga la CA para validar la conexión/actualizaciones con tls

config service 'Nsupdate'
    option enabled '1'
    option interface "wan"   # Cuando arranca/cambia este interface, lanza el script para comprobar/actualizar la ip
    option use_syslog  '5'   # Log sobre syslog(logread)            0=disable, 1=2+info, 2=3+notice, 3=4+warning, 5=solo errores. Por defecto 0.
    option use_logfile '1'   # Log en /var/log/ddns/Instancia.log   Por defecto 1 y se trunca a máximo 250 lineas

    option lookup_host 'host.nsupdate.info'
    option service_name 'nsupdate.info'       # service_name y update_url no pueden estar al mismo tiempo. Uno o el otro.
    option check_interval '33'
    option check_unit 'minutes'
    option retry_interval '6'
    option retry_unit 'minutes'
    option force_interval '29'
    option force_unit 'days'

    option ip_source 'web'                    # Con web se conecta a una *web* especificada en *ip_url* para averiguar tu ip. Con *network* la toma del interface que le especifiques en *ip_network* y si no lo autodetecta
    option ip_url 'http://ipv4.nsupdate.info/myip'
    option domain 'host.nsupdate.info'
    option username 'host.nsupdate.info'
    option password 'Password'                # Ojo, si entras en la web de nsupdate.info y le das a show configuration, te resetea y cambia el password de esa entrada
    option use_https '1'                      # Por defecto tomara las CAs para validar los certificados de /etc/ssl/certs que se habrán descargado con el paquete "ca-certificates".
    option cacert '/etc/ssl/certs/cacert.pem' # Debes haberlo descargado antes con  wget -P /etc/ssl/certs http://curl.haxx.se/ca/cacert.pem

Podría ser que con el paso de los años debas eliminar y descargar el certificado actualizado con el siguiente comando:

rm /etc/ssl/certs/cacert.pem && wget -P /etc/ssl/certs http://curl.haxx.se/ca/cacert.pem
Fuentes y más información/ayuda
https://www.nsupdate.info/about/
https://github.com/nsupdate-info/nsupdate.info

DDNS con Dondominio.com

Revisa las opciones genéricas en la sección DNS Dinámico (Cliente DDNS)
Cambia <dominio que queremos actualizar> , <nombre de usuario> y <DonDNS Key> con tus valores

config service 'HostDonDominio'
    option enabled '1'
    option interface 'wan'   # Cuando arranca/cambia este interface, lanza el script para comprobar/actualizar la ip
    option use_syslog  '5'   # Log sobre syslog(logread)            0=disable, 1=2+info, 2=3+notice, 3=4+warning, 5=solo errores. Por defecto 0.
    option use_logfile '1'   # Log en /var/log/ddns/Instancia.log   Por defecto 1 y se trunca a máximo 250 lineas

    option check_interval '15'
    option check_unit 'minutes'
    option retry_interval '120'
    option retry_unit 'seconds'
    option force_interval '96'
    option force_unit 'hours'

    option ip_source 'network'  # Con web se conecta a una *web* especificada en *ip_url* para averiguar tu ip. Con *network* la toma del interface que le especifiques en *ip_network* y si no lo autodetecta
    option ip_network 'wan'     # Tomará de este interface para actualizar la ip si configuraste ip_source como 'network'
    option domain '<dominio que queremos actualizar>'
    option username '<nombre de usuario>'
    option password '<DonDNS Key>'
    option update_url 'http://dondns.dondominio.com/plain/?user=[USERNAME]&password=[PASSWORD]&host=[DOMAIN]'   #service_name y update_url no pueden estar al mismo tiempo. Uno o el otro
    option use_https '1'        # Por defecto tomara las CAs para validar los certificados de /etc/ssl/certs que se habrán descargado con el paquete "ca-certificates".
    option cacert 'IGNORE'      # Le puedes especificar otro path o fichero de CAs para validar los certificados para la actualización cifrada. Por defecto '/etc/ssl/certs'
Fuentes y más información/ayuda
https://dev.dondominio.com/dondns/docs/openwrt/
https://dev.dondominio.com/dondns/docs/api/

DDNS con Mailinabox.email

Revisa las opciones genéricas en la sección DNS Dinámico (Cliente DDNS)
Mail-in-a-Box es una suite para Ubuntu 18.04 LTS que te instala un servidor de correo completo con todo lo necesario + algunos extras como por ejemplo Nextcloud.
Tiene una api para actualizar remotamente los dns, por lo que tan solo tendrías que colocar una linea como esta en el cron con tus datos. Yo me notificaba por correo cuando actualizaba la ip y para ello debes instalar mailsend

*/30 * * * * Host='registro.dominio.ext';Ip_DNS="$(dig A $Host @box.dominio.ext | grep $Host | grep -v ';' | awk '{ print $5}')";Ip_Conexion="$(wget -qO- icanhazip.com)"; Mensaje="Actualizada ip para HostNueva:Ip_Conexion Anterior:$Ip_DNS" ; if [ "$Ip_DNS" != "$Ip_Conexion" ]; then curl -X PUT -d "$Ip_Conexion" --user CuentaAdmin:AdminPass https://box.dominio.ext/admin/dns/custom/$Host/A;mailsend -smtp box.dominio.ext -f remitente@dominio.ext -t destino@dominio.ext -auth -user remitente@dominio.ext -pass "PasswordEmail" -sub "$Mensaje" -M "$Mensaje" -cs "iso-8859-1" -enc-type "8bit" -starttls -port 587;fi

Debes cambiar:
    */30                  # Compruebo cada treinta minutos.
    Host                  # Cambialo por tu entrada dns que mantendrás actualizada
    box.dominio.ext       # Cambialo por el dns que apunta a tu instancia de mailinabox.email (lo utilizo para actualizar el dns y enviar el correo)
    CuentaAdmin           # Email con derechos de administración en Mail-in-a-Box
    AdminPass             # Password del email con derechos de administración en Mail-in-a-Box
    icanhazip.com         # La web que utilizo para ver que ip tienes. Puede ser otras como ifconfig.me o similares (han de mostrar solo la ip sin texto adicional)
    remitente@dominio.ext # El remitente y usuario de autentificación del correo
    destino@dominio.ext   # El destino donde notificar y enviar el correo
    PasswordEmail         # El password del usuario con el que te autentificas (remitente@dominio.ext)

Ve a https://box.tudominio.es/admin#custom_dns para ver la documentación de la api, por si quieres montartelo tu mismo y ver todas las opciones que soporta.

DDNS con freeDNS

Al final nunca lo he llegado a probar por tantas opciones que ya tengo disponible, probadas y documentadas:

Fuentes y más información/ayuda
https://freedns.afraid.org/about-us/
https://freedns.afraid.org/guide/dd-wrt/

Servidor VPN con Wireguard

Te permitirá acceder a la red interna cuando no estés en casa/oficina o bien navegar de manera segura en wifis publicas cuando viajes. También puede servirte para dejar siempre la VPN levantada en el movil y aprobechar el filtrado adblock aunque no estés en casa, controlando en todo momento la salida de tu movil y reduciendo los datos consumidos por las aplicaciones o al navegar.

Configurar el servidor/router

opkg install luci-app-wireguard                                        # Instalará: kmod-wireguard kmod-udptunnel4 kmod-udptunnel6 wireguard-tools ip-tiny y luci-proto-wireguard.  Debes reiniciar para que cargue el kernel
wg genkey | tee wg_privatekey.guest | wg pubkey > wg_publickey.guest   # Genera donde estés los ficheros clave del servidor.  Como suelo generar dos interfaces/servidores wireguard, pongo nombre para diferenciar sus dos claves que genero. Puedes dejar la clave en /etc/config/wireguard/ pero ve con cuidado donde guardas los backups, ya que están tus claves...
wg genkey | tee wg_privatekey.user1 | wg pubkey > wg_publickey.user1   # Genera nueva clave privada y publica para cada (peer/cliente).  Genera tantas como usuarios/clientes necesites
wg genpsk > wg_psk                                                     # Opcional. Para hacerlo quantum resistence utilizaremos una clave adicional. Solo lo hago si van a acceder a la red interna, si lo vas a aislar como a wifis de invitados para navegar desde wifis publicas, no es necesario y dejas el cliente más sencillo de configurar)
chmod 600 *                                                            # Establece los permisos adecuados.

En Luci/Network/interfaces creo una nueva interface eligiendo el protocolo "Wireguard VPN" (si acabas de instalar, debes haber reiniciado antes)
 El nombre de la interface suelo poner Wireguard_home o Wireguard_guest, para diferenciar por el nombre si la interface/vpn que estoy generando será de acceso a la red interna o aislada solo para navegación segura
Pega la clave privada de servidor que has generado.  En el router: cat wg_privatekey.home
Elijo el puerto donde quiero escuchar y pongo la privatekey generada. Si quieres evitar restricciones puedes usar 53,80,443, 993 o 8080. Ojo, que no se solape en puertos que ya tengas levantados (53,80,443). Como altos puedes probar los UDP de watsapp: 34784, 45395, 50318 o 59234
Especifica la ip que tomará el servidor/router en la vpn generada. ej: 192.168.30.1/24  # Si pones /32 funciona, pero ojo en dnsmask con localservice '1' (abajo info)
En Advanced asegurate que esté marcada "bring up on boot" y personalmente yo deshabilito todo lo relacionado con ipv4, asi que desmarco "Use builtin IPv6-management"
En Firewall Settings puedes unirte a una zona firewall que ya tengas, ej: Invitados pero recuerda que he colocado un rango de ips diferente, quizá quieras crear una nueva zona por si quieres poner reglas en base a la ip. ej: VPN_LAN, VPN_Guest, Wireguard_guest, etc...

En Peers:
    Añado uno por cliente y pongo la publickey repectiva de cada cliente que se quiere conectar (la privada la utilizarás en el equipo que se vaya a conectar, ej: mobil)
    En allowed ip elijo la ip que va a tomar cada peer/cliente: 192.168.30.2/32
    Habilita: "Route Allowed IPs"              # Crea automáticamente las rutas a cada Allowed IP de este peer. (Le permite salir a internet, de otra manera o creas tu las rutas a mano o no tendrás salida a inernet por la vpn, solo tendrías acceso a la red local de la vpn)
    Opcional: añado el campo "Preshared Key" y coloco el contenido de wg_psk   # Es opcional pero le da mayor seguridad ante ataques (Lo hago solo si la vpnd e acceso a la red interna)
    Optional: Persistent Keep Alive            # Cada cuando envia una señal para ver si está viva y mantener la conexión. Recomiendan un valor de 25 pero si la conexión del cliente es estable suelo subirlo para reducir el tráfico de control.  (En fichero es option persistent_keepalive '40')
    Aconsejado: añade el campo "Description" y especificale un nombre a cada cliente. Si vas a tener varios peers te ayudara a identificarlos.

Habilita en Traffic Rules(Firewall)/"Open ports on router" para que se pueda conectar desde fuera al puerto elegido de escucha (udp). En nuestro ejemplo, el 8080. Revisa GeoIP. Suelo permitir solo el acceso a los paises en que me vaya a conectar.

El fichero /etc/config/network habrá añadido algo tal que así. Puedes usarlo como referencia para editarlo sin luci:

    config interface 'WIREGUARD_PRINT'
            option proto 'wireguard'
            option private_key 'CP0dGm71wHaMyQw/l3hfbyEGrImBz164L8ufmVd4WF0='   # Tranquilo que no es mi clave ;)
            option listen_port '8080'                                           # Debes tenerlo abierto en el firewall del router. Network -> Firewall -> Traffic Rules  # Si tienes el forzado DNS, no pongas el 53
            list addresses '192.168.30.1/24'                                    # No elijas un rango que ya tengas en tus interfaces

    config wireguard_WIREGUARD_PRINT
            option public_key 'OrHbfSh3mUpdcIIwWZpV2FJQcAVJ4nB1To2zfWwniT8='    # Tranquilo que no es mi clave ;)
            list allowed_ips '192.168.30.2/32'
            option route_allowed_ips '1'
            option preshared_key 'KD8b6N2k8vkyYslhzJEfBuZUuRTn0iF2S0Jb8a0Vz9U=' # Tranquilo que no es mi clave ;)
            option persistent_keepalive '30'
            option description 'User1'

El fichero /etc/config/firewall habrá añadido algo tal que así (Si lo has unido a la zona firewall que tuvieras para invitados)

    config zone
        option name 'Invitados'
        option output 'ACCEPT'
        option input 'REJECT'
        option forward 'REJECT'
        option network 'Invitados WIREGUARD_PRINT'

    config rule
        option enabled '1'
        option target 'ACCEPT'
        option src 'wan'
        option dest_port '8080'
        option name 'Wireguard'
        option family 'ipv4'
        option proto 'udp'

wg                              # Comando para ver estado. Tmb en en Luci: Status -> WireGuard Status. Revisa tmb en Interfaces que haya tráfico y esté levantada
wg show WIREGUARD_PRINT         # Por si tienes varias interfaces/VPN de wireguard y con muchos clientes, de esta manera miras solo la que te interesa
iptables -nvL zone_wan_input    # Para ver si te llega la petición de fuera a la regla que hayas permitido con el firewall

------------------------------------------------------

A modo de resumen, como es lioso al principio, esquematizo que claves y peers deben ir en casa sitio:

En el servidor configurarás:

Luego en el cliente/s configurarás:

    ------------------------------------------------------

Conectar/configurar los dispositivos cliente:

    Conectar/configurar los dispositivos cliente:
        Name:        ClienteWG         # Creo conexión/interface y coloca el nombre que quieras para diferenciarla
        PrivateKey:  TuClavePrivada    # Colocarás la clave privada del usuario. Puedes utilizar las claves que has generado en el router pero tmb el cliente suele dar opción a generar el mismo las claves privada y publica. Si fuera el caso, la publica es la que tendrás que colocar en las opciones Peer del router/servidor
        Addresses:   192.168.30.2/32   # Coloca la ip que quieres/permites tome el movil cuando se conecte.
        DNS Server:  192.168.30.1      # Opcional. Especifica el DNS donde hará las consultas. Pon la primera ip del rango de la VPN, que será la del router. Si no pones nada utilizarás la que tenga el equipo cliente: Ej en android 8.8.8.8 (Por eso pongo forzado DNS en Router)
        En Peer:
            Public Key                 # La clave pública del router/servidor
            Allowed IPs:    0.0.0.0/0
            Endpoint:       PubIP:8080 # La ip:puerto publicos del router.  (Debes tenerlo abierto en el firewall del router. Network -> Firewall -> Traffic Rules)
            Pre-shared Key: Opcional   # Añade robustez extra con equipos cuanticos en mente (Es opcional, así que solo si la configuraste en Peer del Servidor/Router)
            Keepalive:      Opcional   # Cada cuando envia señal para saber si al conexión está viva. Por defecto 40 (segundos). Si la conexión es estable, puedes bajarla un poco, por ejemplo a 30.

    ------------------------------------------------------

Forzado DNS (Opcional):

       En Firewall/"Custom Rules" establezco dos entradas para forzar a que todas las consultas DNS que realicen los clientes conectados al router.
        Esto es interesante para que todos los dispositivos pasen por el DNS del Router con Adblock, Dnscrypt-proxy, DNS over TLS o lo que tengas.
         De esta manera, aunque las aplicaciones, por el ejemplo del movil, tengan hardcodeado el DNS hacia 8.8.8.8, pasarán forzadas por el router
          Adblock te crea una regla pero solo lo aplica a una interfaz y en el firewall tendrías que crear una regla por interfaz, con estas dos lineas se aplica a todas de golpe.

         iptables -w 9 -t nat -I PREROUTING ! -i eth1.832 -p udp -m multiport --dports 53,853,5353 -j REDIRECT -m comment --comment "Forzado DNS udp 53,853,5353"
         iptables -w 9 -t nat -I PREROUTING ! -i eth1.832 -p tcp  -m multiport --dports 53,853,5353 -j REDIRECT -m comment --comment "Forzado DNS tcp 53,853,5353"
            # Donde pone eth1.832 debes cambiarlo por la interfaz o puente que te da acceso a internet.

         Al hacer esto, si tienes alguna zona con INPUT en Reject (lo ideal en zonas invitados), tendrás que crear una regla en Custom Rules para que el router acepte peticiones al udp 53 en esa zona, sino no habrá salida a internet

    ------------------------------------------------------

Incidencias:

        Primeramente coloqué la ip del servidor y clientes con /32. Funcionaba todo menos las consultas DNS.
        El problema era dnsmask y la opcion localservice que tenía a '1' (Fichero /etc/config/dhcp).
            option localservice '1'     # Hace que dnsmask solo responda a ips y subnets del router.
        Al poner en wireguard al servidor con /32, no contempla a los peers o clientes como local subnet y no atenderá sus consultas dns
        Basta con poner la ip del interface/servidor de wireguard con /24 o bien establecer option localservice '0'
        Preferí establecer /29 en el servidor, ya que no tendré tantos clientes y dejar la opcion localservice '1'

    ------------------------------------------------------
Fuentes y más información/ayuda
Comparativa OpenVPN vs Wireguard
Tests velocidad Wireguard vs otras
https://openwrt.org/docs/guide-user/services/vpn/wireguard
https://openwrt.org/docs/guide-user/network/tunneling_interface_protocols?s[]=wireguard#protocol_wireguard_wireguard_vpn
https://www.wireguard.com/
http://openwrt.tuinstituto.es/instalar-servidor-vpn-wireguard-en-hg556a (# A partir del punto 2.2)
https://elblogdelazaro.gitlab.io/post/2018-06-28-openwrt-wireguard.html

Cliente VPN con Wireguard

Para conectarte y acceder a otra red a través de Wireguard, crearás una interface y asignarás a esta a una zona firewall.

Instalar:

        opkg install luci-app-wireguard     # Te instalará todos los requisitos y luego debes reiniciar para que cargue el nuevo kernel que habilita Wireguard

Configurar:

Crearás un nuevo interface de tipo wireguard configurando las claves y pocos parámetros más, pero lo más fácil es que copies adaptando a tu gusto el siguiente ejemplo en el fichero /etc/config/network.

        config interface 'VPN_2_OFI'               # El nombre del interface que creara como cliente VPN Wireguard
                option proto 'wireguard'
                option private_key 'PrivKeyCli'    # Clave privada del usuario con el que te quieres conectar al servidor Wireguard
                list addresses 'IP/32'             # Ip permitida y que tomará el usuario con el que te quieres conectar al servidor Wireguard
                option delegate '0'                # En mi caso no quiero usar ipv6 (motivos en seccion Firewall, ipv6)
                option auto '1'                    # Si no quieres que conecte automaticamente, ponlo a 0

        config wireguard_VPN_2_OFI
                option public_key 'PubKeyServer'   # Llave publica del servidor donde voy a conectarme'
                option preshared_key 'PresharedKey # Si la tienes, establece la preshared key del servidor donde te conectas. Si no tienes, puedes eliminar esta linea
                list allowed_ips '192.168.30.3/24' # Ips que permitira tomar (debe estar al menos obligada la ip que esta configurada como permitida para ti en el lado servidor)
                list allowed_ips '192.168.2.1/24'  #  Con route_allowed_ips a 1 es a estas redes donde encaminara el trafico hacia esta interface/vpn
                list allowed_ips '10.10.10.0/24'   #   Si quisieras encaminar todo el trafico hacia la vpn, puedes poner 0.0.0.0 (Todo tu tráfico saldría y Navegarás a través de la red VPN)
                option route_allowed_ips '1'                 # Crea las rutas en el router para encaminar el trafico a traves de la VPN hacia las redes definidas en list allowed_ips
                option endpoint_host 'lalala.publica.com'    # Ip publica del servidor donde te vas a conectar
                option endpoint_port '666'                   # Puerto del servidor donde te vas a conectar
                option persistent_keepalive '30'             # Para mantener la sesión abierta y reconectar cuando detecte que esta caida (no es necesario)
                option description 'Wireguard_Ofi_Full.test' # Cuando tienes muchas vpns o peers es de ayuda para saber con quien trata

En el firewall crearás una zona para asignar a la vpn o puedes asociarla a otra zona que ya tuvieras.
En mi caso tengo también un cliente VPN con OpenVPN y tengo las dos interfacez en la misma zona. Ejemplo de lo que tendría en /etc/config/firewall

        config zone
                option name 'VPN_CLI_Job'
                option input 'REJECT'
                option output 'ACCEPT'
                option forward 'REJECT'
                option network 'VPN_2_OFI VPN_2_OFIb'  # La zona firewall la tengo asignada a dos interfaces/clientes vpn, las cuales son para lo mismo y solo una activa con la otra parada como backup
                option family 'ipv4'
                option mtu_fix '1'
                option masq '1'                        # Habilitas NAT. De manera que cuando te conectas a la red VPN destino, los equipos destino te veran como la ip que te asigna como cliente vpn.
                list masq_src '192.168.1.10'           # Puedes limitar a que haga nat solo a una o varias ips en vez de todo tu rango. De esta manera limitaras el acceso VPN a solo unos equipos
                list masq_src '192.168.1.11'           #  Realmente estos equipos tendrían acceso, pero sin nat las redes por defecto no se van a ver y conectar correctamente
                list masq_dest '192.168.2.0/24'        # Habilita NAT cuando se desea acceder a la red destino especificada (debe cumplirse list masq_src hacia list masq_dest)
                list masq_dest '10.10.10.0/24'

Claves:

Deberías tener la clave publica del servidor donde te quieras conectar y como opcional la preshared key.
Debes tener también la clave privada del usuario con el que te vas a conectar. El servidor tendrá configurado en su lado tu clave pública. Por lo que o bien el servidor ha generado las claves y te ha dado tu pública, o bien has generado tu tu privada y debes enviarles tu pública para que generen en su lado el servidor Wireguard al que te conectarás.

        wg genkey | tee wg_privatekey.user1 | wg pubkey > wg_publickey.user1   # Graba en la carpeta donde estes tantnto la clave privada como la publica para user1

Incidencias:

Los ficheros de claves deben tener permisos 600 (solo rw para propietario) Ojo con el solapamiennto de rangos ip. Si en el router ya tienes una red/interface del mismo rango de la que te daría la vpn a la que te vas a conectar, puede generar problemas de rutas.
Al crear VPN, la red origen y la red destino deben ser diferentes. Pues si las dos redes fueran 192.168.1.0/24, tu equipo no buscará al gateway/vpn si cree que el destino está en tu misma red.

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/services/vpn/wireguard/client
https://openwrt.org/docs/guide-user/services/vpn/wireguard/start
https://openwrt.org/docs/guide-user/services/vpn/wireguard/basic
https://openwrt.org/docs/guide-user/services/vpn/wireguard/extra
https://www.wireguard.com/
https://www.wireguard.com/quickstart/#nat-and-firewall-traversal-persistence

Cambiar a tema oscuro con Darkpro

No se encuentra en los repositorios. Puedes instalarlo de varias maneras, las dos más fáciles son:

  1. En Luci(web), System, Software y pegar la url en "Download and install package:"
  2. Con el terminal: cd /tmp/ && wget url y opkg install luci-theme-darkpro_git-*

La url de darkpro puedes sacarla de: http://www.desipro.de/openwrt/repo/18/targets/ipq806x/generic/packages/
Una vez instalado, puede que ya te la haya seleccionado pero puedes cambiar el tema en: System -> System -> Language and Style
Puede dar la impresión que va algo más lento, esto se debe a que el tema por defecto muestra lo que va cargando parcialmente hasta que finaliza la carga, con darkpro muestra un icono de carga en vez de mostrar lo que va cargando hasta que finaliza la carga por completo, momento en que mostrará la web cargada por completo.

Fuentes y más información/ayuda
https://github.com/kuyokushin/luci-theme-darkpro
Url donde podrasdescargar darkpro
Url directa donde descargar la versión actual de darkpro en el momento de hacer este artículo
Enlace al grupo de Telegram de OpenWRT

Cambiar el idioma de luci (entorno administración web)

    En System -> Software -> Filter:  luci*-es
    Por consola con opkg update && opkg list luci*-es

    Instala luci-i18n-base-es y todos las tools que quieras en castellano.
    Para otro idioma, cambia -es por el que quieras. Para ver los disopnibles: opkg list luci-i18n-base-*

Actualizar el firmware por consola con sysupgrade

1.- Guardamos conf y listado de paquetes (Puedes usar mi alias BackupWRT)

    [ -d /etc/config/Backup ] || mkdir /etc/config/Backup
    cd /etc/config/Backup
    opkg list-installed > list-installed.`date -I`  # No olvides sacarlo fuera del router por si acaso
    sysupgrade -b SysBackup_`date -I`.tar.gz        # No olvides sacarlo fuera del router por si acaso
                                                    # Para que haga backup de rutas o ficheros adicionales, edita /etc/sysupgrade.conf

    # Opcional   (Copiar todos los ficheros de configuración dentro de /etc/config/old/ añadiendoles la fecha como extensión)
    #   [ -d /etc/config/old ] || mkdir /etc/config/old
    #   find /etc/config/ -maxdepth 1 -type f -print | grep -v -e "opkg" -e "\." | awk '{ print "cp "$1" "$1".$(date +%Y%m%d)"}' | sh
    #   mv /etc/config/*.202????? /etc/config/old/

    Haz el backup por Luci(web) y así tendrás en el backup descargado el listado y backup de configuración hecho con sysupgrade, ya que lo hemos dejado en /etc/config/Backup (ocupan muy poco)

2.- Descargamos el firmware y Flasheamos (Añado enlaces de descarga de algunos router)

Ten presente que de la 18.06.5 a la 19.07.X hay cambios en algunos ficheros de configuración. Por ejemplo wireless y adblock y si recuperas paquetes de la 18.06.6 ten en cuenta que esta lleva luci-compat.

    cd /tmp/
    # Algunos enlaces directos de routers que he flasheado (Recomendados los Linksys WRT a partir del WRT1900acs)
    wget https://downloads.openwrt.org/releases/19.07.2/targets/mvebu/cortexa9/openwrt-19.07.2-mvebu-cortexa9-linksys_wrt32x-squashfs-sysupgrade.bin     # Linksys WRT32X
    wget https://downloads.openwrt.org/releases/19.07.2/targets/mvebu/cortexa9/openwrt-19.07.2-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin # Linksys WRT1900acs
    wget https://downloads.openwrt.org/releases/19.07.2/targets/brcm63xx/generic/openwrt-19.07.2-brcm63xx-generic-AR5387un-squashfs-sysupgrade.bin       # Comtrend AR5387un
    wget https://downloads.openwrt.org/releases/19.07.2/targets/brcm63xx/generic/openwrt-19.07.2-brcm63xx-generic-HG553-squashfs-cfe.bin                 # Huawei HG553
    wget https://downloads.openwrt.org/releases/19.07.2/targets/ramips/mt7621/openwrt-19.07.2-ramips-mt7621-xiaomi_mir3g-squashfs-sysupgrade.bin         # Xiaomi Mi3G

    sysupgrade -c openwrt-19.07.1-brcm63xx-generic-HG553-squashfs-cfe.bin   # Con -c te guarda los ficheros que hayas modificado en /etc/    # Se flashea y reinicia, por lo que tendrás que conectarte de nuevo por ssh

3.- Restauramos paquetes

Asegurate que tengas espacio extra. Borra el /etc/config/Backup/SysBackup_date -I.tar.gz, al generarlo antes de descargar el backup desde luci, ya lo tienes en tu equipo.

    opkg update           # && opkg list-upgradable | cut -d " " -f 1 | xargs opkg upgrade         # Con la 18.06.2 la primera vez fallaba. Lo lanzo una segunda vez y todo ok. Pero ya solo lanzo el update.
    cd /etc/config/Backup
    #opkg remove wpad-basic && opkg install wpad                                                   # Solo si tenías wpad completo. Por ejemplo para 802.11w o 801.11r.  Y en en OpenWRT < 19 wpad-basic= wpad-mini
    cat list-installed.2020-03-13 | cut -d " " -f 1 | xargs opkg install                           # Te fallarán los que hayas instalado fuera de los repositorios oficiales. Ej: wrtbwmon y luci-wrtbwmon
    #cd /tmp/ && opkg download dnsmasq-full && opkg remove dnsmasq && opkg install dnsmasq-full_*  # Solo si tenías dnsmasq-full. Por ejemplo para DNSSEC.
    reboot

Nota para usuarios avanzados y entornos delicados que necesitan de alta disponibilidad.


Recovery/Failsafe. Recuperar un router después de haberla cagado con alguna configuración

OpenWRT trae un modo recovery que puede ayudarte si las has cagado trasteando.
Apaga el router y enciendelo de nuevo mientras aprietas el botón de reset del router durante unos 10/12 segundos (generalmente hasta que parpadea rápidamente la luz)

El router se colocará con la ip 192.168.1.1 y servidor ssh abierto sin contraseña. Al acceder, podrás lanzar:

    * firstboot     # Resetea y deja los valores de fabrica (Cuidadín, se cepilla todo y lo deja limpito)
    * mount_root    # Montará tu partición con los ficheros de configuracion para que puedas editarlos. Lo tendrás en /overlay/upper/etc/config/
    * passwd        # Podrás reestablecer la contraseña para acceder al router (Debes primero lanzar mount_root)

Nota: Si ves que vas a tener que recuperarlo más veces. Sal con "reboot;exit" para que no te deje la sesión colgada.

Fuentes y más información/ayuda
Failsafe_and_factory_reset
Troubleshooting