ifconfig in /etc/jail.conf

SolarCatcher

Well-Known Member
Ich habe jüngst einen Server von Iocage-Jails auf Vanilla-Jails per /etc/jail.conf umgestellt. An sich läuft alles rund, aber beim Neustart will der Webserver in der Jail nicht starten. Grund scheint zu sein, dass die IP-Adresse der Jail noch nicht gesetzt ist. Bevor ich das jetzt ändere, wollte ich hier mal fragen, ob das Sinn macht.

Ich habe in /etc/jail.conf folgendes für die web1-Jail stehen (verkürzt und zur besseren Lesbarkeit ohne Variable für den $name):
Code:
web1 {
  path="/jails/web1/root";  
  exec.start+="ifconfig e0b_web1 inet 10.0.0.1 netmask 255.255.255.0"
  exec.start+="route add default 10.0.0.5";
}

Wann wird das ausgeführt? Erst nachdem die /etc/rc.conf aus der Jail abgearbeitet ist? Das würde mein Problem erklären und ich müsste die Konfiguration der IP-Adresse doch dorthin verschieben (wäre schade, weil ich diese zentrale Konfiguration in der /etc/jail.conf eleganter finde). Oder gibt es noch eine andere Lösung?

Danke für Eure sachdienlichen Hinweise.
 
Versuche mal in der jail.conf als erste Zeile:
Code:
exec.start = "sleep 5";

Das gibt unschädlich etwas mehr Zeit beim Start, ggf. reicht das schon als Lösung.
 
Ich habe bei mir sogar nur exec.start="sleep 1" aber ich benutzte ip4.addr="10.0.0.X", vielleicht ist das der Unterschied?
 
Vielleicht noch zur Entwirrung: bei einer einfachen jail (kein vnet!) braucht es keinen gateway (bzw. die Adresse kennt der Host schon), nur ip4.addr
Bei einer vnet-jail kann man in der jail eine rc.conf wie gewohnt bestücken und kann sich das exec.start+sparen.
 
Ich habe jüngst einen Server von Iocage-Jails auf Vanilla-Jails per /etc/jail.conf umgestellt. An sich läuft alles rund, aber beim Neustart will der Webserver in der Jail nicht starten. Grund scheint zu sein, dass die IP-Adresse der Jail noch nicht gesetzt ist. Bevor ich das jetzt ändere, wollte ich hier mal fragen, ob das Sinn macht.

Ich habe in /etc/jail.conf folgendes für die web1-Jail stehen (verkürzt und zur besseren Lesbarkeit ohne Variable für den $name):
Code:
web1 {
  path="/jails/web1/root";  
  exec.start+="ifconfig e0b_web1 inet 10.0.0.1 netmask 255.255.255.0"
  exec.start+="route add default 10.0.0.5";
}

Wann wird das ausgeführt? Erst nachdem die /etc/rc.conf aus der Jail abgearbeitet ist? Das würde mein Problem erklären und ich müsste die Konfiguration der IP-Adresse doch dorthin verschieben (wäre schade, weil ich diese zentrale Konfiguration in der /etc/jail.conf eleganter finde). Oder gibt es noch eine andere Lösung?

Danke für Eure sachdienlichen Hinweise.
Der Aufruf von exec.start += "..." hängt Dein ifconfig an das vorhandene exec.start Argument an. Wenn dort also zuerst ein sh /etc/rc aufgerufen wird, dann wird das ifconfig in der Tat erst danach ausgeführt. Du müsstes also die Reihenfolge der exec.start Argumente ändern oder das ifconfig in einem anderen exec Bereich ausführen. Hier könntest Du exec.prestart verwenden, dass aber nicht in der Jail Umgebung sondern in der System Umgebung ausgeführt wird.
 
Vielen Dank an Euch alle!

@mr44er Guter Hinweis. Es handelt sich hier aber tatsächlich um eine VNET-Jail, weil ich da ein Valkey (Redis-Fork) laufen habe, der nur in dieser Jail und daher auf der 127.0.0.1 erreichbar sein soll.

Ich werde es diese Woche dann mal mit der direkten Angabe von ip4.addr="10.0.0.1" versuchen - ich verstehe nicht, warum ich das nicht gleich so gemacht habe. Vielleicht reicht das schon, so dass ich gar kein sleep benötige.

Danke auch an @jmt für die Erklärung der Abfolge.
 
So, ich hatte das mit ip4.addr="10.0.0.1" mal versucht, aber es klappt nicht. Wenn ich die Jail starten will, passiert folgendes:
Code:
$ sudo service jail start web1
Starting jails: cannot start jail  "web1":
jail: web1: vnet jails cannot have IP address restrictions
Man muss es also vermutlich wirklich über die rc.conf der Jail machen. Schade, weil es die Konfiguration für mich unübersichtlicher macht.
Oder kennt Ihr noch eine andere Lösung?

