¿Cómo configurar la regla de tráfico OpenWrt para el servidor IPv6 de reenvío de puertos en mi LAN?

¿Cómo configurar la regla de tráfico OpenWrt para el servidor IPv6 de reenvío de puertos en mi LAN?

Me gustaría permitir el tráfico IPv6 entrante en los puertos 80/443 para un servidor web enrutable globalmente en mi red doméstica. ¿Cuál es la mejor manera de hacer esto con OpenWrt, que de forma predeterminada bloquea el tráfico IPv6 entrante (como debería hacerlo un buen firewall)?

Mi ISP (Comcast) me asigna un prefijo /60 para delegación vía DHCPv6. A veces cambia. El servidor web (Ubuntu) obtiene una dirección IPv6 global a través de SLAAC desde el enrutador OpenWrt.

segúnhttps://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6Puedes configurar una regla de tráfico para permitir este tipo de tráfico:

Para abrir el puerto 80 para que se pueda acceder a un servidor web local en 2001:db8:42::1337 desde Internet:

regla de configuración
        opción src wan
        opción protocolo tcp
        opción destino lan
        opción destino_ip 2001:db8:42::1337
        opción puerto_destino 80
        familia de opciones ipv6
        opción objetivo ACEPTAR

Bastante fácil, excepto... ¡la IP de destino está codificada!

¿Cómo se podría configurar este tipo de regla cuando la IP de destino está potencialmente cambiando?(debido a cambios en el prefijo delegado de mi ISP). Presumiblemente, debe actualizarse periódicamente... ¿Alguien ha intentado esto y, de ser así, qué funciona bien o qué no funciona bien?

Respuesta1

Encontré el mismo problema y callejón sin salida que tú. Escribí un script rápido y sucio para automatizar los cambios del firewall por mí.

#!/bin/sh

# CONFIGURABLE PARAMETER: PREFIX
# the prefix is the prefix of all the firewall rules that should be changed
PREFIX=DynamicIPv6
PREFIX_LEN=${#PREFIX}

# get current IPv6 prefix from WAN
. /lib/functions/network.sh
network_get_prefix6 prefix6 wan6
prefix6=$(echo $prefix6 | cut -d/ -f1)
prefix_len=$(expr ${#prefix6} - 1)
prefix6=${prefix6:0:$prefix_len}

changed=0
index=0
name=$(uci get firewall.@rule[$index].name 2> /dev/null)
while [ "$name" != "" ]; do
    subname=${name:0:$PREFIX_LEN}

    # if the prefix matches, determine whether to change the firewall rules
    if [ "$subname" == "$PREFIX" ]; then
            dest_ip=$(uci get firewall.@rule[$index].dest_ip 2> /dev/null)
            dest_network=${dest_ip:0:$prefix_len}
            host_addr=$(echo $dest_ip | awk -F: 'BEGIN { OFS=":"; } { print $5,$6,$7,$8 }')

            # if the firewall rule and prefix mismatch, update the firewall
            if [ "$dest_network" != "$prefix6" ]; then
                    changed=1
                    new_ip="${prefix6}${host_addr}"
                    uci set firewall.@rule[$index].dest_ip=$new_ip
                    uci commit firewall
            fi
    fi

    # advance to the next firewall rule
    index=$(expr $index + 1)
    name=$(uci get firewall.@rule[$index].name 2> /dev/null)
done

# if changes were detected, then reload the firewall
if [ $changed -eq 1 ]; then
    /etc/init.d/firewall reload 2> /dev/null
fi

Para utilizar el guión:

  1. Cree sus reglas de firewall usando PREFIXen el script.
  2. Programe el script para que se ejecute mediante cron.

Problema conocido:El script está limitado a direcciones IPv6 completas y no puede utilizar la abreviatura ::. (por ejemplo, 2600:dead:beef:cafe:0:0:0:1 en lugar de 2600:dead:beef:cafe::1).

El guión está lejos de ser perfecto, así que sea amable. Ofrezco el guión con la esperanza de que lo encuentre útil. :)

Respuesta2

VerificarReenvío de prefijo dinámicoya que tiene un truco donde puedes usar números negativos para el prefijo.

Configurar unarrendamiento estático de DHCPv6y agregue una regla de reenvío:

uci add firewall rule
uci set firewall.@rule[-1].name="Forward-IPv6"
uci set firewall.@rule[-1].src="wan"
uci set firewall.@rule[-1].dest="lan"
uci set firewall.@rule[-1].dest_ip="::123/-64"
uci set firewall.@rule[-1].family="ipv6"
uci set firewall.@rule[-1].proto="tcpudp"
uci set firewall.@rule[-1].target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart

información relacionada