Wie richte ich eine OpenWrt-Verkehrsregel für die Portweiterleitung eines IPv6-Servers in meinem LAN ein?

Wie richte ich eine OpenWrt-Verkehrsregel für die Portweiterleitung eines IPv6-Servers in meinem LAN ein?

Ich möchte eingehenden IPv6-Verkehr auf den Ports 80/443 für einen global routbaren Webserver in meinem Heimnetzwerk zulassen. Wie geht das am besten mit OpenWrt, das standardmäßig eingehenden IPv6-Verkehr blockiert (wie es eine gute Firewall tun sollte)?

Mein ISP (Comcast) weist mir für die Delegierung über DHCPv6 ein /60-Präfix zu. Es ändert sich manchmal. Der Webserver (Ubuntu) erhält über SLAAC vom OpenWrt-Router eine globale IPv6-Adresse.

Gemäßhttps://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6Sie können eine Verkehrsregel einrichten, um diese Art von Datenverkehr zuzulassen:

So öffnen Sie Port 80, sodass ein lokaler Webserver unter 2001:db8:42::1337 vom Internet aus erreicht werden kann:

Konfigurationsregel
        Option src wan
        Option Proto TCP
        Option Ziel-LAN
        Option Ziel-IP 2001:db8:42::1337
        Option Zielport 80
        Optionsfamilie IPv6
        Option Ziel ACCEPT

Einfach genug, außer … die Ziel-IP ist fest codiert!

Wie kann man diese Art von Regel einrichten, wenn sich die Ziel-IP möglicherweise ändert?(aufgrund von Änderungen am delegierten Präfix von meinem ISP). Vermutlich muss es regelmäßig aktualisiert werden... Hat das schon mal jemand versucht und wenn ja, was funktioniert gut/was funktioniert nicht gut?

Antwort1

Ich bin auf dasselbe Problem gestoßen und in eine Sackgasse geraten wie Sie. Ich habe schnell und unkompliziert ein Skript geschrieben, um die Firewall-Änderungen für mich zu automatisieren.

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

So verwenden Sie das Skript:

  1. Erstellen Sie Ihre Firewall-Regeln mithilfe PREFIXdes Skripts.
  2. Planen Sie die Ausführung des Skripts mit cron.

Bekanntes Problem:Das Skript ist auf vollständige IPv6-Adressen beschränkt und kann die Abkürzung :: nicht verwenden. (Zum Beispiel 2600:dead:beef:cafe:0:0:0:1 statt 2600:dead:beef:cafe::1).

Das Skript ist alles andere als perfekt, also seien Sie nachsichtig. Ich biete das Skript in der Hoffnung an, dass Sie es nützlich finden. :)

Antwort2

KasseDynamische Präfixweiterleitungda es einen Trick gibt, bei dem Sie negative Zahlen für das Präfix verwenden können.

Konfigurieren Sie einenstatische DHCPv6-Leaseund fügen Sie eine Weiterleitungsregel hinzu:

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

verwandte Informationen