Firewall: Verständnisfrage zu pf

Sadakazu

Well-Known Member
Ich hoffe ich gehe keinem mit meinen "noobfragen" auf den zwirn.... ^^

Also... ich will mir nen kleinen Server zusammenbasteln....
Soll für mich halt nur als "lernprojekt" dienen und nix wirklich Produktives....

Aktuell hänge ich bei der Firewall fest...
Ich hab jetzt einiges über pf gelesen, aber scheiter schon daran... die komplette hütte außer ssh dicht zu machen....

spätetstens wenn ich pf starte, sperre ich mich selber aus.....

Das hier ist meine aktuelle /etc/pf.conf
Code:
if="{en0}"

set block-policy drop

tcp_pass="{22}"
udp_pass="{22}"
icmp_types="echoreq"

scrub in all
antispoof for $if
table <bruteforce> persist
set skip on en0
block in all
block quick from <bruteforce>
pass in on $if proto tcp from any to any port $tcp_pass flags S/SA keep state (max-src-conn 100, max-src-conn-rate 15/5, overload <bruteforce> flush global)

pass in on $if proto udp to any port $udp_pass keep state
pass out quick all keep state

pass in on $if inet proto icmp all icmp-type $icmp_types keep state

pass in on $if inet proto udp from any to any port 33433 >< 33626

Die sachen habe ich mehr oder weniger aus einem Tutorial von "Server Zeit" abgetippt, und an meine einstellungen entsprechend angepasst....

Sobald ich service pf onestart eingebe flieg ich sofort aus der ssh session und die kiste ist weder über hostnamen noch ip in irgendeiner art und weise erreichbar....

Bitte was mache ich flasch? o0
 
Hast du mal die Regeln mit
Code:
pfctl -nf /etc/pf.conf
überprüft? Sollte man immer vor dem Laden machen.
Außerdem: du setzt skip auf en0, nutzt das Interface aber bei deinen Regeln. IMHO sollte da gar nichts passieren.

Rob
 
bezüglich skip... ja stimmt habs auf lo0 gesetzt....
die eingabe von pfctl ergibt gar nix... also null rückmeldungen....
Nachdem ich jetzt auf lo0 gestellt hab und pf nochmal einmalig gestartet hab... siehe da... ich flieg trotzdem noch raus :D

ich hab auch mal die config aus der wiki abgetrippt und angepasst.... aber da ist das selbe problem....
sobald ich pf starte... flieg ich raus und kann die kiste auch nicht mehr ansprechen....
 
Eine einfach Regel für PF sieht wie folgt aus:
Code:
# --- INTERFACES
lan = en0

# --- SERVICES
host_ports_open = "{ 22 }"

# --- ALLGEMEIN
set skip on lo0
scrub in on $lan all fragment reassemble

# --- START PF RULE
block in
pass out

# --- $LAN ALLOW PING
pass in quick on $lan inet proto icmp all icmp-type echoreq

# --- $LAN ALLOW SSH to HOST
pass in quick on $lan proto tcp from any to $lan port $host_ports_open

Die ganzen anderen Sachen wie "antispoof" oder "flags S/SA keep state" solltest du erst mal lassen und verstehen. Bei PF gibt es auf jedem Interface eine IN und OUT Regel nicht wie bei IPtables!

Gruss
 
@Sadakazu
Code:
if="{en0}"
Diese Schreibweise für Interfaces habe ich noch nie gesehen. Kann sein, dass das klappt, aber wenn Du eh nur eines hast, schreib es doch einfach mal als
Code:
if="en0"
Ansonsten kann ich foxits Empfehlung nur unterstützen: Versuche es erst einmal einfacher. Ich würde zum Testen z.B. dies hier mal weglassen "flags S/SA keep state (max-src-conn 100, max-src-conn-rate 15/5, overload <bruteforce> flush global)". Es sollte nicht für Deine Probleme verantwortlich sein, aber je komplizierter Deine Regeln, desto schwieriger ist es, den Fehler zu finden.

Noch ein letzter Hinweis: Wenn man PF-Tutorials im Internet findet, muss man aufpassen, für welches OS bzw. welche Version es ist. PF in FreeBSD ist noch auf dem Stand von OpenBSD 4.5, wenn ich mich recht erinnere. Seitdem gab es div. Neuerungen und auch Syntax-Änderungen in OpenBSD's PF.

Die immer wieder gern empfohlenen PF-FAQs in der Version von OpenBSD 4.5, kannst Du Dir noch per CVS ziehen (dieser tolle Tipp stammt von hier https://srobb.net/pf.html):
Code:
cvs -d anoncvs@anoncvs1.ca.openbsd.org:/cvs get -D "May 2, 2009" www/faq/pf
 
Scheint aber auch ein fehler zu haben....
letzte zeile....
soweit ich sie verstehe heißt sie ja nichts weiter wie....

Lasse rein an $lan (also en0) protocoltyp tcp von any (alle ip und hostadressen) an $lan ports $host.... also 22....
Bekomme ich aber fehlermeldung...
Code:
/etc/pf.conf:19: could not parse host specification

@SolarCatcher ich hatte mich an dieses tutorial orrientiert....
http://serverzeit.de/tutorials/firewall
 
Warum so kompliziert?

pf und pflog in /etc/rc.conf aktivieren:
echo 'pf_enable="YES"' >> /etc/rc.conf
echo 'pflog_enable="YES"' >> /etc/rc.conf
reboot
# oder Kernel-Module laden...

Ein Basis-Regelsatz in der /etc/pf.conf könnte so aussehen:
ext_if = "en0"
icmp_types = "echoreq"

set skip on lo0
scrub in all
antispoof for ext_if$

block return in log on $ext_if all
pass in on $ext_if inet proto icmp all icmp-type $icmp_types
pass in on $ext_if inet proto tcp from any to any port 22
pass out all


Mit
pfctl -f /etc/pf.conf
pfctl -sr

laden und aktivieren und gucken, was pfctl daraus gemacht hat. SSH-Login und Ping funktionieren, alle abprallenden Pakete (gut für weitere Experimente) zeigt tcpdump in Echtzeit an:

tcpdump -n -e -ttt -i pflog0

Wenn das sauber funktioniert, Schritt für Schritt weitere Funktionen einbauen und testen.

Hoffe das hilft. :)
 
