Como configurar a regra de tráfego OpenWrt para o encaminhamento de porta do servidor IPv6 na minha LAN?

2

Eu gostaria de permitir o tráfego IPv6 de entrada nas portas 80/443 para um servidor da web globalmente roteável 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 um bom firewall deveria)?

Meu ISP (Comcast) me atribui um prefixo / 60 para delegação via DHCPv6. Às vezes muda. O servidor web (Ubuntu) recebe um endereço IPv6 global via SLAAC do roteador OpenWrt.

De acordo com o link , você pode configurar uma regra de tráfego para permitir esse tipo de tráfego:

To open port 80 so that a local webserver at 2001:db8:42::1337 can be reached from the Internet:

config rule
        option src       wan
        option proto     tcp
        option dest      lan
        option dest_ip   2001:db8:42::1337
        option dest_port 80
        option family    ipv6
        option target    ACCEPT

Fácil, exceto ... o IP de destino é codificado!

Como se pode configurar esse tipo de regra quando o IP de destino está potencialmente mudando? (devido a alterações no prefixo delegado do meu ISP). Presumivelmente, tem que ser atualizado periodicamente .... Alguém já tentou isso e, em caso afirmativo, o que funciona bem / não funciona bem?

    
por James Johnston 18.06.2016 / 04:01

1 resposta

0

Eu encontrei o mesmo problema e beco sem saída como você. Eu 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:

  1. Crie suas regras de firewall usando o PREFIX no script.
  2. Agende o script para ser executado usando o cron.

Problema conhecido: O script está limitado a endereços IPv6 completos e não pode usar o ponteiro :: short. (por exemplo, 2600: morto: carne de vaca: café: 0: 0: 0: 1 em vez de 2600: morto: carne de vaca: café :: 1).

O roteiro está longe de ser perfeito, então seja gentil. Eu ofereço o roteiro na esperança de que você ache útil. :)

    
por 28.07.2016 / 06:32