3

Я хотел бы разрешить входящий трафик IPv6 через порты 80/443 для глобально маршрутизируемого веб-сервера в моей домашней сети. Каков наилучший способ сделать это с OpenWrt, который по умолчанию блокирует входящий трафик IPv6 (как должен делать хороший брандмауэр)?

Мой провайдер (Comcast) назначает мне префикс /60 для делегирования через DHCPv6. Это иногда меняется. Веб-сервер (Ubuntu) получает глобальный IPv6-адрес через SLAAC от маршрутизатора OpenWrt.

Согласно https://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6 вы можете настроить правило трафика, чтобы разрешить этот вид трафика:

Чтобы открыть порт 80, чтобы локальный веб-сервер в 2001 году:db8:42::1337 был доступен из Интернета:

опция правила конфигурации src wan опция proto tcp опция dest lan опция dest_ip 2001:db8:42::1337 опция dest_port 80 семейство опций ipv6 опция target target ПРИНЯТЬ

Достаточно просто, за исключением .... IP-адрес назначения жестко запрограммирован!

Как можно настроить правило такого типа, когда IP-адрес назначения может меняться? (из-за изменений в делегированном префиксе от моего провайдера). Предположительно, он должен периодически обновляться .... Кто-нибудь пытался это сделать, и если да, то, что работает хорошо / не работает?

1 ответ1

0

Я столкнулся с той же проблемой и тупиком, что и вы. Я написал быстрый и грязный скрипт для автоматизации изменений брандмауэра для меня.

#!/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

Чтобы использовать скрипт:

  1. Создайте правила брандмауэра, используя PREFIX в скрипте.
  2. Запланируйте запуск сценария с помощью cron.

Известная проблема: сценарий ограничен полными адресами IPv6 и не может использовать :: короткую руку. (например, 2600: мертвые: говядина: кафе: 0: 0: 0: 1 вместо 2600: мертвые: говядина: кафе :: 1).

Сценарий далеко не идеален, так что будьте добры. Я предлагаю сценарий в надежде, что вы найдете его полезным. :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .