Mini-HOWTO für die Verwendung von Patch-o-Matic-ng mit FLI4L

Für mein OPT_BLOCKLIST wurde "-m iprange ..." notwendig.
Die Erweiterung für iptables ("libipt_iprange.so") wird bei FLI4L mitgeliefert, das zugehörige Kernelmodul ("ipt_iprange.o") fehlte aber. Im Kernel-Archiv war für dieses Modul aber kein Sourcecode vorhanden. Die Lösung: Patchen mit "Patch-o-Matic-ng"

Was ist Patch-o-Matic-ng?

Das Firewall-System des Linux-Kernels 2.4.x (und 2.6.x) wird durch verschiedene Kernelmodule und Userspace-Programme realisiert (netfilter/iptables). Durch ständige Verbesserungen / Fehlerbeseitigungen und Erweiterungen der Funktionalität von netfilter/iptables entstand das Problem, Patches für alle iptables-Programme und alle unterstützten Versionen des Kernels bereitzustellen.
Das Netfilter-Team entwickelte als Lösung "Patch-o-Matic-ng", welches aus vielen Patches und mehreren Scripts (perl) besteht. "Patch-o-Matic-ng" führt in Abhängigkeit der verwendeten Versionen (Kernel und iptables) und den bisher durchgeführten Patches Änderungen (wahlweise Automatisch oder Interaktiv) an den Sourcecodes des Kernels und von iptables durch.
Weitere Informationen sind auf der Homepage zu finden: "http://www.netfilter.org"

Wie wird Patch-o-Matic-ng in FLI4L verwendet?

Bisher (FLI4L 2.1.8) noch nicht.
Die Erzeugung / Installation des Kernels und der Kernelmodule für FLI4L wird bisher durch das Script "mkkernel.sh" automatisiert. Eine Erweiterung dieses Konzeptes ist auch nicht notwendig, da die verwendeten Versionen des Kernels und von iptables für eine FLI4L-Version festgelegt sind. Das Team muß "nur" festlegen, welche Patches in die Kernel-Sourcen integriert werden.

Manuelle Verwendung von Patch-o-Matic-ng in FLI4L

1.        Benötigte Archive:

Der Kernel und alle seine Module müssen mit zueinander kompatiblen Compilerversion und Compilerflags übersetzt werden, da es ansonnsten nicht auszuschließen ist, das interne Datenstrukturen / Funktionsaufrufe unterschiedlich compiliert werden.
Das Team verwendet gcc in der Version "3.3 (debian)".
Mein RedHat 9.0 hat "gcc 3.2.2" und bisher funktioniert auf meinem Router alles stabil.
Zur Übersetzung von Programmen für FLI4L habe Ich den Source des gcc-wrappers der "uClibc 0.9.20" in den den Source-Tree der Runtime-Version der "uClibc 0.9.26" kopiert, compiliert und nach der Installation mehrere Links korrigiert.

Am einfachsten ist jedoch die Verwendung der "buildroot"-Umgebung von Henry (enthält uClibc 0.9.26 und gcc 3.3.3) zum Compilieren. Diese ist aber nicht vollständig: "PatchoMaticng" benötigt zusätzlich "/usr/bin/perl". Zum Compilieren des Kernels fehlt "/usr/bin/perl" und "/sbin/modinfo".
Was wird benötigtVersionDownloadmöglichkeit

fli4l-base

2.1.8fli4l.de

buildroot

2.1.x Button "Download" auf http://www.fli4l.nl/opt.php?opt=Development

perl (buildroot)

5.6.1 http://www.uclibc.org/dists/uwoody/main/binary-i386/perl-base_5.6.1-8.3_i386.deb

modinfo (buildroot)

2.4.26 http://www.uclibc.org/dists/uwoody/main/binary-i386/modutils_2.4.26-1_i386.deb

libiconv (modinfo)

1.9.1 http://www.uclibc.org/dists/uwoody/main/binary-i386/libiconv_1.9.1-1_i386.deb

kernel

2.4.26 http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2

iptables

1.2.11 http://www.netfilter.org/files/iptables-1.2.11.tar.bz2

