Stefan Bauer
Member
FreeBSD pf with altq support HOWTO
Stefan Bauer (duke at splatterworld dot de)
26. Sept. 2004
FreeBSD mit dem OpenBSD Paketfilter 'pf' und dem Loadbalancing Support 'altq'
Einleitung:
Ausgangspunkt ist ein FreeBSD 5.2.1 System mit einer bestehenden Netzwerkkonfiguration, einem Breitband Internetzugang und ein bereits modifizierter Kernel.
Vorbereitung:
Wir aktualisieren unser System via cvs. Hierzu legen wir uns eine cvs Konfiguration an.
touch /etc/ports-sup
#/etc/ports-sup
*default host=cvsup.de.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
ports-all
Nun lesen wir die Konfiguration ein und erneuern unsere Ports.
cvsup /etc/ports-sup
Nach der erfolgreichen Erneuerung, müssen wir noch unser Index auf den neuesten Stand bringen.
portsdb -Uu
Nun fragen wir alle Ports und den momentan aktuellsten ab.
pkg_version -v | grep needs
Nun bringen wir einen Port auf den neuesten Stand.
portupgrade -rRP <portname>
Ablauf:
Jetzt wo unser System auf dem neuesten Stand ist, bringen wir unserem Kernel pf und altq Unterstützung bei. Wir verwendene hierzu unsere bereits modifizierte Kernel Konfiguration unter /usr/src/sys/i386/conf . In unserem Fall heist die Datei 'RID' .
cd /usr/src/sys/i386/conf
vi RID
Da wir uns jetzt innerhalb der Konfiguration unseres Kernels befinden, fügen wir folgende Zeilen am Ende mit an und speichern diese Datei dann ab. (Achtung, evtl. befinden sich div. benötigte Optionen bereits im Kernel).
#/usr/src/sys/i386/conf/RID
options INET # default
options INET6 # default
options RANDOM_IP_ID
options PFIL_HOOKS
options ALTQ
Nun besitzen wir eine veränderte Konfiguration. Als nächsten Punkt patchen wir die Kernel Sourcen mit altq Unterstützung. Hierzu laden wir uns altq und erstellen uns neue Sourcen für unseren angepassten Kernel mit altq.
cd /usr/src
wget http://www.rofug.ro/projects/freebsd-altq/altq-freebsd-5.2-release-beta2.tar.gz
tar xvfz altq-freebsd-5.2-release-beta2.tar.gz
Jetzt sind wir im Besitz von altq und müssen nurnoch eine neue Umgebung schaffen für unseren Kernel. Hierzu koppieren wir den Verzeichnissbaum /usr/src/sys
mkdir /usr/src/sys.altq
cp -Rf /usr/src/sys/* /usr/src/sys.altq/
Es bestehen jetzt 2 exakt gleiche Verzeichnisse, nur wir halten uns jetzt an /usrc/src/sys.altq für unseren eigenen Kernel mit altq Unterstützung. Jetzt beginnt der eigentliche Patch Vorgang.
cp altq-freebsd-5.2-release-beta2/sys-altq/sys-altq-freebsd-5.2-release.diff /usr/src/sys.altq/
cd /usr/src/sys.altq/
patch -p0 < sys-altq-freebsd-5.2-release.diff
cp -Rf altq-freebsd-5.2-release-beta2/sys-altq/altq /usr/src/sys.altq/
Wir haben nun unsere benötigten Files innerhalb unserer gepatchten Umgebung. Nun erstellen wir unseren angepassten Kernel.
/usr/sbin/config /usr/src/sys.altq/i386/config/RID
cd /usr/src/sys.altq/i386/compile/RID
make depend && make && make install
Wenn jetzt alles geklappt hat, rebooten wir unser System.
shutdown -r now
Sollte alles geklappt haben, ist es jetzt an der Zeit pf und altq zu installieren. Das machen wir wie folgt.
cd /usr/ports/security/pf
make WITH_ALTQ=yes SYS_ALTQ=/usr/src/sys.altq install clean
Jetzt befindet sich auf unserem System pf mit altq. Nun automatisieren wir das und fügen 5 Zeilen Code in unsere rc.conf und speichern das ab.
vi /etc/rc.conf
#/etc/rc.conf
pf_enable="YES"
pf_logd="YES"
pf_conf="/etc/pf.conf"
ifconfig_pflog0="up"
ifconfig_pfsync0="up"
An diesem Punkt erstellen wir eine Standart pf Konfiguration unter /etc/pf.conf , falls diese bereits besteht, löschen wir diese und beginnen mit einer leeren Datei um Komplikationen vorzubeugen und speichern die anschliesend ab.
vi /etc/pf.conf
#/etc/pf.conf
### Grundeinstellungen ###
Ext = "tun0" # Interface an dem das Internet angeschlossen wird
Int = "192.168.0.254" # Interface an dem das eigene Netzwerk angeschlossen ist
IntNet = "192.168.0.0/24" # Adressenbereich des internen Netzes
RouterIP = "192.168.0.1" # IP Adresse des Routers
Loop = "lo0" # Loopback Device
# Adressen die auf dem externen Device nicht geroutet werden
# (Adressbereich des internen Netzes muss man wegen der Weiterleitungen in der unteren Zeile austragen)
table <NoRoute> { 127.0.0.1/8, 172.16.0.0/12, !$IntNet, 10.0.0.0/8, 255.255.255.255/32 }
# Ports die geoeffnet werden sollen
InServicesTCP = "{ ssh, ftp, auth , http}"
### Eigenschaften ###
# Zeichnet Statistiken für die DSL-Verbindung auf (pfctl -s info)
set loginterface $Ext
# Beendet inaktive Verbindungen schneller - niedrigerer Speicherverbrauch
set optimization aggressive
# defragmentierte Pakete saeubern
scrub on $Ext all fragment reassemble random-id
#Loadbalancing / Verteilung der Bandbreite
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !! Achtung: Der unten stehende Wert von 100Kb (Kilobit) ist nur für
# !! den Standard DSL Anschluss mit 128kb Upstream ausgelegt.
# !! Bei einer anderen Leitung muss dieser Wert angepasst werden
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
altq on $Ext priq bandwidth 100Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)
### NAT & FORWARD ###
# NAT aktivieren (unter Linux als Masquerading bekannt)
nat on $Ext from $IntNet to any -> $Ext static-port
### FILTER ###
# Bei Problemen
#pass quick all # Alles darf passieren
# Grundlegende Block Regel
block on $Ext
# Standartmäßig geben wir keinen Ton von uns
block return log on $Ext
# IPV6 unterbinden / verbieten
block quick inet6
# Loopback Device ist alles gestattet
pass quick on $Loop
# macht scannen mit nmap und co zu einem Problem
block in log quick on $Ext inet proto tcp from any to any flags FUP/FUP
block in log quick on $Ext inet proto tcp from any to any flags SF/SFRA
block in log quick on $Ext inet proto tcp from any to any flags /SFRA
block in log quick on $Ext os NMAP
# gefälschte Absenderadressen verhindern (Spoofing)
block in log quick on $Ext inet from <NoRoute> to any
block in log quick on $Ext inet from any to <NoRoute>
# Ping Anfragen akzeptieren (ablehnen wird nicht geraten)
pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state
# Ports nach aussen zur Verfügung stellen
pass in quick on $Ext inet proto tcp from any to any port $InServicesTCP flags S/SAFR keep state label ServicesTCP
anchor passin
# von Innen darf (fast) alles Raus
pass out quick on $Ext keep state queue (q_def,q_pri)
Jetzt sind wir in Besitz einer funktionierenden pf Konfiguration nun sorgen wir noch dafür, dass unsere Regeln bei einer Neueinwahl nicht verloren gehen und erstellen hierzu zwei weitere Dateien und starten unser System anschliesend neu.
vi /etc/ppp/ppp.linkup
#/etc/ppp/ppp.linkup
MYADDR:
! sh -c "/sbin/ifconfig pflog0 up"
! sh -c "/sbin/ifconfig pfsync0 up"
vi /etc/ppp/ppp.linkdown
#/etc/ppp/ppp.linkdown
MYADDR:
! sh -c "/sbin/route delete default"
shutdown -r now
Nach dem letztmaligen Neustart des Systems prüfen wir ob alle Module korrekt geladen wurden und ob unsere Firewall Ihre Dienste leistet.
strings /boot/kernel/kernel|grep -c altq_lookup # bekommen wir einen Wert von 1 zurück lief alles glatt
kldstat|grep pf
Nach diesem Aufruf sollten wir folgende Ausgabe erhalten.
4 3 0xc42bf000 2000 pflog.ko
5 3 0xc42c1000 3000 pfsync.ko
6 2 0xc42c4000 c000 pfaltq.ko
7 1 0xc42e4000 24000 pf.ko
Die Firewallüberwachtung nimmt uns folgende Zeile ab:
pfctcl -s info
Viel Spass mit eurer BSD Box
Dieses HOWTO wurde mit groesster Sorgfalt erstellt. Trotzdem koennen Fehler nicht vollstaendig ausgeschlossen werden.
Ich kann fuer fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung uebernehmen.
Fuer Verbesserungsvorschlaege und Hinweise auf Fehler bin ich dankbar.
Stefan Bauer (duke at splatterworld dot de)
26. Sept. 2004
FreeBSD mit dem OpenBSD Paketfilter 'pf' und dem Loadbalancing Support 'altq'
Einleitung:
Ausgangspunkt ist ein FreeBSD 5.2.1 System mit einer bestehenden Netzwerkkonfiguration, einem Breitband Internetzugang und ein bereits modifizierter Kernel.
Vorbereitung:
Wir aktualisieren unser System via cvs. Hierzu legen wir uns eine cvs Konfiguration an.
touch /etc/ports-sup
#/etc/ports-sup
*default host=cvsup.de.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
ports-all
Nun lesen wir die Konfiguration ein und erneuern unsere Ports.
cvsup /etc/ports-sup
Nach der erfolgreichen Erneuerung, müssen wir noch unser Index auf den neuesten Stand bringen.
portsdb -Uu
Nun fragen wir alle Ports und den momentan aktuellsten ab.
pkg_version -v | grep needs
Nun bringen wir einen Port auf den neuesten Stand.
portupgrade -rRP <portname>
Ablauf:
Jetzt wo unser System auf dem neuesten Stand ist, bringen wir unserem Kernel pf und altq Unterstützung bei. Wir verwendene hierzu unsere bereits modifizierte Kernel Konfiguration unter /usr/src/sys/i386/conf . In unserem Fall heist die Datei 'RID' .
cd /usr/src/sys/i386/conf
vi RID
Da wir uns jetzt innerhalb der Konfiguration unseres Kernels befinden, fügen wir folgende Zeilen am Ende mit an und speichern diese Datei dann ab. (Achtung, evtl. befinden sich div. benötigte Optionen bereits im Kernel).
#/usr/src/sys/i386/conf/RID
options INET # default
options INET6 # default
options RANDOM_IP_ID
options PFIL_HOOKS
options ALTQ
Nun besitzen wir eine veränderte Konfiguration. Als nächsten Punkt patchen wir die Kernel Sourcen mit altq Unterstützung. Hierzu laden wir uns altq und erstellen uns neue Sourcen für unseren angepassten Kernel mit altq.
cd /usr/src
wget http://www.rofug.ro/projects/freebsd-altq/altq-freebsd-5.2-release-beta2.tar.gz
tar xvfz altq-freebsd-5.2-release-beta2.tar.gz
Jetzt sind wir im Besitz von altq und müssen nurnoch eine neue Umgebung schaffen für unseren Kernel. Hierzu koppieren wir den Verzeichnissbaum /usr/src/sys
mkdir /usr/src/sys.altq
cp -Rf /usr/src/sys/* /usr/src/sys.altq/
Es bestehen jetzt 2 exakt gleiche Verzeichnisse, nur wir halten uns jetzt an /usrc/src/sys.altq für unseren eigenen Kernel mit altq Unterstützung. Jetzt beginnt der eigentliche Patch Vorgang.
cp altq-freebsd-5.2-release-beta2/sys-altq/sys-altq-freebsd-5.2-release.diff /usr/src/sys.altq/
cd /usr/src/sys.altq/
patch -p0 < sys-altq-freebsd-5.2-release.diff
cp -Rf altq-freebsd-5.2-release-beta2/sys-altq/altq /usr/src/sys.altq/
Wir haben nun unsere benötigten Files innerhalb unserer gepatchten Umgebung. Nun erstellen wir unseren angepassten Kernel.
/usr/sbin/config /usr/src/sys.altq/i386/config/RID
cd /usr/src/sys.altq/i386/compile/RID
make depend && make && make install
Wenn jetzt alles geklappt hat, rebooten wir unser System.
shutdown -r now
Sollte alles geklappt haben, ist es jetzt an der Zeit pf und altq zu installieren. Das machen wir wie folgt.
cd /usr/ports/security/pf
make WITH_ALTQ=yes SYS_ALTQ=/usr/src/sys.altq install clean
Jetzt befindet sich auf unserem System pf mit altq. Nun automatisieren wir das und fügen 5 Zeilen Code in unsere rc.conf und speichern das ab.
vi /etc/rc.conf
#/etc/rc.conf
pf_enable="YES"
pf_logd="YES"
pf_conf="/etc/pf.conf"
ifconfig_pflog0="up"
ifconfig_pfsync0="up"
An diesem Punkt erstellen wir eine Standart pf Konfiguration unter /etc/pf.conf , falls diese bereits besteht, löschen wir diese und beginnen mit einer leeren Datei um Komplikationen vorzubeugen und speichern die anschliesend ab.
vi /etc/pf.conf
#/etc/pf.conf
### Grundeinstellungen ###
Ext = "tun0" # Interface an dem das Internet angeschlossen wird
Int = "192.168.0.254" # Interface an dem das eigene Netzwerk angeschlossen ist
IntNet = "192.168.0.0/24" # Adressenbereich des internen Netzes
RouterIP = "192.168.0.1" # IP Adresse des Routers
Loop = "lo0" # Loopback Device
# Adressen die auf dem externen Device nicht geroutet werden
# (Adressbereich des internen Netzes muss man wegen der Weiterleitungen in der unteren Zeile austragen)
table <NoRoute> { 127.0.0.1/8, 172.16.0.0/12, !$IntNet, 10.0.0.0/8, 255.255.255.255/32 }
# Ports die geoeffnet werden sollen
InServicesTCP = "{ ssh, ftp, auth , http}"
### Eigenschaften ###
# Zeichnet Statistiken für die DSL-Verbindung auf (pfctl -s info)
set loginterface $Ext
# Beendet inaktive Verbindungen schneller - niedrigerer Speicherverbrauch
set optimization aggressive
# defragmentierte Pakete saeubern
scrub on $Ext all fragment reassemble random-id
#Loadbalancing / Verteilung der Bandbreite
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !! Achtung: Der unten stehende Wert von 100Kb (Kilobit) ist nur für
# !! den Standard DSL Anschluss mit 128kb Upstream ausgelegt.
# !! Bei einer anderen Leitung muss dieser Wert angepasst werden
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
altq on $Ext priq bandwidth 100Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)
### NAT & FORWARD ###
# NAT aktivieren (unter Linux als Masquerading bekannt)
nat on $Ext from $IntNet to any -> $Ext static-port
### FILTER ###
# Bei Problemen
#pass quick all # Alles darf passieren
# Grundlegende Block Regel
block on $Ext
# Standartmäßig geben wir keinen Ton von uns
block return log on $Ext
# IPV6 unterbinden / verbieten
block quick inet6
# Loopback Device ist alles gestattet
pass quick on $Loop
# macht scannen mit nmap und co zu einem Problem
block in log quick on $Ext inet proto tcp from any to any flags FUP/FUP
block in log quick on $Ext inet proto tcp from any to any flags SF/SFRA
block in log quick on $Ext inet proto tcp from any to any flags /SFRA
block in log quick on $Ext os NMAP
# gefälschte Absenderadressen verhindern (Spoofing)
block in log quick on $Ext inet from <NoRoute> to any
block in log quick on $Ext inet from any to <NoRoute>
# Ping Anfragen akzeptieren (ablehnen wird nicht geraten)
pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state
# Ports nach aussen zur Verfügung stellen
pass in quick on $Ext inet proto tcp from any to any port $InServicesTCP flags S/SAFR keep state label ServicesTCP
anchor passin
# von Innen darf (fast) alles Raus
pass out quick on $Ext keep state queue (q_def,q_pri)
Jetzt sind wir in Besitz einer funktionierenden pf Konfiguration nun sorgen wir noch dafür, dass unsere Regeln bei einer Neueinwahl nicht verloren gehen und erstellen hierzu zwei weitere Dateien und starten unser System anschliesend neu.
vi /etc/ppp/ppp.linkup
#/etc/ppp/ppp.linkup
MYADDR:
! sh -c "/sbin/ifconfig pflog0 up"
! sh -c "/sbin/ifconfig pfsync0 up"
vi /etc/ppp/ppp.linkdown
#/etc/ppp/ppp.linkdown
MYADDR:
! sh -c "/sbin/route delete default"
shutdown -r now
Nach dem letztmaligen Neustart des Systems prüfen wir ob alle Module korrekt geladen wurden und ob unsere Firewall Ihre Dienste leistet.
strings /boot/kernel/kernel|grep -c altq_lookup # bekommen wir einen Wert von 1 zurück lief alles glatt
kldstat|grep pf
Nach diesem Aufruf sollten wir folgende Ausgabe erhalten.
4 3 0xc42bf000 2000 pflog.ko
5 3 0xc42c1000 3000 pfsync.ko
6 2 0xc42c4000 c000 pfaltq.ko
7 1 0xc42e4000 24000 pf.ko
Die Firewallüberwachtung nimmt uns folgende Zeile ab:
pfctcl -s info
Viel Spass mit eurer BSD Box
Dieses HOWTO wurde mit groesster Sorgfalt erstellt. Trotzdem koennen Fehler nicht vollstaendig ausgeschlossen werden.
Ich kann fuer fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung uebernehmen.
Fuer Verbesserungsvorschlaege und Hinweise auf Fehler bin ich dankbar.