Gelöst: Jail mit ip6.addr startet nicht mit jail -rc <jail>

jmt

Well-Known Member
Hallo,

ich habe ein "normales" jail in FreeBSD 13.1 erstellt. Wenn ich das Netzwerk auf ip4 beschränke, funktioniert alles wie gewünscht. Füge ich nun eine ip6.addr hinzu, dann habe ich ein seltsames Phänomren: jail -c <jail> und jail -r <jail> funktionieren einwandfrei. jail -rc <jail> gibt aber einen Fehler beim Erstellen des Jails aus. Ich habe dann immer irgendwelche "Schmutzzeichen" im ifconfig und weis nicht, wo die her kommen. Hat jemand von Euch da eine Idee?

Gruß Markus
 
So schnell findet man einen Workaround: ip6.addr braucht einen weiteren Parameter. Laut Dokumentation von jail
Code:
     ip6.addr
             In addition to the IP addresses that are passed to the kernel, an
             interface, prefix and additional parameters (as supported by
             ifconfig(8)) may also be specified, in the form
             “interface|ip-address/prefix param ...”.

Der param fehlte bei mir, da ich auch keinen brauche. Solange man nur jail -c <jail> und jail -r <jail> aufruft scheint der param auch nicht gebraucht zu werden. Bei jail -rc <jail> wird er jedoch falsch ausgelesen/initialisiert, wenn er fehlt. Ein simples Hinzufügen von "description a" löst das Problem.
 
Ja, ich hatte es erst auch überlesen, da nach ip4.addr, etc. ja aucj ip6 abgehandelt wird und dort lapidar steht, es gehe analog zu ip4. Später erfolgt dann noch einmal eine genaue Erklärung, die auch die Parameter nennt. Da dieses Phänomen nur beim Restart der Jail auftritt, bekommt man es vielleicht auch gar nicht mit.
 
Das ist mit sicherheit ein Bug. Wenn man keinen zusätzlichen Parameter angibt, dann wird irgendein Müll an ifconfig übergeben.
 
Ich vermute mal, dass der Parameter falsch ausgelesen wird. Anscheinend macht jail -cr da etwas anders als jail -c oder jail -r. Ich habe aber keine Ahnung, ob es da Scripts für gibt und man das nachvollziehen kann. Vielleicht weis ja einer unserer Unix-Gurus dazu etwas.
 
Danke für den Hinweis. Einiges Probieren hat gezeigt, dass es noch eine mount-Anweisung braucht. Folgendes läuft ohne Probleme:
Code:
basejail {
        interface="em0";
        ip6.addr = "fd21:1f28::3/64";
}
Und das hier dann nicht mehr:

Code:
basejail {
        interface="em0";
        ip6.addr = "fd21:1f28::3/64";
        mount = "/mnt           $path/mnt               nullfs          rw 0 0";
}
Könntest Du das bitte bei Dir mal überprüfen?
 
Noch eine Ergänzung. Ersetzt man $path durch den Pfad, so bleibt der Fehler. Auch bei der Verwendung einer fstab mittels mount.fstab bleibt der Fehler.
 
Jetzt konnte ich den Fehler auch reproduzieren.
Damit wird er wenigstens debug-bar :-)
Mal gucken, was sich ergibt.

Das es nur bei ip6.addr und auch nur mit mount-Zeile und auch nur beim 'restart' auftritt, grenzt es immerhin etwas ein.
Ich werd' mal jail.c#380 als Ausgangspunkt nehmen.

Falls Du mitsuchen willst:
lldb -- /usr/sbin/jail -cr yourjail
(lldb) breakpoint set --file jail.c --line 380
(lldb) process launch

Das lldb-Kommando gui gibt Dir sogar ne kleine TUI :-)
 
Das ist sehr interressant, besonders die TUI ;-) Leider habe ich keinen Quellcode an Board. Braucht man nicht auch Debug-Versionen der Programme?
 
Da gibt es tatsächlich ein Problem beim verarbeiten des ip6.addr-Parameters (das ging übrigens schon so in die Richtung, wie ich vermutet hatte).
Der Bug ist nicht neu. Vor fast 3 Jahren gabs den schon mal (JG wusste auch so ziemlich gleich, worum es geht). Allerdings da im Zusammenhang mit ip4.addr
Und dann wurde vergessen, das auch für ip6.addr zu fixen.
Der Bug liegt in der Datei usr.sbin/jail/command.c
Der Fix besteht darin Zeile 443 zu erweitern zu:
if (!down && extrap != NULL) {
analog wie es ja beim ipv4-Pendant in Zeile 394 ist.

Der Fix ist auch schon commited.
 
Das klingt ja super!
Ja. Ein bisschen ärgere ich mich ja schon, das ich das nicht selber zuerst gefunden hab. Ein Fehler der mit Debugging gut zu finden ist (wenn man weiß, wo ungefähr der Fehler ist, findet man ihn auch durch draufgucken). Aber ich dachte: Mach erst mal Abendbrot und zieh mir das Halbfinale rein. :-)

Weis man schon mit welchem Release der Fix kommt?
Gute Frage. Ich denk schon, das das relativ schnell nach stable/13 durchrutscht. Dementsprechend wäre es dann spätestens mit 13.2 drin.
Ansonsten bleibt ja noch selber patchen.
Man kann sich ja den Quelltext ziehen (ich nehme jetzt mal beispielshaft /usr/src als Zielpfad an; bei Bedarf alles entsprechend anpassen):
git clone -o freebsd -b releng/13.1 --depth 1 https://git.freebsd.org/src.git /usr/src
dann geht man an die entsprechende Stelle:
cd /usr/src/usr/sbin/jail/
und ändert die command.c wie oben angegeben oder via patch-Befehl:
Code:
patch -l  command.c << EOP
@@ -440,7 +440,7 @@
                } else
                        argc = 4;
 
-               if (!down) {
+        if (!down && extrap != NULL) {
                        for (cs = strtok(extrap, " "); cs;
                             cs = strtok(NULL, " ")) {
                                size_t len = strlen(cs) + 1;
EOP
(-l deshalb, damit etwaig durchs posten/copypasten verlorene Whitespaces hier kein Strich durch die Rechnung machen)

Und dann brauchst Du eigentlich nur noch ein
make
aufrufen und der Jail-Kram (und nur der) wird neu gebaut
und Du kannst ihn mit
make install
installieren.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: jmt
Zurück
Oben