PF Bridge mit VLAN (dot1q) will nicht filtern

morph

Well-Known Member
Folgendes Setup:

Cat4006
Gateway für VLAN 1,2,3
|
|(802.1q)
|
OBSD3.8 Bridge mit pf
|
|(802.1q)
|
Cat2950
VLAN 1,2,3 - Host1, Host2, Host3

BSD Konfiguration:
IP-Forwarding = 1
PF=YES
bridgename.bridge0: add xl0 add xl1 up

Soweit funktioniert das Bridging. Alle Hosts sind in ihren Vlans erreichbar und haben volle Konnektivität. Vlans sind bisher auf OBSD nicht konfiguriert.

Jetzt das Problem:
PF filtert die getaggten VLANS nicht (2 und 3). Traffic lässt sich nur für VLAN1 filtern. VLAN2 und 3 werden komplett ignoriert (tcpdump -nettti zeigt keinen Traffic an).
Die Vermutung liegt wohl sehr nahe, dass ich OBSD irgendwie klar mache, dass da VLANs sind und dass Ganze in bridgename.bridge0 zusammenfügen muss.
Kennt jemand ein funktionierendes Setup dafür?

Bevor mich jetzt jemand fragt, warum ich OBSD nicht zum Router umkonfiguriere: Ich will mir das Transfernetz sparen und an der Netzkonfiguration keine Änderungen vornehmen.
 
Howto:

Wie mache ich aus meiner OpenBSD-Box eine 801.1q-fähige Stealth-Firewall?

Als Basis zum Einrichten einer funktionierenden Bridge kann man das Howto auf www.openbsd.org zu Rate ziehen. Das dort beschriebene Setup ist leicht verständlich und funktioniert sowohl auf Links mit nativen Ethernet-Frames als auch mit 801.1q-Frames.

Soll die so konfigurierte Bridge als Firewall dienen, gibt es jedoch ein paar Dinge zu beachten. Wie man eine Firewall einrichtet, soll hier nicht beschrieben werden, denn dazu gibt es genügend verwertbares Material im Web.


Fall 1: Auf den Nics kommen reine Ethernet-Frames an, die gefiltert werden sollen.

Kein Problem für PF. Die gebridgten Frames werden von bridge0 an PF gegeben und entsprechend den Regeln gefiltert.


Fall 2: VLAN-Traffic (802.1q) soll auf einem Trunk gefiltert werden.

Code:
C|--------------------|        |--------------------|C
A|---VLAN1 untagged---|        |---VLAN1 untagged---|A
T|--------------------|x OBSD x|--------------------|T
4|---VLAN2 802.1q-----|l  PF  l|---VLAN2 802.1q-----|2
0|--------------------|0      1|--------------------|9
0|---VLAN3 802.1q-----|        |---VLAN3 802.1q-----|5
6|--------------------|        |--------------------|0

Voraussetzungen:
1. bridgename.bridge0 existiert (add xl0 add xl1 up)
2. IP-forwarding ist aktiviert
3. PF ist aktiviert
4. pf.conf existiert
5. Clients aus allen Netzsegmenten haben volle Konnektivität

In diesem Fall erstellt man für jedes VLAN zwei Pseudo-Interface auf der OBSD-Box. Eines der beiden Pseudointerface benutzt xl0 als physikalisches Interface, das andere wird auf xl1 gelegt. Damit die Frames von xl0 nach xl1 gelangen, werden die beiden Pseudo-Interface zu einem Bridge-Interface zusammengeschaltet.
VLAN1 (untagged) gelangt über das bereits konfigurierte Bridge0-Interface zum Packetfilter und bedarf deshalb keiner weiteren Anpassungen.

#ifconfig vlan0 create
#ifconfig vlan0 vlan 1 vlandev xl0
#ifconfig vlan1 create
#ifconfig vlan1 vlan 1 vlandev xl1
#ifconfig vlan0 up
#ifconfig vlan1 up
#ifconfig bridge1 create
#brconfig bridge1 add vlan0 add vlan1
#brconfig bridge1 up
#ifconfig vlan2 create
#ifconfig vlan2 vlan 2 vlandev xl0
#ifconfig vlan3 create
#ifconfig vlan3 vlan 2 vlandev xl1
#ifconfig vlan2 up
#ifconfig vlan3 up
#ifconfig bridge2 create
#brconfig bridge2 add vlan2 add vlan3
#brconfig bridge2 up

