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:
- Erstellen Sie Ihre Firewall-Regeln mithilfe
PREFIX
des Skripts. - 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