UDM Pro 3: Netzwerktrennung - Teil 1
Dies ist eine aktualisierte Version der ursprünglichen Artikels UDM Pro 1.x: Netzwerktrennung - Teil 1 und bezieht sich auf die UnifiOS Version 3.2.7 mit Unifi Network Version 8.0.26. Mit jedem Update sowohl von UnifiOS als auch der Unifi Network App kann sich das Netzwerk-Setup und die IPv6 Unterstützung grundlegend ändern, so dass die vorgestellten Lösungen nicht mehr funktionieren.
01| Default Segmentierung in UnifiOS
Ich möchte mit der Unifi Dream Machine Pro unter anderem mein internes Netzwerk in unterschiedliche VLANs aufteilen. Die internen Teilnetzwerke sollen untereinander nicht mehr ungefiltert kommunizieren können, damit z.B. die weniger vertrauenswürdigen IoT-Geräte nicht mit anderen internen Systemen kommunizieren können. Da ich im internen Netzwerk auch IPv6 einsetze (siehe auch UDM Pro 1.x: IPv6 hinter einer FRITZ!Box einrichten), muss die Filterung dabei für beide Protokolle sichergestellt werden.
Bei der Dream Machine Pro wird zwischen den drei Sicherheitszonen WAN, LAN und Guest unterschieden. Während den beiden WAN-Interfaces die Sicherheitszone WAN statisch zugewiesen wird, kann bei der Einrichtung des Netzwerks festgelegt werden, ob es sich um LAN- oder Guest-Netzwerk handelt. Wird in den Netzwerkeinstellungen in den erweiterten Einstellungen (Advanced
) die Option Isloation
aktiviert, dann wird ein Guest-Netzwerk angelegt. Ansonsten handelt es sich um ein LAN-Netzwerk:
Um zu verstehen, ob und wie zwischen den unterschiedlichen Netzwerken gefiltert wird, muss zunächst der grundlegende Filtermechanismus der UDM Pro erläutert werden.
01.1| LAN-Netzwerke
Alle VLANs, die einem LAN-Netzwerk zugeordnet sind (im Unifi-Jargon auch Corporate Network genannt), können dabei in der Standardeinstellung ungefiltert miteinander kommunizieren. Sowohl über IPv4 als auch über IPv6:
01.1.1| Trennung der LAN-Netzwerke - IPv4
Um eine manuelle Trennung der LAN-Netzwerke kommt man hier also nicht herum. Das ist für die IPv4-Trennung auch grundsätzlich kein Problem und ist über Firewall-Regeln leicht zu implementieren. Wie das erreicht werden kann findet sich in zahlreichen Anleitungen im Internet. Im Prinzip kann das mit nur einer IP Group und jeweils einer Firewall-Regel für LAN In
und Guest In
umgesetzt werden:
Über dedizierte ACCEPT-Regeln vor der Cleanup-Regeln können dann gezielt Dienste im internen Netzwerk freigegeben werden.
01.1.1| Trennung der LAN-Netzwerke - IPv6
Schwieriger wird es jedoch bei der Trennung auf IPv6-Ebene. Wird vom Provider ein statisches IPv6-Prefix bereitgestellt, so kann dass oben beschriebene Prinzip mit den DROP-/REJECT-Regeln auch für IPv6 umgesetzt werden. Das Prinzip funktioniert allerdings nicht mehr, wenn sich das IPv6-Prefix von Zeit zu Zeit ändert bzw. ändern kann (dynamisches IPv6-Prefix). Damit das Regelwerk dann noch korrekt funktioniert, müssen bei einem Prefix-Wechsel auch die IPv6-Firewall-Regeln angepasst werden. Zwar sind intern für die unterschiedlichen VLAN-Segmente bereits intern entsprechende IP-Sets vorgesehen, diese können in der Web-Oberfläche allerdings nicht verwendet werden. Eine Verwaltung der IPv6-Firewall-Regeln für die Trennung der LAN-Netzwerke mit dynamischen IPv6-PRefixen ist damit nicht wirklich möglich. Zumindest sind alle Versuche und Lösungsvorschläge die ich gefunden habe gescheitert (siehe z.B. Quellen [02] - [05]).
01.2| Guest-Netzwerken
Guest-Netzwerke sind deutlich eingeschränkter. Diese Netze können laut Default-Regeln nicht auf die LAN Netzwerke zugreifen:
01.2.1| Trennung der Guest-Netzwerke - IPv4
Schaut man sich die Regeln per SSH genauer an, so sind im Wesentlichen folgende iptables-Regeln für die Trennung der Guest-Netzwerke von den LAN-Netzwerken auf IPv4 ebene verantwortlich:
Chain UBIOS_GUEST_IN_USER (2 references)
num pkts bytes target prot opt in out source destination
[...]
6 0 0 RETURN all -- any any anywhere anywhere match-set UBIOS_guest_pre_allow dst /* 00000001095216690483 */
7 0 0 DROP all -- any any anywhere anywhere match-set UBIOS_guest_restricted dst /* 00000001095216690484 */
8 0 0 DROP all -- any any anywhere anywhere match-set UBIOS_corporate_network dst /* 00000001095216690485 */
9 0 0 DROP all -- any any anywhere anywhere match-set UBIOS_remote_user_vpn_network dst /* 00000001095216690486 */
[...]
Die in den Regeln genutzten IP-Sets sind bei mir folgendermaßen konfiguriert:
IP-Set | Beschreibung |
UBIOS_guest_pre_allow | Dieses IP-Set war bei mir leer, so dass die iptables-Regel 6 (s.o.) keine Wirkung hat. |
UBIOS_guest_restricted | In diesem IP-Set sind die RFC1918 Adressen (192.168.0.0/16, 10.0.0.0/8, 224.0.0.0/4, 172.16.0.0/12) hinterlegt. Dadurch wird dien Kommunikation aus einem Gast-Netzwerk in alle privaten Netzwerke über iptables-Regel 7 (s.o.) unterbunden. |
UBIOS_corporate_network | Dieses Set beinhaltet die IPv4-Adressbereiche der definierten Corporate-/LAN-Netzwerke. Mit der iptables-Regel 8 wird damit der Datenverkehr zu den LAN-Netzwerken unterbunden. |
UBIOS_remote_user_vpn_network | Dieses IP-Set war bei mir ebenfalls leer und wird wohl nur gefüllt, wenn auch ein VPN eingerichtet wird. Ich gehe davon aus, dass über diese Regel also der Verkehr zu etwaigen VPN-Clients eingeschränkt wird. |
Damit werden die Guest-Netzwerke von LAN-/Corporate-Netzwerken auf IPv4-Ebene ordentlich voneinander getrennt. Der IPv4-basierte Datenverkehr zwischen zwei Guest-Segmenten wird allerdings über die folgenden Regeln zugelassen:
Chain UBIOS_GUEST_IN_USER (2 references)
num pkts bytes target prot opt in out source destination
[...]
11 0 0 RETURN all -- any any 192.168.2.0/24 anywhere /* 00000001095216720481 */
12 85 7512 RETURN all -- any any 192.168.0.0/24 anywhere /* 00000001095216720482 */
13 0 0 RETURN all -- any any anywhere anywhere /* 00000001097364144127 */
Chain UBIOS_GUEST_OUT_USER (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- any any anywhere 192.168.2.0/24 /* 00000001095216720481 */
2 1540 644K RETURN all -- any any anywhere 192.168.0.0/24 /* 00000001095216720482 */
3 0 0 RETURN all -- any any anywhere anywhere /* 00000001097364144127 */
01.2.1| Trennung der Guest-Netzwerke - IPv6
Eine ähnliche Trennung ist auch für IPv6 mittels ip6tables umgesetzt:
Chain UBIOS_GUEST_IN_USER (2 references)
num pkts bytes target prot opt in out source destination
[...]
3 0 0 DROP all any any anywhere anywhere match-set UBIOS_corporate_networkv6 dst /* 00000001095216690487 */
4 0 0 DROP all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br11 dst /* 00000001095216690488 */
5 0 0 DROP all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br5 dst /* 00000001095216690489 */
6 0 0 DROP all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br29 dst /* 00000001095216690490 */
7 0 0 DROP all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br12 dst /* 00000001095216690491 */
8 0 0 DROP all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br20 dst /* 00000001095216690492 */
[...]
In dem IP-Set UBIOS_corporate_networkv6
waren bei mir zwar keine Adressen hinterlegt, aber dafür sind in den Sets UBIOS_NETv6_br1-3
die IPv6-Adressen der LAN-Segmente hinterlegt.
Mit den folgenden RETURN-Regeln wird vergleichbar zur IPv4 Kommunikation auch die Kommunikation zwischen den Guest-Netzwerken zugelassen:
Chain UBIOS_GUEST_IN_USER (2 references)
num pkts bytes target prot opt in out source destination
[...]
11 202 91594 RETURN all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br666 src /* 00000001095216690494 */
12 0 0 RETURN all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br2 src /* 00000001095216690495 */
13 0 0 RETURN all any any anywhere anywhere match-set UBIOS_ALL_NETv6_br666 src /* 00000001095216690496 */
14 0 0 RETURN all any any anywhere anywhere /* 00000001097364144126 */
Damit sind die Guest-Netzwerke zwar von den LAN-Netzwerken getrennt, aber eben nicht untereinander. Soll eines der Guest-Netzwerke also tatsächlich für den Internetzugang für Gäste bereitstellen, so können die Gäste theoretisch auch auf andere Gast-Netzwerke zugreifen in denen beispielsweise die IoT-Geräte untergebracht sind.
02| Zwischenstand
Um eine angemessene Netzwerktrennung auf IPV4 und IPv6 mit dynamischen Prefixen umsetzen zu können, biete die Unifi Network GUI aktuell keine ausreichenden Möglichkeiten. Eine DIY-Lösung ist daher wohl die einzige Lösung.
Es ergeben sich folgende Punkte, die beim Aufbau des Netzwerks zu berücksichtigen sind:
- Eine Trennung der LAN-Netzwerke muss auch mit UnifiOS 3.2.7 noch immer manuell erfolgen. Während das für IPv4 über die GUI zu erreichen ist, ist das bei dynamischen IPV6-Prefixen in der GUI nicht möglich. Hier ist in der aktuellen Version eine Lösung nur mit Scripten zu realisieren. Dabei sollten nach Möglichkeit jedoch immer die Board-Mittel verwendet werden, da bei individuellen Scripten immer die Gefahr besteht, dass diese mit dem nächsten UnifiOS- oder Unifi Network App Update nicht mehr funktionieren und die Netzwerktrennung wieder aufgehoben wird.
- Sollen einzelne Netzwerksegmente möglichst sicher vom internen LAN bzw. den LAN-Netzwerken getrennt werden, so sollte der Netzwerktyp
Guest
verwendet werden. Geräte in diesen Netzwerken sollten auch dann nicht auf Geräte im internen LAN Zugreifen können, wenn das Script z.B. nach einem Firmware-Update nicht mehr korrekt funktioniert. Allerdings lässt sich zwischen den Guest-Netzwerk und dem LAN-Netzwerk der Datenverkehr nur sehr schwer freigeben.
Im nächsten Artikel werde ich zusammenfassen, wie ich das Firewall-Regelwerk angepasst habe, damit eine angemessene Filterung umgesetzt wird
03| Quellen
[01] weberblog.net: Tag Archives: IPv6 Dynamic Prefix
[02] IPv6 Network Segmentation Strategy
[03] IPv6 firewall rules in Unifi controller
[04] Firewall rules for IPv6 hosts with dynamic prefix from ISP
[05] Inbound Firewall rules with DHCPv6-PD
Kommentare