Patch-o-Matic-ng

20040621 http://www.netfilter.org/files/patch-o-matic-ng-20040621.tar.bz2

2.        Die "buildroot"-Umgebung vorbereiten

·        buildroot-Archiv herunterladen, wenn noch nicht vorhanden
Button "Download" auf "http://www.fli4l.nl/opt.php?opt=Development"

·        Als "root" das Archiv entpacken: "tar -zxf rootfs_i386.tgz"
(Ein Verzeichniss "rootfs_i386" wird automatisch erstellt)

Zur Vereinfachung habe Ich mein FLI4L-Verzeichniss in die <buildroot> - Umgebung verschoben und nicht "/usr/src" sondern "<fli4l>/src" als Source-Directory verwendet

·        bereits vorhanden Source-Archive nach "<sourcedir>" kopieren oder verschieben

3.        Die "buildroot"-Umgebung erweitern

Ich wollte nicht auch noch "perl" und "modinfo" compilieren, deshalb habe ich die Pakete aus "uwoody" (von Eric Andersee: debian woody auf der Basis der uClibc 0.9.26) verwendet.

Zusätzlich benötigt "modinfo" (uwoody) die "libintl.so.1" und die "libiconv.so.2"

·        nach "<sourcedir>"  wechseln

·        perl herunterladen, wenn noch nicht vorhanden (alles in einer Zeile)
wget http://www.uclibc.org/dists/uwoody/main/binary-i386/perl-base_5.6.1-8.3_i386.deb

·        Zum Installieren habe ich das Archiv nach "<buildroot>" entpackt.
("dpkg" ist in der <buildroot> - Umgebung vorhanden)
"dpkg -x perl-base_5.6.1-8.3_i386.deb  <buildroot> "

·        modutils herunterladen, wenn noch nicht vorhanden (alles in einer Zeile)
wget http://www.uclibc.org/dists/uwoody/main/binary-i386/modutils_2.4.26-1_i386.deb

·        Zum Installieren habe ich das Archiv nach "<buildroot>/tmp" entpackt und dann nur das Programm "modinfo" kopiert. WICHTIG: Wer das Paket nach "<buildroot>" entpackt, macht seine "<buildroot>"-Umgebung unbrauchbar!
"dpkg -x modutils_2.4.26-1_i386.deb  <buildroot>/tmp"
"cp <buildroot>/tmp/sbin/modinfo <buildroot>/sbin/modinfo"
Anschließend "<buildroot>/tmp/" wieder aufräumen.

·        libiconv herunterladen, wenn noch nicht vorhanden (alles in einer Zeile)
wget http://www.uclibc.org/dists/uwoody/main/binary-i386/libiconv_1.9.1-1_i386.deb

·        Zum Installieren habe ich das Archiv nach "<buildroot>" entpackt.
"dpkg -x libiconv_1.9.1-1_i386.deb  <buildroot> "

4.        iptables vorbereiten

·        nach "<sourcedir>"  wechseln
·        iptables herunterladen, wenn noch nicht vorhanden
wget http://www.netfilter.org/files/iptables-1.2.11.tar.bz2

·        iptables entpacken: "tar -jxf iptables-1.2.11.tar.bz2"

5.        Patch-o-Matic-ng vorbereiten

·        Patch-o-Matic-ng herunterladen, wenn noch nicht vorhanden
wget http://www.netfilter.org/files/patch-o-matic-ng-20040621.tar.bz2
·        Patch-o-Matic-ng entpacken: "tar -jxf patch-o-matic-ng-20040621.tar.bz2"

6.        Den Kernel vorbereiten

·        nach "<fli4l>/src/kernel-2.4" wechseln
·        Den Sourcecode des Kernels herunterladen, wenn noch nicht vorhanden
"./mkkernel.sh -fetch" oder
wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.26.tar.bz2

·        Den Sourcecode des Kernels entpacken "./mkkernel.sh -unpack"

·        Die von FLI4L bereitgestellten Patches aktivieren "./mkkernel.sh -patch"

7.        Patch für "FLI4L" vorbereiten (kernel)

