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:
- Crie suas regras de firewall usando o
PREFIX
no script. - 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. :)