My fist jail ignored

rubricanis

Homo ludens
Ich habe heute meine erstes Jail aus den Binärpacketen erstellt. Dabei habe ich mich an die Anleitung in http://wiki.denkrobat.de/doku.php?id=jail_erstellen gehalten. Ich habe mir hierzu eine zweite Adresse geleistet, d.h. dass dss Jail von außen erreichbar sein soll, also nicht wie meist in den Dokus geschrieben über die Haupt-IP des Servers.

Da ich noch keine domain a.d. server gebunden habe, habe ich i.d Annahme dass das auch so geht in der rc.conf den hostnamen auskommentiert und auch in /etc/hosts nichts eingetragen (s.a. unten).

Nach dem Aufruf von
# /etc/rc.d/jail start xyz
bekam ich folgende Fehlermeldung: "Starting jails:/etc/rc.d/jail: WARNING: Invalid configuration for xyz (no jail.conf, no hostname, or no path). Jail xyz was ignored."

Auszug aus meiner rc.conf:

# öffentliche IP
ifconfig_em0_alias0="xx.xxx.xxx.xxx"

# JAILS
jail_enable="YES"
jail_list="xyz"

jail_xyz_rootdir="/jails/xyz"
# jail_xyz_hostname="xxx" # AUSKOMMENTIERT
jail_xyz_ip="xx.xx.xx.xx" # alias0
jail_xyz_devfs_enable="YES"
jail_xyz_procfs_enable="YES"

Was mache ich hier falsch bzw. was ist zu tun damit ich das jail wie einen ganz normalen server über die IP von außen erreichen kann ?

Peter
 
Dein System sollte einen Namen haben. Also auch wenn du selbst keine Domain hast über die dein Rechner von aussen erreichbar ist sollte deine Jail einen Hostnamen bekommen.
 
Also, mit FreeBSD 10.0 hat sich in Sachen Jails einiges zum Guten geändert. Die größte Änderung ist, dass Jails nun über die /etc/jail.conf konfiguriert werden. Die alten Optionen in der rc.conf - wie du sie nutzt - werden nur noch teilweise unterstützt und sollten nicht mehr genutzt werden. Wahrscheinlich werden sie mit FreeBSD 11.0 endgültig abgeschafft werden. Der große Vorteil der jail.conf ist, dass nun alle Optionen für das jail(8)-Kommando direkt in der Konfigurationsdatei unterstützt werden. Bisher wurde nur eine kleine Teilmenge unterstützt, der Rest lediglich über Verrenkungen. Außerdem starten Jails über die jail.conf bedeutend schneller, weil der ganze Prozess zum Erstellen eines Jails in C statt sh-Script implementiert ist. Das fällt bei einem Jail nicht auf, aber bei 100 Stück ist z.B. schon deutlich zu merken. Eine minimale jail.conf für das Jail "xyz" wäre z.B.:
Code:
# Startscript (sleep 1 second to prevent races)
exec.start="sleep 1";
exec.start+="/bin/sh /etc/rc";

# Shutdownscript
exec.stop="/bin/sh /etc/rc.shutdown";

# Execute in a clean environment
exec.clean;

# Devfs
mount.devfs;

# Jail ruleset by default
devfs_ruleset=4;

# Default network interface
interface="em0";

# ------------------------------------------------------------------- # 

xyz {
  host.hostname = "xyz.example";
  path = /jails/xyz;
  ip4.addr = "xx.xxx.xxx.xxx";
}

In die rc.conf kommt dann nur noch:
Code:
jail_enable="YES"
jail_list="xyz"
Du kannst das Jail auch manuell starten und beenden:
Code:
# Starten
% jail -c xyz

# Beenden
% jail -r xyz
 
Installieren würde ich Jails mit bsdinstall. Es stellt sicher, dass Dinge wie die Zeitzone oder das root-Passwort korrekt gesetzt werden. Leider musst du dafür die Ausgabe von "uname -r" manipulieren, denn ansonsten wird bsdinstall durch den angehängten Patchlevel irritiert und beschwert sich, dass er das System nicht finden kann. Das geht dann so:
Code:
% setenv UNAME_r 10.0-RELEASE
% bsdinstall jail /jails/xyz
Anschließend muss das Jail vom Host aktualisiert werden, denn sonst hat du Lücken wie Heartbleed:
Code:
% setenv UNAME_r `/jails/xyz/bin/freebsd-version`
% freebsd-update -b /jails/xyz fetch
% freebsd-update -b /jails/xyz install
 
