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:
- Cree sus reglas de firewall usando
PREFIX
en el script. - 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