Praxis: Konfiguration von IEEE-802.1q-VLANs mit einem EdgeRouter X

von Frank Rocholl am Sonntag, 14. April 2019

Netzwerksegmentierung ist auch im Heimnetzwerk ein großes Thema. Gerade in Zeiten der zunehmenden Vernetzung von Geräten, die bekannterweise Sicherheitsprobleme haben (wie z.B. IP-Kameras). Diese Geräte möchte man von der wichtigen Infrastruktur abschotten.

VLANs sind hier eine wichtige Komponente.

In unserer Mailingliste habe ich einige Fragen zum Setup vom IEEE 802.1q-VLANs und zu Erfahrungen mit einem speziellen, sehr günstigen Router von Ubiquiti gestellt.

Die Konfiguration ist mir im stillen Kämmerlein nicht auf Anhieb geglückt.

Die offenen Fragen konnte ich jedoch direkt auf dem Aprilstammtisch klären. Ich habe einfach die Hardware mit in die Kneipe genommen und wir haben diese gemeinsam erfolgreich konfiguriert. Super.

Hier ein Techblog zu den Details der Konfiguration und ein paar weiteren Ergebnisse.

Anforderungen

Ziel war die Erstellung einer lauffähigen IEEE 802.1q-VLAN-Konfiguration mit einem Zyxel GS1200-8 managed Switch und einem Ubiquity Edge-Router X. Im VLAN20 sollten die weniger vertrauenswürdigen Geräte, wie IP-Kameras, stehen. Im VLAN10 stehen eher vertrauenswürdige Geräte. Die VLANs sollen über Firewall Regeln miteinander sprechen können. Das VLAN20 sollte keinen direkten Zugriff ins Internet haben.

Hier das Komponentendiagramm (plantuml-Quellcode).

VLAN-Komponentendiagramm

Konfiguration des Switches

Der Zyxel GS1200-8 Switch kann per Webinterface konfiguriert werden. Im Auslieferungszustand besitzt er die IP Adresse 192.168.1.3. Im Switch sind die VLANs wie folgt einzustellen.

GS1200-VLAN-Setup

Leider kann man die Konfiguration bei diesem Switch nur als Binary abspeichern. Auch müssen dieselben VLAN-IDs an mehreren Stellen eingegeben werden, was für den Anfänger etwas verwirrend ist. Ist er aber einmal konfiguriert, tut er was er soll.

Konfiguration Ubiquity EdgeRouter X

Der EdgeRouter X ist für wenig Geld zu haben und liefert eine klicky-bunty Web-Schnittstelle. Er kann jedoch auch über die Kommandozeile, in einer eigenen Sprache, konfiguriert werden. Unter der Haube steckt ein Linux.

Es können Netze, DHCP-Server, Firewalls etc. konfiguriert werden. Trotz der Weboberfläche kann die Konfiguration schnell knifflig werden. Das liegt jedoch am Thema bzw. an der Vorbildung :-).

Sehr schön ist, dass man die Konfiguration als Tarball exportieren kann. Packt man diese aus, so erhält man sehr, sehr wenige ASCII-Dateien, die man schön versionieren kann. Nur so konnte ich beispielsweise erkennen, welche Änderungen ein Konfigurationswizard im Detail gemacht hat.

Anbei die Konfiguration des oben beschriebenen Anwendungsfalls.