Lasse rein an $lan (also en0) protocoltyp tcp von any (alle ip und hostadressen) an $lan ports $host
Wenn du das so eingetragen hast, ist es falsch! Du hast ...$lan ports $host es sollte aber $lan port $host_ports_open heissen!

Kopier das File und versuch erst mal PF zu deaktivieren:
Code:
pfctl -d
Dann die Configuration testen:
Code:
pfctl -nf /etc/pf.conf
Danach aktivieren:
Code:
pfctl -f /etc/pf.conf
 
zum einen.... den fehler mach ich jetzt nicht nochmal pf_enable in die rc.conf zu tackern :D
Hat mich beim letzten mal ne vollständige neuinstallation gekostet... :D (komm ja nur via SSH auf die kiste...)

pass in on $ext_if inet proto icmp all icmp-type $icmp_types
pass in on $ext_if inet proto tcp from any to any port 22
erste zeile ist ja für den ping richtig?
zweite zeile ist ja im prinzip das gleiche wie das was foxit gepostet hat nur mit dem unterschid das inet noch angegeben wurde....

@foxit ne natürlich hab ich das nicht so rein geschrieben...
Es war die übersetzung wie ich diese zeile verstehe....
pass in quick on.... Lasse rein an
$lan ... Variable der netzwerkschnittstelle also en0
proto tcp ... tcp protokoll
from any ... von jeder adresse...
to $lan port $host_ports_open.... an netzwerkschnittstelle vom port $host_ports_open also port 22

oder habe ich da etwas missverstanden?

Ich hab sogar (um tippfehler jetzt auszuschließen) copy&paste verwendet...
Nach pfctl -nf /etc/pf.conf bekomme ich die o.g fehlermeldung
Code:
/etc/pf.conf:19: could not parse host specification

EDIT
So hab grad mal mipl's vorschlag übernommen.....
1.) da kommt keine fehlermeldung nach pfctl -nf /etc/pf.conf
2.) bleibt die session erhalten wenn ich sevice pf onestart eingebe
3.) bleibt auch tatsächlich der ssh port für neue verbindungen offen....

Was mich zur frage führt... warum?
Code:
pass in quick on $lan proto tcp from any to $lan port $host_ports_open
sieht vom prinzip aus genau wie
Code:
pass in on $ext_if inet proto tcp from any to any port 22

nur der unterschied... es fehlt bei der funktionierenden variante quick dafür ist noch inet hinzugekommen....
 
PF rattert normalerweise alle Zeilen der pf.conf bis zum Ende durch, die letzte zutreffende Regel gewinnt. Trifft jedoch eine "quick-Regel" zu, wird die weitere Verarbeitung sofort abgebrochen. Das beschleunigt die Ausführung und verhindert, dass eine spätere Regel angewandt wird.

Ohne "inet" sind IPv4 und IPv6 gemeint, "inet" ist explizit IPv4, "inet6" ist explizit IPv6". Mein "inet" könntest Du also auch weglassen... ;)

Alle Optionen sind in man 5 pf.conf erklärt, online leichter zu lesen/durchsuchen unter https://www.freebsd.org/cgi/man.cgi?query=pf.conf&sektion=5
 
ooohhkaayyy... also quick besser meiden?
ABER...
Ich hab jetzt mal einen anderen dienst (webmin) installiert, den port aber dicht gelassen....
Witzigerweise komm ich trotzdem auf das Webfrontend..... von Webmin so gewollt? Oder funktioniert die Firewall doch nicht so richtig? ^^
 
Ich hab mir jetzt das Buch von dem Typen von Serverzeit gekauft....
Da wird das Thema Firewall ein bisschen intensiver abgehandelt wie auf seiner tutorial seite (die sowieso auf Freebsd 7 oder 8 aufbaut)
Der Abschnitt über die Firewall ist zwar recht umfassend, aber leider geht er nicht wirklich ins detail und verweißt auch nur auf die Onlinedokumentation von pf.....

ABER....
Ich hab jetzt ne recht umfangreiche pf.conf angelegt, und dort auch - für die zukunft - Jails berücksichtigt...
Soweit läuft pf jetzt erstmal und ich hab immernoch zugriff drauf... ^^ also scheint es ja zu funktionieren...

die /etc/rc.conf hab ich auch schon umgeschrieben das pf mit dem systemstart mitgestartet wird und den cronjob der als Airbag fungierte ist gelöscht... ;)
 
Zurück
Oben