• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

pf auf Jails

Morfio

Well-Known Member
Themenstarter #1
Hallo zusammen,

ich habe einen FreeBSD (11.1) Server mit mehreren Jails und würde gerne pf benutzen, um alles zu blockieren und nur bestimmte Ports freigeben. Für das Host-System kein Problem:

Code:
nic = "em0"

block in all

pass in quick on lo0
pass out quick on lo0
pass out all keep state

icmp_types = "{ echoreq, unreach }"
pass in inet proto icmp from any to any icmp-type { 0, 3, 8, 11 }

pass in quick on $nic proto tcp from any to any port 22 keep state label "SSH"
Jetzt habe ich noch etliche Jails, und für die möchte ich Ports auch einzeln freigeben. Ich habe gelesen, dass dies auf Alias-IPs nicht geht. Wie könnte man das denn lösen?

Viele Grüße

Morfio
 
#4
Da gehts um Jail<->Jail. Das kann man damit natürlich nicht filtern, da das Routing zwischen Aliasen über das loopback geht.
Dennoch kannst du Traffic von Außen auf die Jails filtern.

Rob
 

foxit

Moderator
Mitarbeiter
#5
Kann dir das gerade nicht genauer beschreiben aber das könnte dir helfen. Die Jails laufen alle auf "lo1" mit "10.0.0.X" IPs.

/etc/rc.conf
Code:
cloned_interfaces="lo1"
ifconfig_lo1_alias0="inet 10.0.0.10/32"
ifconfig_lo1_alias1="inet 10.0.0.11/32"
/etc/jail.conf
Code:
jail11 {
  ...
  host.hostname = jail11;
  ip4.addr = 10.0.0.11;
  ...
}
/etc/pf.conf
Code:
jail_host = "10.0.0.10"
jail_jail11 = "10.0.0.11"

...

jail_jail11_rdr_ssh = "11022"

...

nat on $wan proto {tcp udp icmp} from $jail_jail11 to any -> $wan

...

rdr on $wan proto tcp from any to $wan port $jail_jail11_rdr_ssh -> $jail_jail11 port 22

...

pass in quick on lo1 proto tcp from $jail_jail11 to $jail_jail11
 

Yamagi

Possessed With Psi Powers
Mitarbeiter
#6
Man sollte für das Verständnis zwei Dinge im Hinterkopf behalten:
  • Aus Sicht des Netzwerkstacks gibt es keine Jails, für ihn sind es einfach lokale IPs. Das wird sich mit FreeBSD 12.0 gegen Ende des Jahres auf Wunsch ändern. Bis dahin wird der Verkehr zwischen Jails auch wie lokaler Verkehr behandelt und nicht durch die Paketfilter und so weiter geschleust.
  • Es ist dem Netzwerkstack weitgehend egal, wo eine IP aufliegt. Das ist nur für Ingress- und Egress-Betrachtungen relevant und auch da wird es eher locker gesehen.
 

Morfio

Well-Known Member
Themenstarter #7
Danke für die Antwort.

Mir geht es allerdings nicht um NAT, die Jail-IPs sind vom Internet aus direkt erreichbar. Ich dachte mir, man blockt halt alles und schaltet dann, wenn gewünscht, Ports frei, so bsplw. (was aber nicht klappt):

Code:
nic = "em0"
jail0 = "xxx.xxx.xxx.xxx"

block in all

pass in quick on lo0
pass out quick on lo0
pass out all keep state

icmp_types = "{ echoreq, unreach }"
pass in inet proto icmp from any to any icmp-type { 0, 3, 8, 11 }

pass in quick on $nic proto tcp from any to $jail0 port 22 keep state label "SSH"
Wenn ich das mache, komme ich mit SSH ins Jail, aber auch auf den Host.
 

SolarCatcher

Well-Known Member
#8
Naja, auf dem Host musst Du em0 ja für alle öffentlichen IPs konfigurieren. Insofern musst Du dann den einzelnen Diensten vorgeben, auf welcher Adresse und welchem Port sie lauschen sollen. Wenn der SSHD sowohl auf dem Host als auch in den Jails auf Port 22 laufen soll, solltest Du z.B. in jeder /etc/ssh/sshd_config die ListenAddress auf diese jeweilige IP stellen. Dann sollte es kein Problem geben.
 