firewall {
    all-ping enable
    broadcast-ping disable
    ipv6-receive-redirects disable
    ipv6-src-route disable
    ip-src-route disable
    log-martians enable
    name VLAN20_IN {
        default-action drop
        description "Filter VLAN20"
        rule 1 {
            action accept
            description ALLOW_ICMP
            log disable
            protocol icmp
        }
        rule 2 {
            action accept
            description ALLOW_SSH_TO_VLAN10
            destination {
                address 192.168.10.0/24
                port 22
            }
            log disable
            protocol tcp
            source {
                address 192.168.20.0/24
            }
        }
    }
    name VLAN20_LOCAL {
        default-action drop
        description ""
        rule 1 {
            action accept
            description ALLOW_ICMP
            log disable
            protocol icmp
        }
        rule 2 {
            action accept
            description ALLOW_DNS
            destination {
                port 53
            }
            log disable
            protocol tcp_udp
        }
    }
    name WAN_IN {
        default-action drop
        description "WAN to internal"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_LOCAL {
        default-action drop
        description "WAN to router"
        rule 10 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    receive-redirects disable
    send-redirects enable
    source-validation disable
    syn-cookies enable
}
interfaces {
    ethernet eth0 {
        address 192.168.11.1/24
        description "Local 2"
        duplex auto
        speed auto
    }
    ethernet eth1 {
        address dhcp
        description Internet
        duplex auto
        firewall {
            in {
                name WAN_IN
            }
            local {
                name WAN_LOCAL
            }
        }
        speed auto
    }
    ethernet eth2 {
        description Local
        duplex auto
        speed auto
        vif 10 {
            address 192.168.10.1/24
            description VLAN10
            mtu 1500
        }
        vif 20 {
            address 192.168.20.1/24
            description VLAN20
            firewall {
                in {
                    name VLAN20_IN
                }
                local {
                    name VLAN20_LOCAL
                }
            }
            mtu 1500
        }
    }
    ethernet eth3 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth4 {
        description Local
        duplex auto
        poe {
            output off
        }
        speed auto
    }
    loopback lo {
    }
    switch switch0 {
        address 192.168.2.1/24
        description Local
        mtu 1500
        switch-port {
            interface eth3 {
            }
            interface eth4 {
            }
            vlan-aware disable
        }
    }
}
service {
    dhcp-server {
        disabled false
        hostfile-update disable
        shared-network-name LAN2 {
            authoritative disable
            subnet 192.168.2.0/24 {
                default-router 192.168.2.1
                dns-server 192.168.2.1
                lease 86400
                start 192.168.2.21 {
                    stop 192.168.2.240
                }
            }
        }
        shared-network-name VLAN10 {
            authoritative disable
            subnet 192.168.10.0/24 {
                default-router 192.168.10.1
                dns-server 192.168.10.1
                lease 86400
                start 192.168.10.20 {
                    stop 192.168.10.50
                }
            }
        }
        shared-network-name VLAN20 {
            authoritative disable
            subnet 192.168.20.0/24 {
                default-router 192.168.20.1
                dns-server 192.168.20.1
                lease 86400
                start 192.168.20.20 {
                    stop 192.168.20.140
                }
            }
        }
        static-arp disable
        use-dnsmasq disable
    }
    dns {
        forwarding {
            cache-size 150
            listen-on eth0
            listen-on switch0
            listen-on eth2.10
            listen-on eth2.20
        }
    }
    gui {
        http-port 80
        https-port 443
        older-ciphers enable
    }
    nat {
        rule 5010 {
            outbound-interface eth1
            type masquerade
        }
    }
    ssh {
        port 22
        protocol-version v2
    }
}
system {
    host-name ubnt
    login {
        user ubnt {
            authentication {
                encrypted-password $1$geheim$geheim.
            }
            level admin
        }
    }
    ntp {
        server 1.ubnt.pool.ntp.org {
        }
        server 2.ubnt.pool.ntp.org {
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone UTC
}


/* Warning: Do not remove the following line. */
/* === vyatta-config-version: "config-management@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:
firewall@5:ipsec@5:nat@3:qos@1:quagga@2:suspend@1:system@4:ubnt-pptp@1:ubnt-udapi-server@1:
ubnt-unms@1:ubnt-util@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1" === */
/* Release version: v1.10.9.5166958.190213.1952 */

Benchmark

Ich habe Benchmarktests des Setups mit dem Programm iperf3 durchgeführt. Rechner im selben VLAN am Zyxel Switch lieferten erwartungsgemäß eine Bandbreite vom 940 Mbits/sec. Befinden sich zwei Rechner im selben LAN (switch0, eth3 und eth4) direkt am EdgeRouter X, so erhält man ebenfalls eine Bandbreite von 941 Mbits/sec.

Muss der EdgerRoute-X zwischen IEEE 802.1q VLANs routen (hier VLAN10 und VLAN20), so bricht die Übertragungsgeschwindigkeit auf 168 Mbits/sec ein.

Fazit

Mit beiden Geräten (EdgeRouter X und GS-1200-8) kann man für wenig Geld VLANs und mehr aufsetzen. Natürlich ist die Bandbreite im EdgeRouter X beschränkt. Es handelt sich ja um ein Einsteigermodell. Man muss für sich selbst entscheiden, ob diese Bandbreite für den Anwendungsfall hinreichend ist. Man hat jedenfalls relativ schnell eine Konfiguration stehen.

Eine echte Alternative wäre es aber auch mit diesen Erkenntnissen ein Standard Linux oder OpenBSD aufzusetzen. Hier hätte man noch mehr Freiheitsgrade und befände sich in heimischen Gefilden.

Links