Erste Schritte mit pf, bitte um Kritik

buebo

Well-Known Member
Moin,
ich bin gerade dabei meinen Router einzurichten und habe damit zum ersten mal mit pf zu tun, wenn jemand an den Regeln etwas auffällt mag er sich bitte melden.
Meine Anforderungen sind folgende:
Zwei Interne Subnets, bestehend aus einem "grünen" Netz in dem keine Services Angeboten werden und einer DMZ in der ein Apache, ein Donkey und so das Übliche läuft, die ganze DMZ besteht in dem Fall aus einem Server.

Die Rechner im grünen Netz sollen dabei auf die DMZ zugreifen und ins Internet dürfen ausserdem soll ihnen ssh auf den Router erlaubt werden.
Die DMZ soll nicht ins interne Netz dürfen, aber ins Internet, ssh auf den Router soll von der DMZ aus auch verboten sein.

Aufgebaut ist der Regelsatz im Wesentlichen auf der OpenBSD als Router Anleitung und dem Artikel "Securing Small Networks with OpenBSD Part 3.
Soweit der Vorrede, hier die Regeln:

Code:
Ext = "tun0" 
Int = "rl0"
DMZ = "dc0"

# Die Interfaces stimmen, da bin ich schon mal sicher ;-)
# rl0 hat die IP 192.168.0.1
# dc0 hat die IP 192.168.1.1

IntNet = "192.168.0.0/24"
RouterIP = "192.168.0.1"
Loop = "lo0"
DMZNet = "192.168.1.0/24"

NoRoute = "{ 127.0.0.1/8, 172.16.0.0/12, 10.0.0/8, 255.255.255.255/32 }"

AdminServices = " { ssh, auth } "
GoodServices = " { www, ftp } "

# Optionen
set loginteface { $Ext, $DMZ }
set optimization aggressive
scrub in on  $Ext all fragment reassemble
#Frage: würde es etwas bringen hier auch noch $DMZ anzugeben? 
# ich gehe eigentlich ja nich davon aus das auf dem Weg von $DMZ zu $Int was fragmentiert wird...

#NAT
nat on $Ext from { $IntNet, $DMZNet } to any -> $Ext static-port

#Redirections
#erstens der Esel:
rdr on $Ext proto tcp from any to any port 4661:4662 -> $DMZ port 4661:*
rdr on $Ext proto udp from any to any port 4665 -> $DMZ port 4665
rdr on $Ext proto udp from any to any port 4672 -> $DMZ port 4672

#Die andere Server
rdr on $Ext proto tcp from any to any port $GoodServices -> $DMZ

rdr-anchor redirect

#Regeln
block out on $Ext all
block in on $Ext all

block return-rst out log on $Ext proto tcp all
block return-rst in log on $Ext proto tcp all
block return-icmp out log on $Ext proto udp all
block return-icmp in log on $Ext proto udp all

pass in quick on Loop
pass out quick on Loop

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 inet from $NoRoute to any
block in log quick on $Ext inet from any to $NoRoute

pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state

pass in quick on $Ext inet proto tcp from any to any port { $AdminServices, $GoodServices } flags S/SAFR keep state label Services

# Was heisst denn das Flag eigentlich (Die Regel stammt aus dem HowTo)?

# Hier versuche ich die DMZ daran zu hindern ins interne Netz zu kommen,
#während das Interne Netz ohne Probs in die DMZ rein darf

pass in quick on $DMZ from $IntNet to $DMZNet keep state
block in log quick on $DMZ from $DMZNet to $IntNet
block in log quick on $DMZ from $DMZNet to $RouterIP

anchor passin #falls mir später noch was einfällt ;-)

pass out quick on $Ext all keep state

Bis jetzt habe ich die Regeln noch nicht im Einsatz, da ich erst mal die Meinung der Damen und Heren Experten einholen wollte.
Schreibfehler stehen unter der BSD-License und dürfen mit nach Hause genommen werden (sehr zutraulich die Kleinen)
Ein Herzliches Dankeschön an alle die sich hier durch wühlen!

buebo
 
Was fürn OBSD ist das ? 3.2/3.3 ?
Code:
DMZNet = "192.168.1.0/24"
wenn der rechner nur alleine im netz ist, könnte mann da direkt die IP von dem angeben. :D ?

Code:
set loginteface { $Ext, $DMZ }
ich meine man kann nur auf einem interface loggen. nimmt pf das so an?

Code:
pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state
das z.b. hab ich bei mir rausgenommen, iss aber geschmackssache ob du gepingt werden können willst oder nicht.

bei mir habe nich noch folgendes dabei
Code:
# silently drop broadcasts (cable modem noise) 
block in quick on $Ext from any to 255.255.255.255

was die flags angeht bin ich irgenwie auch nicht ganz auf der höhe. Ich meine, das du z.b. mit S/SA und modulate state nur das erste packet das ein connection aufmachen will (SYN) zulässt und alles weitere von der state table regeln lässt. Einzelne Paket die keinen 3way handschake mehr machen z.b. ein einzelnens SYN+ACK oder nur ein ACK Packet werden nicht durchgelassen. Sicher bin ich mir da allerdings nicht.