#9
Also, ich hatte bisher nie Probleme mit Jails+PF. Ist das dein ganzes Ruleset?
Kleiner Tipp am Rande: die Behandlung von lo0 kannste einfach ganz abschalten, statt alles zuzulassen:
Code:
set skip on lo0
Rob
 

bsfd

NetBSD User
#11
Man kann auch einfach in den Jails pf laufen lassen, das sollte auf jeden Fall funktionieren.
Umständlich, funzt aber.
Nur mal so :)
 

Morfio

Well-Known Member
Themenstarter #12
Ja, jetzt funktioniert es. Ich lasse SSH jetzt auf die richtigen IPs lauschen:

Code:
# Configuration
nic = "em0"

# Hosts/Jails
host_ip       = "aaa.bbb.ccc.1"
jail_jail0_ip = "aaa.bbb.ccc.2"
jail_jail1_ip = "aaa.bbb.ccc.3"
jail_jail2_ip = "aaa.bbb.ccc.4"
jail_jail3_ip = "aaa.bbb.ccc.5"
jail_jail4_ip = "aaa.bbb.ccc.6"

# Tables
table<ssh_ips> { \
    $host_ip \
    $jail_jail0_ip \
    $jail_jail1_ip \
    $jail_jail2_ip \
    $jail_jail3_ip \
    $jail_jail4_ip \
}

# Rules
set skip on lo0
block in all
pass out all keep state

table <sshguard> persist
block drop in log quick on $nic inet from <sshguard> to any

icmp_types = "{ echoreq, unreach }"
pass in inet proto icmp from any to any icmp-type { 0, 3, 8, 11 }

pass in quick on $nic proto tcp from any to <ssh_ips> port 22 keep state label "SSH"
(Nicht wundern, ich musste die Namen jetzt was verfremden, deshalb heißt jetzt alles ein wenig komisch.)
 

bsfd

NetBSD User
#14
Ich bin aus FreeBSD schon lange raus, aber ich meine, ich hatte pf in jeder jail am laufen.
Bin leider schon lange bei NetBSD dabei.
Kann es dir leider also atm nicht sagen.
Ohne Garantie.
 
#16
Kann es sein, dass du deine Aliase manuell in der rc.conf eingetragen hast? Das ist unnötig, die IP-Adressen werden beim Start eines Jails automatisch angelegt, wenn du es in der jail.conf entsprechend definierst.
Damit umgehst du den Fallstrick, dass ein Dienst im Host sich an eine Jail-IP bindet.
 

ed1949

Well-Known Member
#17
Also, ich hatte bisher nie Probleme mit Jails+PF. Ist das dein ganzes Ruleset?
Kleiner Tipp am Rande: die Behandlung von lo0 kannste einfach ganz abschalten, statt alles zuzulassen:
Code:
set skip on lo0
Rob
Ich hatte bisher die folgende Regel drin:
Code:
set skip on lo
Das hat bis 11.2 auch funktioniert. Mit 11.2 fällt mir nun manchmal beim neu Laden der Regeln oder auch sporadisch nach einiger Zeit die interne Verbindung weg. Scheint ein Bug zu sein.
 

Eisenfaust

Well-Known Member
#18
Hm, kann gut sein das ich mich täusche nach etwas googeln :)
https://forums.freebsd.org/threads/using-pf-in-jail.18263/
Da ist unbestätigt die Rede davon, das ipfw in der jail gehen könnte.
Und das ein Jail mit einem VImage das pf laufen sollte.
Wir betreiben einen regen Zoo von JAILs unter 12-CURRENT, 11.1-RELENG und 11.2.RELENG, die allesamt als VIMAGE Jails konfiguriert sind. In JEDEM dieser Jails läuft eine dedizierte ipfw Instanz - oder das, was FreeBSD daraus im Kontext eines Vimage Jails macht. pf nutzen wir nicht, es gab zu Beginn der VIMAGE Implementationen Probleme und Crashes mit pf.

Der administrative Aufwand mit VIMAGE Jails ist höher, wenn in jedem Jail eine dedizierte ipfw-Firewall werkeln soll, die nicht offen ist - es lohnt aber.