Gostaria de permitir o tráfego IPv6 de entrada nas portas 80/443 para um servidor Web roteável globalmente na minha rede doméstica. Qual é a melhor maneira de fazer isso com o OpenWrt, que por padrão bloqueia o tráfego IPv6 de entrada (como deveria ser um bom firewall)?
Meu ISP (Comcast) me atribui um prefixo /60 para delegação via DHCPv6. Às vezes muda. O servidor web (Ubuntu) obtém um endereço IPv6 global via SLAAC do roteador OpenWrt.
Conformehttps://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6você pode configurar uma regra de tráfego para permitir esse tipo de tráfego:
Para abrir a porta 80 para que um servidor web local em 2001:db8:42::1337 possa ser acessado pela Internet:
regra de configuração opção src wan opção proto tcp opção destino lan opção destino_ip 2001:db8:42::1337 opção porta_dest 80 opção família ipv6 opção alvo ACEITAR
Bastante fácil, exceto... o IP de destino é codificado!
Como configurar esse tipo de regra quando o IP de destino está potencialmente mudando?(devido a alterações no prefixo delegado do meu ISP). Presumivelmente, ele deve ser atualizado periodicamente.... Alguém já tentou fazer isso e, em caso afirmativo, o que funciona bem/não funciona bem?
Responder1
Encontrei o mesmo problema e beco sem saída que você. Escrevi um script rápido e sujo para automatizar as alterações do firewall para mim.
#!/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 usar o script:
- Crie suas regras de firewall usando
PREFIX
no script. - Agende o script para ser executado usando cron.
Problema conhecido:O script é limitado a endereços IPv6 completos e não pode usar a abreviação ::. (por exemplo, 2600:dead:beef:cafe:0:0:0:1 em vez de 2600:dead:beef:cafe::1).
O roteiro está longe de ser perfeito, então seja gentil. Ofereço o script na esperança de que você o considere útil. :)
Responder2
ConfiraEncaminhamento de prefixo dinâmicopois tem um truque onde você pode usar números negativos para o prefixo.
Configurar umconcessão estática de DHCPv6e adicione uma regra de encaminhamento:
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