OK, das schlägt jail start auch vor nachdem ich hostname und /etc/host entsprechend modifiziert habe:
"/etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider to migrate to /etc/jail.conf."

Muss ich mir erst einmal in Ruhe anschauen und werde das dann ausprobieren.

Danke soweit!

Peter
 
Ich wollte eben das jail /jails/xyz mit rm -rf löschen und bekam dann jede Menge Fehlermeldungen "operation not supported" und "operation permitted".

Wie werde ich das jail wieder los ?
 
Doch, der Befehl stimmt. FreeBSD hat auf einigen essentiellen Systemdateien das "Immutable Flag" aka "schg" gesetzt. Es unterbindet jede Änderung an den Dateien. Verhindert also, dass man sich ungewollt den Hintern so weit wegschießt, dass eine Rettung nur noch sehr schwer möglich ist. FreeBSDusers Befehl entfernt das Flag, woraufhin du die Dateien löschen kannst. Also musst du noch ein "rm -Rf /jails/xyz" hinterher jagen. Weigert er sich dann noch immer, sind wahrscheinlich Mountpoints im Weg, wie z.B. ein gemountetes /jails/xyz/dev.
 
Yamagi, jail -c xyz meldet "interface em0 does not exist". In der rc.conf habe ich "ifconfig_em0_alias0="xxx.xxx.xxx.xxx", ohne mask. Ist das richtig und wenn nicht wie soll das aussehen?

Wenn ich i.d rc.conf etwas ändere, muss ich dann ein reboot machen oder funktioniert das beim jeweiligen aufruf ?

Beim alten jail sind wohl die mountpoints in dev (ft pts) im Wege...
 
Eines der wenigen, wirklich unschönen Dinge der BSDs gegenüber Linux ist, dass Netzwerkkarten nicht durchgehend gleich benannt werden. Stattdessen gibt der jeweilige Treiber den Namen vor. Das ist leider kaum mehr zu ändern, weil da inzwischen an die 35 Jahre Rückwärtskompatibilität dranhängen...
Code:
interface="em0";
Diese Zeile in der jail.conf legt die Alias-Adressen auf die Netzwerkkarte "em0" (Intel 1GBit/s Desktop-Netzwerkkarte). Wenn du sie auf einer anderen Karte haben möchtest, weil du z.B. kein "em0" hast, musst du natürlich die dort eintragen. Schaue einfach mal mit "ifconfig", wie deine Netzwerkkarte heißt.
 
OK, das ist "re0" und lo0 (looppack). In der rc.conf habe ich:
ifconfig_re0="inet xx.xx.xx.xx netmask 255.255.255.224"
heißt das, dass ich die zweite adresse als
ifconfig_re1="inet yy.yy.yy.yy netmask 255.255.255.224"
in rc.conf anlege und entsprechend in jail.conf ändere ?

Oder läuft dass dann auch unter ifconfig_re0 ?
 
Nein. Wenn in der jail.conf eine Netzwerkkarte angegeben ist, wird die Adresse beim Start des Jails automatisch gesetzt und beim Beenden wieder entfernt. Das solltest du nutzen, denn es erspart viel Ärger durch versehentlich nicht entfernte Adressen und in größeren Netzen sich daraus ergebenden Kollisionen. Wenn du in der rc.conf mit "ifconfig_re1" setzt, setzt du eine Adresse auf die (bei dir wahrscheinlich nicht vorhandene) Netzwerkkarte "re1". Das Alias setzt du stattdessen mit "ifconfig_re0_alias0". Aliase haben übrigens in den allermeisten Fällen eine Netzwerkmaske von /32.
 
[RANT] Stimmt - seit systemd haben sie so tolle Namen wie enp0s3 :ugly: [/RANT]
Laut Poettering sind die ja eindeutig und ganz toll. Es versteht zwar niemand den Algorithmus mit dem der Namen berechnet wird und was gegen eine Zuordnung per MAC-Adresse spricht weiß auch niemand, aber es ist sicher toll ;) Aber eigentlich wollte ich auf eth0, eth1, usw. hinaus. Was der Kernel auch weiterhin nutzt, wenn man ihn lässt.
 
OK, und jetzt müßte ich noch wissen was die Maske /32 bedeutet: 255.255.255.32 ? Und wovon hängt das ab?
 