gruss
 
Zuletzt bearbeitet:
Ich bin natürlich wieder am basteln, verstehe aber grade nicht was pfctl gegen folgende Einträge in meiner pf.conf einzuwenden hat:

Code:
pass in quick on $Int from $IntNet to $DMZNet all keep state
block in quick on $DMZ from $DMZNet to { $RouterIP, $IntNet } 
anchor passin

Die Interfaces werden am Beginn der Datei Gesetzt:

Code:
##### Variablen und Interfaces
Ext = "tun0"
Int = "rl0"
DMZ = "dc0"
IntNet = "192.168.0.0/24"
DMZNet = "192.168.1.0/24"
RouterInt = "192.168.0.1"
RouterDMZ = "192.168.1.1"
RouterIP = " { 192.168.0.1, 192.168.1.1 } "
Loop = "lo0"

Fehlermeldung ist jeweils "Syntax Error"

buebo
 
Hat sich erledigt, dafür neue Probleme.
1. Die Redirections funktionieren nicht, eigentlich sollten ftp und www auf die jeweiligen Ports von $DMZIP weitergeroutet werden, aber dort kommt nix an.
2. Ich habe noch versucht Queueing einzubauen, aber anscheinen habe ich es geschauft meinen Downstream auf 256k zu setzen, nicht aber mein Upstream effektiver zu regeln.
Im Moment stehe ich vor meiner pf.conf wie der sprichwörtliche Ochs vorm Berg.
Wenn mir also vielleicht jemand einen Schubs in die richtige Richtunge geben könnte.... :-)

Also hier kommt der Salat:
Code:
##### Variablen und Interfaces
Ext = "tun0"
Int = "rl0"
DMZ = "dc0"
IntNet = "192.168.0.0/24"
DMZNet = "192.168.1.0/24"
DMZIP = "192.168.1.2"
RouterInt = "192.168.0.1"
RouterIP = " { 192.168.0.1, 192.168.1.1 } "
Loop = "lo0"


NoRoute = " { 127.0.0.1/8, 172.16.0.0./12, 10.0.0/8, 255.255.255.255/32 } "
AdminServices = " { ssh, auth } "
WebServices = " { ftp, www }"

##### Optionen
set loginterface $Ext
set optimization aggressive
scrub in on $Ext all fragment reassemble

# Queueing
altq on $Ext priq bandwidth 230Kb queue { donkey, web, ssh, ftp, def }
queue donkey priority 1 priq (red)
queue ftp priority 2 priq ( red )
queue web priority 4 priq ( red )
queue ssh priority 5 priq ( red )
queue def priority 3 priq ( default red )

##### Nat Einschalten
nat on $Ext from $IntNet to any -> $Ext static-port
nat on $Ext from $DMZNet to any -> $Ext static-port

##### Redirections
#Edonkey

rdr on $Ext proto tcp from any to any port 4661:4662 -> $DMZIP port 4661:4662
rdr on $Ext proto udp from any to any port 4665 -> $DMZIP port 4665
rdr on $Ext proto udp from any to any port 4672 -> $DMZIP port 4672

# ssh
rdr on $Ext proto tcp from any to any port 7000 -> $DMZIP port 22

# www & ftp
rdr on $Ext from any to any port www -> $DMZIP port www
rdr on $Ext from any to any port ftp -> $DMZIP port ftp

rdr-anchor redirect

##### Rules
# pass in quick on $Loop
# pass out quick on $Loop 

# ssh queueing
pass out on $Ext proto { udp, tcp } from any to any port 22 queue ssh

#eDonkey queueing
pass out on $Ext proto tcp from $DMZNet port 4665 to any queue donkey
pass out on $Ext proto udp from $DMZNet port 4665 to any queue donkey
pass out on $Ext proto udp from $DMZNet port 4665 to any queue donkey

#Webserver queueing
pass out on $Ext proto { tcp, udp } from $DMZNet port www to any queue web
pass out on $Ext proto { udp, tcp } from $DMZNet port 7000 to any queue ssh
pass out on $Ext proto tcp from $DMZNet port ftp to any queue ftp

# gegen Scannen
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

# gegen Ip-Spoofing
block in log quick on $Ext inet from $NoRoute to any
block in log quick on $Ext inet from any to $NoRoute

# kein IPv6
block in log quick inet6 all
block out log quick inet6 all

# ssh (DMZ) zulassen
pass in quick on $Ext inet proto tcp from any to any port 7000

#Webservices zulassen
pass in quick on $Ext inet proto tcp from any to any port $WebServices flags S/SAFR keep state label Services

#ssh und auth aus dem Internet nicht zulassen
block in log quick on $Ext inet proto tcp from any to any port $AdminServices

#Ping aktzeptieren
pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state

#Traffic von $IntNet nach #DMZNet erlauben
pass in quick on $Int from $IntNet to $DMZNet keep state
pass out quick on $DMZ from $IntNet to $DMZNet keep state

# Traffic von $DMZNet nach $IntNet verbieten
block in on $DMZ from $DMZNet to $IntNet

Danke für's Durchschauen im Vorraus!

buebo
 
Zurück
Oben