pf, jail, kein NAT

teisho

Well-Known Member
Hallo zusammen,

ich habe zwei Jails welche jeweils eine öffenltiche IPv6 haben.
Jetzt überlege ich gerade wie die pf.conf dazu aussehen sollte. Kann mir jemand helfen?

Vorschlag:
/etc/pf.conf
Code:
ext_if = "em0"

# Ports for Host 
host_tcp_ports = "{ 2342 }" host_udp_ports = "{ 2342, 60000:61000 }" 

# ICMP
icmp_types = "{ echoreq, unreach }" 
icmp6_types = "{ echoreq, routersol, routeradv, neighbradv, neighbrsol }"

# Jails
foo_jail = "2a01:aa:bb:cc::f00" 
foo_ports = "{ 80, 443 }" 
bar_jail = "2a01:aa:bb:cc::beef"
bar_ports= "{ 25, 465, 993 }"

pass quick on lo0 no state 

block in all 

pass in inet proto tcp to $foo_jail port $foo_ports
pass in inet proto tcp to $bar_jail port $bar_ports

# Host 
pass in inet proto tcp to $ext_if port $host_tcp_ports 
pass in inet proto udp to $ext_if port $host_udp_ports 
pass in inet6 proto tcp to $ext_if port $host_tcp_ports 
pass in inet6 proto udp to $ext_if port $host_udp_ports 

# icmp
pass on $ext_if inet proto icmp all icmp-type $icmp_types keep state 
pass on $ext_if inet6 proto icmp6 all icmp6-type $icmp6_types keep state 

pass out all keep state
 
NAT ist easy, ein Beispiel mit WAN:
Code:
ext_if= "tun0"
int_if= "em0"

set block-policy drop

# Noch mehr policies ...

# Networks.
local_net= "10.0.0.1/8"

# NAT ...
nat on $ext_if inet from $local_net to any -> ($ext_if)

# Alles dicht und Loopback darf "alles".
block log all
pass quick on lo0 all

# Hier sollten die Regeln gesetzt werden, ...
pass out from $ext_if to any keep state

# usw. usf.

Das BSDForenWiki ist (meiner Meinung nach) empfehlenswert:
-> https://wiki.bsdforen.de/howto/ansc...oe_mpd_und_firewall_pf.txt.html?highlight=nat
-> https://wiki.bsdforen.de/howto/dsl-router.txt.html?highlight=nat (ist auf FreeBSD anwendbar bzw. ableitbar)

Aber auch das von @Rakor: http://denkrobat.de/doku.php

Edit: https://elatov.github.io/2011/05/freebsd-firewall-and-nat-with-pf/
 
Hast du das schon so konfiguriert oder sind das rein theoretisch Überlegungen? Ich bin mir nicht sicher, ob das ganze so schon funktionieren könnte. Die Frage ist, Ob das externe Interface von den internen Adressen weiß. Und natürlich ob der Router die Adressen entsprechend routed.
 
Von außen erreichbar kannst Du die Dienste per redirect machen, z.B.
Code:
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port $foo_ports -> $foo_jail
Damit wird aller Traffic der von außen auf den $foo_ports ankommt an die $foo_jail weitergeleitet.

Wie Du aber Traffic von der Jail nach draußen zulassen könntest - ohne NAT - das weiß ich nicht.
 
Wenn die Jails eine öffentliche IP-Adresse haben, muss in meinen Augen genau garnichts an der Firewall gemacht werden, außer den Traffic durchzulassen.

Lass einfach die Schlüsselwörter weg, die die Regeln (z.B. auf IPv4) einengen (pass in from any to $Adresse).

Rob
 
hi

das pass so nicht


muesste inet6 statt inet sein.
alternativ kannst du auch schreiben
Code:
pass in inet6  proto tcp to ($ext_if) port $foo_ports
pass in inet6 proto tcp to ($ext_if) port $bar_ports
Danke. inet6 statt inet ist klar.
Würde damit dann aber nicht auf der foo_jail ebanfalls die Ports für die bar_jail freigegeben werden?
Von außen erreichbar kannst Du die Dienste per redirect machen, z.B.
Code:
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port $foo_ports -> $foo_jail
Damit wird aller Traffic der von außen auf den $foo_ports ankommt an die $foo_jail weitergeleitet.
Würde das auch gehen wenn ich zwei Jails mit jeweils einer eigenen öffentl. IP habe die beide z.B. einen Webserver laufen haben?

Wenn die Jails eine öffentliche IP-Adresse haben, muss in meinen Augen genau garnichts an der Firewall gemacht werden, außer den Traffic durchzulassen.

Lass einfach die Schlüsselwörter weg, die die Regeln (z.B. auf IPv4) einengen (pass in from any to $Adresse).

Rob
Einfach Traffic durch lassen würde doch aber alle Definierten Ports für alle Jails öffnen, richtig?


In meinem Fall wäre es wünschenswert wenn für die foo_jail auch nur die foo_ports offen sind, nicht aber die bar_ports und umgekehrt.
 
Einfach Traffic durch lassen würde doch aber alle Definierten Ports für alle Jails öffnen, richtig?
In meinem Fall wäre es wünschenswert wenn für die foo_jail auch nur die foo_ports offen sind, nicht aber die bar_ports und umgekehrt.

Dann eben:

pass in proto tcp from any to $foo_jail_addr port {$foo_jail_port1, $foo_jail_port2, ..., $foo_jail_portN}

Rob
 
Soweitvich im kopf habe , hat man pro jail ein tap interface , jenes muss dann in der jeweiligen regel in der klammer stehen
Holger
 
Zurück
Oben