Damit das "build"-Konzept des FLI4L-Kernels nicht geändert werden braucht, muß aus dem Patch für "Patch-o-matic-ng" ein Patch für "mkkernel.sh" generiert werden.

·        Backup des Kernel - Sourcecodes anlegen: "cp -r linux-2.4.26 linux-2.4.26.org"

8.        Patch-o-Matic-ng verwenden

·        nach "<sourcedir>/patch-o-matic-ng-20040621" wechseln

Ohne Parameter erwartet "runme" den Sourcecode des Kernels in "/usr/src/linux" und den Sourcecode von iptables in "/usr/src/iptables". Zusätzlich werden alle Patches interaktiv durchgeführt.

·        Patches für "iprange" automatisch Installieren (alles in einer Zeile eingeben)
"runme --kernel-path=<fli4l>/src/kernel-2.4/linux-2.4.26/ iptablespath=<sourcedir>/iptables-1.2.11/ --batch iprange"
(Zur interaktiven Patch-Installation den Parameter "--batch" weglassen.)

9.        Patch für "FLI4L" erzeugen (kernel)

·        nach "<fli4l>/src/kernel-2.4" wechseln
·        Patch für FLI4L erstellen (alles in einer Zeile eingeben)
"diff -urN --exclude *.orig
linux-2.4.26.org linux-2.4.26 >patch_ipt_iprange_2.4.26
"

·        "mkkernel.sh" mitteilen, das der Patch schon durchgeführt wurde
"touch linux-2.4.26/.patch_ipt_iprange_2.4.26.applied"

10.        Patch für "FLI4L" erweitern (dot-config)

Wenn dem Kernel durch "Patch-o-Matic-ng" neue Konfigurationsoptionen hinzugefügt werden, dann muß auch die FLI4L-Kernelkonfiguration ("dot-config") geändert werden.

·        Backup anlegen: "cp dot-config dot-config.org"
·        Alte Konfiguration installieren: "cp dot-config linux-2.4.26/.config"
·        Die neuen Konfigurationsoption aktivieren (Bei einem neue Kernelmodul: "M")
"make -C linux-2.4.26/ menuconfig"
·        Aktualisierte Konfiguration holen: "cp linux-2.4.26/.config dot-config"

·        Patch für FLI4L erweitern
"diff -urN dot-config.org  dot-config  >>patch_ ipt_iprange_2.4.26"

11.        Compilieren

·        als user "root" nach "<buildroot>" wechseln: "chroot <buildroot>"
·        nach "<fli4l>/src/kernel-2.4" wechseln
·        Den Kernel compilieren und installieren
"./mkkernel.sh -remove -kernel -hisax -depmod"
·        Bei Bedarf nach "<sourcedir>/iptables-1.2.11" wechseln
·        iptables bei Bedarf compilieren und installieren

·        Testen, testen, testen

12.        OPT erstellen

·        Gut getestet?
·        Aus den compilierten Modulen und dem Patchfile ein "OPT" erstellen und der Allgemeinheit zur Verfügung stellen

Anmerkungen zu "iptables-restore" und "-Os" / "-O2"

Für mein OPT_BLOCKLIST wurde "iptables-restore" notwendig.
Zur Platzeinsparung habe ich die Optimierung im Makefile von iptables auf "-Os" geändert und dann "iptables-restore" erzeugt.
Der Test im Router (P1-133, 48MB RAM) zur Aktivierung von ~20000 Einträgen benötigte "iptables-restore" sagenhafte 92 Minuten.
Die Änderung der Optimierung auf  "-O2" bewirkt eine Erhöhung der Dateigröße von 43456 Byte auf 47172 Byte, aber eine Veringerung der Laufzeit auf 45 Minuten.
(Wird "/sbin/iptables" für jeden Eintrag aufgerufen, dann bertägt die Laufzeit ~180 Minuten.)


Author / Copyright

Author:                Detlef Riekenberg        (Remove all numbers:  "dr33.news77@8web.de")

This program/dokumentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

04.01.2005         1.0        Created
09.01.2005         1.1        added: Die "buildroot"-Umgebung erweitern


Klicken Sie hier, um die Seite auszudrucken.