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).