pf: Router einrichten

Columbo0815

Kaffeemann
Teammitglied
Moin,

ich bin gerade dabei mich ein wenig in pf einzuarbeiten. Folgendes Szenario: Ich habe einen FreeBSD 10.3-Rechner, der als Standardgateway dienen soll. Da der Aufbau ein wenig komplexer wird (zumindest für mich), würde ich Schritt für Schritt vorgehen wollen, weil das dann für mich leichter verständlich ist. Sobald das alles fertig ist, bin ich auch gerne bereit einen wiki-Artikel zu schreiben.

Als Ausgangsconfig nehme ich /usr/share/examples/pf/faq-example1, welche ich an meine Gegebenheiten anpasse. Zusatzkommentare für hier kennzeichne ich mit ##: Der Übersichtlichkeit wegen habe ich erstmal eine Minimalkonfig übernommen.
Code:
# macros
ext_if="em1"
int_if="em0"

# tcp_services="{ 22, 113 }"
## ssh brauche ich nicht von extern. Was macht Port 113 (auth)?

icmp_types="echoreq"

# options
set block-policy return
set loginterface $ext_if

set skip on lo

# scrub
scrub in

# nat/rdr
nat on $ext_if inet from !($ext_if) -> ($ext_if:0)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"

# filter rules
block in

pass out

anchor "ftp-proxy/*"

antispoof quick for { lo $int_if }

pass in inet proto icmp all icmp-type $icmp_types
pass quick on $int_if no state
Soweit funktioniert natürlich alles. Kommen wir zum ersten Schritt. Auf dem Router läuft ein OpenVPN, der von extern erreichbar sein soll. Dies habe ich wie folgt ermöglicht (natürlich an den korrekten Stellen hinterlegt):
Code:
udp_services="{ openvpn }"
pass in on $ext_if inet proto udp from any to ($ext_if) port $udp_services
Danach kann der VPN-Client die Verbindung aufbauen. Nächster Schritt und damit die erste Frage bevor ich mit den weiteren Schritten fortfahre: Die Clients sollen nicht nur pingen können (was wohl per "pass in inet proto icmp all icmp-type $icmp_types" ermöglicht wird), es soll auch eine rdp-Verbindung aufgebaut werden können. Ich dachte an:
Code:
vpn_if="tun0"
pass in on $vpn_if inet proto tcp from any to $int_if port rdp
Das funktioniert aber nicht, die Verbindung wird abgelehnt. Nehme ich "block in" raus, funktioniert es natürlich. Ich tippe auf einen Denkfehler/Leichtsinnsfehler. Nur wo ist der?
pflog (was ich testweise aktiviert habe), sagt mir folgendes:
Code:
00:00:04.968495 rule 0..16777216/0(match): block in on tun0: 10.8.0.10.25458 > 192.168.1.200.3389: Flags [S], seq 221194745, win 65535, options [mss 1368,nop,wscale 6,sackOK,TS val 519017793 ecr 0], length 0

Gruß
 
Wusste ich es doch.. Ein Leichtsinnsdenkfehler. Klar. Die Regel sagt, dass ich nur auf $int_if darf. Das ist nur das Device, über das die rdp-Anfrage raus soll. Ich habe das jetzt umgestellt, es funktioniert wie gewollt. Das hat für einige Klarheit gesorgt, danke! Ich baue jetzt mal darauf auf, der nächste Schritt folgt in Kürze.

Unabhängig davon: Wenn du/ihr Angaben seht, die man sinnvoll ergänzen könnte, gerne. So Sachen wie "keep-state" etc, habe ich noch nicht vollständig verstanden.

Gruß und Danke
 
Du kannst auch '$int_if:network' verwenden.

Achja, 113/tcp ist identd(8) - braucht man je nach Setup fuer einige IRC-Netzwerke.

keep-state kuemmert sich in erster Linie darum, dass "Antwortpakete" automatisch durchgelassen werden.
 
Zurück
Oben