Bisher sieht meine /etc/jail.conf so aus (verkürzt auf das hier wesentliche):
Code:
host.hostname="$name";
exec.clean;
exec.prestart="/usr/local/scripts/jib addm $name vlan1";
exec.start="sh /etc/rc";
exec.stop="sh /etc/rc.shutdown";
exec.poststop="/usr/local/scripts/jib destroy $name";
vnet;
vnet.interface="e0b_$name";

web1 {
  path="/jails/$name/root";
  ip4.addr="e0b_$name|10.0.0.1";
}
...

Mir ist leider nicht klar, wo ich ein exec.start = "sleep 5"; einfügen müsste: oben, gleich nach exec.start="sh /etc/rc";, um ein paar Sekunden zu warten bevor in der Jail ein exec.start+="ifconfig e0b_web1 inet 10.0.0.1 netmask 255.255.255.0" ausgeführt würde (siehe meine ursprüngliche Frage)?
 
Zuletzt bearbeitet:
Code:
exec.start = "sleep 5";

Als allererste Zeile, gilt dann für alle jails.

Explizit einzelne jail gut geraten würde ich sagen...
Code:
exec.clean;
exec.prestart = "sleep 5";
exec.prestart="/usr/local/scripts/jib addm $name vlan1";
...
...funktioniert auch.
 
@midnight Vielen Dank für die Links - die meisten davon hatte ich auch schon gefunden. Aber meine konkrete Frage beantworten sie halt nicht. Das Setup funktioniert ja grundsätzlich, nur werden in den Jails services gestartet, bevor die IP-Adressen gesetzt sind. Und das schlägt dann fehl.

@mr44er Das sleep hilft (wie ich schon befürchtet hatte) leider nicht. Wie @jmt erklärt hatte, werden die exec.start-Einträge mit den Jail-spezifischen ifconfigs nach dem /etc/rc.conf der Jail ausgeführt. Ich kann also nicht in der Jail einen Netwerk-Server starten (sshd, Webserver,...), wenn die sich an eine noch nicht eingerichtete IP-Adresse hängen wollen.

Ich habe jetzt die Vergabe der IP-Adressen doch in die /etc/rc.conf der jeweiligen Jails verlagert. Immerhin habe ich durch unsere Diskussion hier begriffen, dass ich das (immer identische) Setzen der Default Routes für IPv4 und IPv6 nach exec.poststart für alle Jails verlagern kann. Das macht die Jail-spezifischen Konfigurationen nochmal kürzer.

Es sieht dann bei mir ungefähr so aus:
/etc/jail.conf
Code:
host.hostname="$name";
exec.clean;
mount.devfs;
exec.prestart="/usr/local/scripts/jib addm $name vlan1";
exec.start="sh /etc/rc";
exec.poststart="route add default 10.0.0.9";
exec.poststart+="route add -6 default fd9f:f8ae:2018:051f::9";
exec.stop="sh /etc/rc.shutdown";
exec.poststop="/usr/local/scripts/jib destroy $name";
vnet;
vnet.interface="e0b_$name";

web1{
   path="/jails/$name/root";
}

Und die /etc/rc.conf der Jail hat:
Code:
ifconfig e0b_web1 inet 10.0.0.1 netmask 255.255.255.0
ifconfig e0b_web1 inet6 fd9f:f8ae:2018:051f::1 prefixlen 64 alias

Vielen Dank nochmal an Euch alle für die Unterstützung.
 
ACHTUNG, das war keine gute Idee. Das Route-setzen per exec.poststart wird nicht per Jail durchgeführt, sondern offenbar auf dem Host. Ich habe das wieder in jede einzelne Jail-Konfiguration eingefügt:

/etc/jail.conf
Code:
host.hostname="$name";
exec.clean;
mount.devfs;
exec.prestart="/usr/local/scripts/jib addm $name vlan1";
exec.start="sh /etc/rc";
exec.stop="sh /etc/rc.shutdown";
exec.poststop="/usr/local/scripts/jib destroy $name";
vnet;
vnet.interface="e0b_$name";

web1{
   path="/jails/$name/root";
   exec.start+="route add default 10.0.0.9";
   exec.start+="route add -6 default fd9f:f8ae:2018:051f::9";
}
 
Ein Blick in die Manpage von jail hilft hier weiter:
Code:
exec.poststart
             Command(s) to run in the system environment after a jail is
             created, and after any exec.start commands have completed.

Ich habe mir für das Setzen der IP ein Script geschrieben, dass die passenden Einträge in die rc.conf des Jails vornimmt. Der normale Startup dere Jail setzt dann IPs und Routen.
 
Zurück
Oben