Я хотел бы разрешить входящий трафик 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 опция назначения lan опция dest_ip 2001:db8:42::1337 опция dest_port 80 вариант семейства ipv6 вариант цели ПРИНЯТЬ
Все достаточно просто, за исключением того, что... IP-адрес назначения жестко запрограммирован!
Как можно настроить этот тип правила, если IP-адрес назначения потенциально меняется?(из-за изменений в делегированном префиксе от моего интернет-провайдера). Предположительно, его нужно периодически обновлять.... Пробовал ли кто-нибудь это сделать, и если да, то что работает хорошо / не работает хорошо?
решение1
Я столкнулся с той же проблемой и тупиком, что и вы. Я написал быстрый и грязный скрипт для автоматизации изменений брандмауэра для себя.
#!/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
Чтобы использовать скрипт:
- Создайте правила брандмауэра, используя
PREFIX
скрипт. - Запланируйте запуск скрипта с помощью cron.
Известная проблема:Скрипт ограничен полными адресами IPv6 и не может использовать сокращенную запись :: (например, 2600:dead:beef:cafe:0:0:0:1 вместо 2600:dead:beef:cafe::1).
Сценарий далек от совершенства, так что будьте любезны. Предлагаю сценарий в надежде, что он окажется вам полезен. :)
решение2
ПроверитьДинамическая переадресация префиксапоскольку в нем есть трюк, при котором можно использовать отрицательные числа в качестве префикса.
Настройтестатическая аренда DHCPv6и добавьте правило пересылки:
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