pf mit ALTQ Support Howto

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.
 
Hi,

Danke schon einmal, das hilft bei der geplanten Umstellung meinerseits. Ein paar Fragen jedoch:

1) Wieso machst du ein Portupgrade von was nicht definiertem?
2) Ich meine Altq ist doch bereits fuer die meisten NICs direkt implementiert und braucht keinen Patch. Oder irre ich mich da jetzt?

Gruss, I.MC
 
nunja,

1, der portupgrade sollte nach eigenem ermessen das eigene system auf den neuesten stand bringen, was bei wem in welcher version vorliegt und erneuert werden muss, sollte jeder selbst bestimmen.

2, meines wissens liegt pf momentan auch nur als modul vor das selbige gilt für pf.

--> pf_freebsd-2.03 - /usr/ports/security/pf - OpenBSD pf as a kldmodule
 
Wer nicht auf 5.2 angewiesen ist, sondern 5.3 verwendet, hat die Möglichkeit pf und ALTQ ohne Ports zu verwenden da es im Kernel integriert ist. ;)
 
wenn 5.3 mal an stabilität zugenommen hat und aus dem beta stadium raus ist, ist es durchaus denkbar auf 5.3 umzusteigen, aber bis dahin ist 5.2 der stand der dinge.
 
Die Übersichtlichkeit würde noch gesteigert werden, wenn du Formatierungs -und Codeflags nutzen würdest.

Oder es wird gleich im Wiki als HTML formatiert...

Ansonsten klasse Arbeit!
 
Stefan Bauer schrieb:
2, meines wissens liegt pf momentan auch nur als modul vor das selbige gilt für pf.
Auszug aus dem Makefile des pf Ports...

.if ${OSVERSION} > 502105
IGNORE= "pf moved to the base system, please build it from there"
.endif

Geht also ab FreeBSD > 5.2.1 nicht mehr aus den Ports.

Gruss, I.MC
 
danke für die aufklärung, hier lag nen kleines missverständnis meinerseits vor. die unterstützung für altq muss in den kernel gepatched werden. das wird vermutlich ab 5.3 fest mit einfliesen.
 
Zurück
Oben