/32 bedeutet, dass alle 32 Bits der Netzwerkmaske gesetzt sind. Die Maske ist also 255.255.255.255. Subnetting ist nun nichts, was man mal eben zwischen Tür und Angel erklärt. Seitdem die Netzklassen (bis 1993 wurden vereinfacht gesagt die Anwendungsbereiche für Netzwerke anhand der Länge der Netzmaske definiert) abgeschafft wurden, ist es grundsätzlich nicht mehr sonderlich kompliziert, aber noch immer "Hirnfick". Einen guten Einstieg gibt: http://de.wikipedia.org/wiki/CIDR

EDIT:
Vielleicht als Anmerkung: Der Trick ist, dass eine Netzwerkmaske von /32 zu klein ist, um ein Subnetz abzubilden. Sie kann lediglich einen einzelnen Host repräsentieren. Der Netzwerkstack im Kernel weiß daher, dass er für das Alias mit Netzwerkmaske /32 keinerlei Routen setzen muss und tut es entsprechend auch nicht. Setzt man die Netzmaske des Subnetz, in dem sich das Alias befindet, legt der Kernel unter Umständen Routen kann. Das kann später, vor allem nach dem Entfernen des Alias, zu ungewollten Effekten führen. Im Heimbereich wird das fast sicher nicht passieren, aber im professionellen Umfeld hat man komplexere Netze mit weitaus mehr interessanten Fehlerquellen.
 
Boooh, scheint zu funktionieren !!! Für heute mache ich erst einmal Schluss und morgen schaue ich mir mal die weiteren Details an.

Herzlichen Dank soweit für die Hilfe !

Peter
 
Vielleicht als Anmerkung: Der Trick ist, dass eine Netzwerkmaske von /32 zu klein ist, um ein Subnetz abzubilden. Sie kann lediglich einen einzelnen Host repräsentieren. Der Netzwerkstack im Kernel weiß daher, dass er für das Alias mit Netzwerkmaske /32 keinerlei Routen setzen muss und tut es entsprechend auch nicht.

Das stimmt nicht. Für einen Alias wird genauso eine Route angelegt wie für jedes Netz. Da ist auch kein Trick dabei. Man nimmt ja genau deswegen /32, damit die Route so spezifisch wie möglich wird und nicht die eigentliche Netzroute unnötig überlappt.
 
Ich bekomme das einfach nicht zum laufen.! Ich habe alles mehrmal überprüft aber es ergibt sich folgendes:

# makedir /jail
# makedir /jail/1
# setenv UNAME_r 10.0-RELEASE
# bsdinstall /jail /1
# setenv UNAME_r `/jail/1/bin/freebsd-version`
# freebsd-update -b /jail/1 fetch
# freebsd-update -b /jail/1 install

# jail -c s1
s1: created
# jls
JID IP Address Hostname Path # ALSO NIX
# jail -r s1
jail: "s1" not found # DTO

Und das war's...

Ich habe mich penibel an obige Anleitung gehalten, - zumindest meine ich das! :rolleyes: Ich nehme an in /etc/hosts des hosts muss nichts eingetragen werden, oder ist das falsch?
Unten jail.conf und rc.conf

Mache ich da was falsch und wenn ja was ?

Peter

----------------- etc/rc.conf" -------------
hostname="xxx"
sshd_enable="YES"
sendmail_enable="NONE"
zfs_enable="YES"
ntpd_enable="YES"
ifconfig_re0="inet xx.xx.xx.4xx3 netmask 255.255.255.224"
defaultrouter="xx.xx.xx.xx"

# IP alias
ifconfig_re0_alias0="xx.xx.xx.xx.netmask 255.255.255.255"
ifconfig_re0_alias1="xx.xx.xx.xx netmask 255.255.255.255"
ifconfig_re0_alias2="xx.xx.xx.xx netmask 255.255.255.255"

# Jails

jail_enable="YES"
jail_list="s1"

#-------------- /etc/jail.conf ----------------

# Startscript (sleep 1 second to prevent races)
exec.start="sleep 1";
exec.start+="/bin/sh /etc/rc";

# Shutdownscript
exec.stop="/bin/sh /etc/rc.shutdown";

# Execute in a clean environment
exec.clean;

# Devfs
mount.devfs;

# Jail ruleset by default
devfs_ruleset=4;

# Default network interface
interface="re0";

s1 {
host.hostname = "s1.example.org";
path = /jail/1;
ip4.addr = "xx.xx.xx.xx";
}
 
Zurück
Oben