pf auf Jails

Morfio

Well-Known Member
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
 
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
 
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
 
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.
 
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.
 
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.
 
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
 
Man kann auch einfach in den Jails pf laufen lassen, das sollte auf jeden Fall funktionieren.
Umständlich, funzt aber.
Nur mal so :)
 
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.)
 
Man kann auch einfach in den Jails pf laufen lassen, das sollte auf jeden Fall funktionieren.
Umständlich, funzt aber.
Nur mal so :)
Wie das denn? Gelesen habe ich, dass das nicht geht und wenn man in einem Jail einfach pf startet, wird gemeckert, dass das Device nicht da ist.
 
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.
 
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.
 
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.
 
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.
 
Mal für mich zum Mitschreiben und in langsam, damit ich meine Möglichkeiten ausloten kann ;) :

1. Ich kann net/isc-dhcp44-server funktionsmäßig uneingeschränkt in eine jail packen?
2. Ich kann dns/unbound funktionsfähig uneingeschränkt in eine jail packen?

Ab hier wirds haarig:
3. Ich kann net/mpd5 in einer jail installieren. Das will aber Modul ng_ether_load geladen haben, was aber nur auf dem Host ladbar ist. Wäre das an die jail durchreichbar? Wenn das ginge, ist es möglich dass in der jail pppoe0 erstellt wird? Da kratz ich mich am Kopf, wenn physikalisches Modem an physikalischem em0 steckt.
4. pf funktioniert nur mit Gebastel und dann instabil in einer jail und vllt. erst ab FreeBSD 12.0?

Zu 3.: Ich weiß, dass es generell Unsitte ist, alles auf einer Box zu machen. Dennoch: Hätte ich einen kleinen Sicherheitsaspekt damit im Vergleich zu mpd5 auf dem physikalischen Host, sofern es überhaupt funktioniert?

Zu 4.: Ähnlich wie die Frage 3. Irgendeinen Vorteil, auch wenn er noch so klein sein sollte?: 1x pf auf dem Host vs. pf auf dem Host und pf in jeder jail.

Hab da grad nen Knoten im Kopf oder Blackout. :p
 
1. Ich kann net/isc-dhcp44-server funktionsmäßig uneingeschränkt in eine jail packen?
Ja.

2. Ich kann dns/unbound funktionsfähig uneingeschränkt in eine jail packen?
Nochmal ja. :)

3. Ich kann net/mpd5 in einer jail installieren. Das will aber Modul ng_ether_load geladen haben, was aber nur auf dem Host ladbar ist. Wäre das an die jail durchreichbar? Wenn das ginge, ist es möglich dass in der jail pppoe0 erstellt wird? Da kratz ich mich am Kopf, wenn physikalisches Modem an physikalischem em0 steckt.
Hmm... Wenn du das Modul auf dem Host lädst und das Jail mit einem weitgehend vollständigen /dev bereibst, könnte das vielleicht gehen. Weiß ich nicht genau. Müsste man ausprobieren.

4. pf funktioniert nur mit Gebastel und dann instabil in einer jail und vllt. erst ab FreeBSD 12.0?
pf funktioniert nicht in klassischen Jails, da die keinen eigenen Netzwerkstack haben. Dafür braucht man vnet-Jails, die erst ab FreeBSD 12.0 endlich in GENERIC sind und zuverlässig funktionieren. Eigentlich soll es da auch mit pf gehen, praktisch weiß ich es nicht. Man muss sich halt generell darüber klar sein, dass die pf-Version in FreeBSD wirklich alt ist und seit Jahren nur noch sporadisch Bugfixes bekommt. ipfw ist wesentlich besser unterstützt und hat deutlich mehr Funktionen, so man sie denn braucht.

Zu 3.: Ich weiß, dass es generell Unsitte ist, alles auf einer Box zu machen. Dennoch: Hätte ich einen kleinen Sicherheitsaspekt damit im Vergleich zu mpd5 auf dem physikalischen Host, sofern es überhaupt funktioniert?
Schwer zu sagen. Ich persönlich betrachte Jails schon seit Jahren nicht mehr unbedingt als Sicherheitskonzept, sondern eher als administrative Hilfe. Der Sicherheitsaspekt liegt halt hauptsächlich darin, dass ein Angreifer auf das Dateisystem des Jails eingeschränkt ist. Er kann nur Daten abziehen, die aus dem Jails erreichbar sind und der Kryptominer läuft dann halt ganz sicher im Jail und nicht auf dem Host... Bei Software wie mpd5 dürfte der Sicherheitsgewinn vernachlässigbar sein.

Zu 4.: Ähnlich wie die Frage 3. Irgendeinen Vorteil, auch wenn er noch so klein sein sollte?: 1x pf auf dem Host vs. pf auf dem Host und pf in jeder jail.
Es macht vielleicht die Filterscripte einfacher und damit weniger anfällig für Fehler. :)
 
Dafür braucht man vnet-Jails

Dahin bin ich gestern noch gekommen. Den Kernel hab ich dementsprechend gebaut, 'ifconfig epair0 create' erstellt mir das Paar mit a und b.
'ifconfig bridge0 create' erstellt mir die bridge und 'ifconfig bridge0 addm em0 addm epair0a' verheiratet erfolgreich em0 mit epair0a.

Jetzt mein Hänger hier: 'ifconfig epair0b vnet jail1'

Wie sage ich einer jail, dass sie vnet nutzen soll? Geht das mit ezjail gar nicht?

In Tutorials steht z.B. 'jail -c vnet persist name=testjail path=/usr/jails/testjail', das klappt aber nicht. Mir wird auch nicht ersichtlich, was '-c' bedeutet. vnet ist doch eine virtuelle Topologie und keine virtuelle Netzwerkschnittstelle?
 
Und gefährlich, das ezjail auch nach fast 10 Jahren nicht in der Welt der jail.conf und ihren Möglichkeiten angekommen ist.
 
Ezjail ist überflüssig, nutze einfach die Tools aus dem Basissystem.
Den Rat werde ich beherzigen. Habe das zu meinen ersten Berührungszeiten mit jails auch so versucht, fast jedes Tutorial hat dann ezjail mit 'voll geil, einfachster Umgang mit jails, erleichtert Getippse, bla' gepriesen. Gut, war auch nicht gelogen.

Und gefährlich, das ezjail auch nach fast 10 Jahren nicht in der Welt der jail.conf und ihren Möglichkeiten angekommen ist.
Ups...dass es vernachlässigt wurde, war mir bewusst, aber solange....mhhhm

Bitte Manpages zum Kommando jail lesen :-)
Ich hätte jetzt wenigstens ein halbes Lob erwartet, weil ich nicht einfach mal stumpf irgendwas in Tutorials abtippe. :p:D

Ich hab mich da blöd ausgedrückt...ich hab die manpage schon gelesen und dass -c für create steht, verstanden.
Konnte mit 'vnet' an der Stelle nix anfangen, weil ich das eher so kenne:
jail (Befehl) -c (Option) jailname(Name der jail) und erst dann eine zweite Option in? als? vnet

ipfw ist wesentlich besser unterstützt und hat deutlich mehr Funktionen, so man sie denn braucht.
Da ipfw Neuland für mich ist, werd ichs erstmal mit pf probieren. Das vermeidet Fehler durch Unwissenheit...wenns nur crasht, muss ich wechseln, aber ich schau erstmal, ob ich das auf die lange Bank schieben kann.

ezjail fliegt jetzt erstmal und die ganze Geschichte werd ich mit den Bordmitteln als meine Abendgestaltung hindengeln. :)
 
Zurück
Oben