!!!Die Reihenfolge der Aktivierung spielt hierbei eine große Rolle!!!

Desweiteren ist zu beachten, dass folgende Dateien NICHT existieren, da diese beim Bootvorgang/Ausführen von /etc/netstart die gewünschte Reihenfolge nicht einhalten:

bridgename.bridge1
bridgename.bridge2
hostname.vlan0
hostname.vlan1
hostname.vlan2
hostname.vlan3

Man sollte deshalb das Starten der VLANs und Bridges mit einem separaten Startscript aus rc.conf.local aufrufen.

Wenn das alles wie gewünscht geklappt hat, sollte ein ifconfig -a folgendes zeigen:

Code:
# ifconfig -a
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33224
        groups: lo
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
xl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:57:43:39
        media: Ethernet autoselect (100baseTX full-duplex)
        status: active
        inet6 fe80::20a:5eff:fe57:4339%xl0 prefixlen 64 scopeid 0x2
xl1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:56:e6:45
        media: Ethernet autoselect (100baseTX full-duplex)
        status: active
        inet6 fe80::20a:5eff:fe56:e645%xl1 prefixlen 64 scopeid 0x3
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33224
pfsync0: flags=0<> mtu 1348
enc0: flags=0<> mtu 1536
bridge0: flags=41<UP,RUNNING> mtu 1500
        groups: bridge
vlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:57:43:39
        vlan: 2 parent interface: xl0
        groups: vlan
        inet6 fe80::20a:5eff:fe57:4339%vlan0 prefixlen 64 scopeid 0x2b
vlan1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:56:e6:45
        vlan: 2 parent interface: xl1
        groups: vlan
        inet6 fe80::20a:5eff:fe56:e645%vlan1 prefixlen 64 scopeid 0x2c
bridge1: flags=41<UP,RUNNING> mtu 1500
        groups: bridge
vlan2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:57:43:39
        vlan: 3 parent interface: xl0
        groups: vlan
        inet6 fe80::20a:5eff:fe57:4339%vlan2 prefixlen 64 scopeid 0x2e
vlan3: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:0a:5e:56:e6:45
        vlan: 3 parent interface: xl1
        groups: vlan
        inet6 fe80::20a:5eff:fe56:e645%vlan3 prefixlen 64 scopeid 0x2f
bridge2: flags=41<UP,RUNNING> mtu 1500
        groups: bridge
Hinweis zu den Filterregeln:

VLAN1 wird auf den physikalischen Interfacen xl0 und xl1 erfasst. VLAN2 und VLAN3 erreichen den Paketfilter über die Pseudointerface. Angenommen xl0 ist das externe Interface und xl1 ist das interne Interface. Dann würde die pf.conf im Kopfteil in etwa so aussehen:

$int_if = xl1
$ext_if = xl0
$vint_if = "{ vlan1, vlan3 }"
$vext_if = "{ vlan0, vlan2 }"

Anmerkung:
Mit diesem Setup läuft es jetzt bei mir einwandfrei (VLANs sind natürlich bei mir anders und nur für das Howto übersichtlich auf 1-3 begrenzt). Falls ich irgendwo Fehler gemacht habe, bitte ich um Nachsicht/Korrektur, da ich nicht unbegrenzt Zeit hatte, die Kiste zum laufen zu bekommen (Termindruck).
 
genau das gleiche setup hatte ich eine zeit lang in benutzung.

ich wuerde jedoch vorschlagen, tagged und untagged traffic auf einem physikalischen interface nicht zu mischen - ist nur so ein gefuehl.
 
Das ist eine der Eigenarten von 802.1q. Aus Kompatibilitätsgründen zu älteren Versionen des Spanning-Trees wird im nativen VLAN der Traffic untagged übertragen. Deswegen gibt die Möglichkeit - falls man Sicherheitsbedenken hat - das VLAN1 (default untagged) abzuschalten und als native VLAN zb. VLANxyz zu wählen, was zwar so nicht im Howto steht, aber in meiner realen Konfiguration zum Einsatz kommt.
 
Zurück
Oben