HOWTO: OpenVPN Binary - statisch gelinkt und nur 1,4 MB groß

DSLFritze

Neuer User
Mitglied seit
1 Dez 2006
Beiträge
73
Punkte für Reaktionen
0
Punkte
0
Hallo,

in den letzten Tagen habe ich mit Eurer Hilfe, insbesondere von kriegaex, olistudent und derheimi, den DS-MOD auf meiner 7170 zum Laufen gebracht, die nun als OpenVPN Server arbeitet :)

Meine andere Boxen laufen als OpenVPN Clients. Da diese Boxtypen vom DS-MOD leider nicht unterstützt werden (7140 Annex A) und zudem einen für OpenVPN zu kleinen Flashspeicher haben (7050 Annex A), mußte ein statisch gelinktes OpenVPN Binary mit lzo her.

Binaries fand ich bei www.tecchannel.de (2.1_beta8, Dateigröße 2 MB) und in einem Forumsbeitrag von jack1st (2.1_rc1, Dateigröße 3 MB), die während der Testphase gute Dienste leisteten.

Meine Zielsetzung war aber, das Binary selbst zu übersetzen und dabei von der optimierten Dateigröße des OpenVPN-Pakets im DS-MOD zu profitieren. :cool:

In den Makefiles sind bei der Übersetzung zwei Änderungen erforderlich: Bei lzo muß die Option --disable-static entfernt werden, damit die passende statische Bibliothek liblzo2.a erzeugt wird und bei OpenVPN muß in den LDFLAGS die Option -static hinzugefügt werden.

Folgende Schritte führen zum Ziel:

Achtung: Diese Beschreibung setzt noch den DS-MOD in Version ds26-14.4 voraus. Beim neuen ds26-15 gibt es laut Beschreibung Änderungen im Ablauf, die nicht berücksichtigt sind (u.a. entfällt make precompiled).

1. Ausgangpunkt ist ein Verzeichnis ds26-14.4, in dem das Paket OpenVPN ausgewählt und der Ablauf zur Erstellung eines Firmware-Images erfolgreich durchlaufen wurde (Beschreibung siehe hier).

2. Das Skript build-openvpnstatic wird in dieses Verzeichnis kopiert und arbeitet die folgenden Schritte ab:

  • Sichern der makefiles für lzo und openvpn
  • Patchen des makefiles von lzo (--disable-static entfernen)
  • Neuübersetzung von lzo zur Erzeugung einer statischen Bibliothek liblzo2.a
  • Patchen des makefiles von openvpn (LDFLAGS=-static hinzufügen)
  • Neuübersetzung von openvpn zur Erzeugung des statisch gelinkten Binaries
  • Kopieren des erzeugten openvpn Binaries ins Verzeichnis ds26-14.4
  • Restaurieren der ursprünglichen makefiles
  • Übersetzung von lzo und openvpn in der ursprünglichen, dynamischen Version für DS-MOD

Code:
# Create OpenVPN static binary after ds26-14.4 image creation
# 2007-07-09 by DSLFritze

# Save original makefiles
cp -p make/openvpn/openvpn.mk make/openvpn/openvpn.mk.orig
cp -p make/libs/lzo.mk make/libs/lzo.mk.orig

# Make lzo static library
patch -p0 << "EOLOOP0"
--- make/libs/lzo.mk.orig	2007-01-16 23:26:37.000000000 +0100
+++ make/libs/lzo.mk	2007-07-09 15:50:39.000000000 +0200
@@ -38,7 +38,6 @@
 		$(DISABLE_LARGEFILE) \
 		--disable-libtool-lock \
 		--disable-asm \
-		--disable-static \
 	);
 	touch $@
EOLOOP0
rm source/lzo-2.02/.configured
make lzo-dirclean
make lzo-precompiled

# Make openvpn static binary
patch -p0 << "EOLOOP1"
--- make/openvpn/openvpn.mk.orig	2007-04-16 11:16:06.000000000 +0200
+++ make/openvpn/openvpn.mk	2007-07-09 16:28:46.000000000 +0200
@@ -35,7 +35,7 @@
 		$(TARGET_CONFIGURE_OPTS) \
 		CFLAGS="$(TARGET_CFLAGS)" \
 		CPPFLAGS="-I$(TARGET_MAKE_PATH)/../usr/include" \
-		LDFLAGS="-static-libgcc -L$(TARGET_MAKE_PATH)/../usr/lib" \
+		LDFLAGS="-static -static-libgcc -L$(TARGET_MAKE_PATH)/../usr/lib" \
 		./configure \
 		--target=$(GNU_TARGET_NAME) \
 		--host=$(GNU_TARGET_NAME) \
EOLOOP1
rm source/openvpn-2.1_rc2/.configured
make openvpn-dirclean
make openvpn-precompiled

# Get the static binary
cp -p source/openvpn-2.1_rc2/openvpn .

# Restore original makefiles
mv -f make/openvpn/openvpn.mk.orig make/openvpn/openvpn.mk
mv -f make/libs/lzo.mk.orig make/libs/lzo.mk

# Make with original makefiles
rm source/lzo-2.02/.configured
make lzo-dirclean
make lzo-precompiled

rm source/openvpn-2.1_rc2/.configured
make openvpn-dirclean
make openvpn-precompiled
3. Der Aufruf des Skripts erfolgt mit

Code:
. ./build-openvpnstatic

4. Das resultierende Binary openvpn hat die in ds26-14.4 enthaltende Version 2.1_rc2 und ist knapp 1,4 MB groß.

Bei mir läuft es seit einem Tag einwandfrei (auf der 7050).

WICHTIG: Alle Informationen nutzt Ihr auf eigene Gefahr! Ich übernehme keine Haftung. Statt makefiles zu patchen und mich stundenlang über rätselhafte Fehlermeldungen zu wundern, hätte ich heute auch mal den Unix-Grundkurs machen können, den mir kriegaex aus gutem Grund ans Herz gelegt hat :) Ihr seid also gewarnt!

Neben dem Skript habe ich auch das Binary angehängt, falls jemand nicht kompilieren will oder kann.

Grüße,
DSLFritze

P.S: Zwei Fragen sind noch aufgetaucht, die die Linux-Profis hier vermutlich leicht beantworten können:

  1. Als es mit dem statischen Linken auch nach Stunden nicht klappen wollte, hatte ich die Idee, das dynamisch gelinkte Binary aus dem DS-MOD nebst Bibliotheken (libssl.0.9.8.so usw.) auf die 7050 zu kopieren. Bibliotheken werden beim Aufruf aber in /usr/lib erwartet. Wie kann ich auf einer Box ohne DS-MOD den Pfad für Bibliotheken erweitern, damit diese auch in anderen Verzeichnissen gesucht werden ?
  2. Mein DS-MOD Image wurde für 29.04.29 übersetzt, also für eine Box mit Kernel 2.6.13.1. Meine englische 7050 (14.04.26) läuft aber mit 2.4.17. Daher war ich eigentlich überrascht, dass das Binary hierauf überhaupt funktioniert. Wie sind hier die Abhängigkeiten? Wann muss gezielt für eine Kernelversion übersetzt werden und wann nicht :confused:
 

Anhänge

  • openvpn-lzo-static.tar.bz2
    488.4 KB · Aufrufe: 1,032
  • build-openvpnstatic.tar.bz2
    801 Bytes · Aufrufe: 380
Zu 1: Du brauchst den LD_LIBRARY_PATH, und der zeigt standardmäßig auf /mod/lib, wohin Du Deine Libs direkt kopieren kannst. Falls Dir ein anderes Verzeichnis lieber ist, setze den Pfad einfach anders (aber wozu?) und mache ihn dem Binary bekannt.

Zu 2: Du kompilierst statisch gelinkte Binaries eher gegen eine uClibc als gegen einen speziellen Kernel. Sowas gibt's auch, aber das ist doch eher speziell. Da Du ja die uClibc statisch drin hast, hast Du sozusagen ein Universal-Binary für 2.4 und 2.6 gebaut.
 
Interessante Sache und hervorragende Anleitung!

Aber bitte, schreib's doch lieber ins Wiki...
 
Tolle Sache! Nun habe ich einige Bemerkungen und Fragen:

1. Edit: hat sich erledigt, habe die gepackte Größe mit ausgepackter verwechselt.

2. Desto trotz würde deine statische Variante sich gut zum Nachladen ins RAM eignen. Die Handarbeit mit dem "umbiegen" des ds-mods vereinfacht sich dadurch. Und das Gute daran, deine Binaries basieren auf dem ds-mod makefile, so dass ich stark davon ausgehe, dass die CGI-Masken vom Mod hervorragend funktionieren werden.

3. Der nächste Pluspunkt ist, dass deine Binary kernelunabhängig ist. Man kann sie für alle Boxen und Kernels nehmen.

4. Würde es funktionieren, wenn ich OpenVPN zunächst mal im mod "normal" kompilliere? Dann entferne ich openvpn-binary und alle libs aus dem Image. Das statische Binary wird dann nachgeladen. Frage ist, ob der Rest der Box nach fehlenden Binaries "schreit" oder nicht. Wenn die libs aber nur von OpenVPN binary benutzt werden, vermute ich erstmal nein.

MfG
 
Zuletzt bearbeitet:
Hallo hermann72pb,

Folgendes kann ich zu Deinen Punkten beitragen:

zu 1: Ich finde in meinem dsmod26-14.4 die dynamischen Dateien mit anderen Größen vor:

/root/usr/lib/
1181KB libcrypto.s0.0.9.8
117 KB liblzo2.so.2.0.0
235 KB libssl.so.0.9.8

/source/openvpn-2.1_rc2/
450 KB openvpn

Die libcrypto ist also der größte Platzfresser.

Die Summe der obigen Module ergibt knapp 2 MB, was der Größe des von jack1st erzeugten Binaries entspricht. Ich war daher überrascht, als das Skript dann ein statisches Binary mit nur 1,4 MB erzeugte :eek: Ich lud es mit Skepsis auf meine Box und dachte, dass vielleicht etwas fehlt. Aber nun tut es dort klaglos seinen Dienst. Und wenn weder Compiler noch Linker meckern und meine OpenVPN-Konfiguration mit zahlreichen Features funktioniert, sind das zumindest schon einige Indizien dafür, dass das Binary tatsächlich vollständig sein könnte... :)

zu 2: Wie beschrieben brauchte ich ein Lösung auch zum Nachladen auf die 7050 (Englisch, Annex A, ohne DS-MOD). Eine einzelne Datei ist da sehr willkommen.

zu 3: kriegaex hat in #2 den Zusammenhang mit der uClibc beschrieben, so dass ich das Binary nun guten Gewissens auf Boxen mit 2.4er und 2.6er Kernel einsetzen kann.

zu 4: Das ist eine gute Idee und scheint mir einen Versuch wert zu sein :idea: Vielleicht kann man so auf einer (deutschen) 7050 den DS-MOD mit OpenVPN GUI ins Flash bekommen und nur das platzfressende openvpn Binary nachladen.

Grüße,
DSLFritze
 
Zuletzt bearbeitet:
OpenVPN hat im ds-mod 26-15 angeblich noch Probleme. Und in der Tat läuft dieser bei mir nicht an. Woran hakt es denn, ein funktionierendes Binary in den Mod zu integrieren? Oder läuft das ganze bei jemanden einwandtfrei?
 
Liegt afaik an OpenSSL und dafür gibts im ds-mod-Thread nen Patch ;)
 
Das ist schon klar. Die Frage ist nur, worauf bezieht sich dieser Patch und wie soll es angewendet werden. Da im Binary von DSLFritze alle libs integriert sind, auch libssl, bedeutet es, dass Binary nicht kompatibel zu ds26-15 ist. Oder sehe ich es falsch? D.h. das Rumpatschen der restlichen Box bringt nichts, sobald der Wurm im Binary sitzt.

MfG
 
Der 15-er dsmod nutzt den gcc-4.2.0. Damit sich openssl damit "richtig" übersetzen lässt, dafür ist der Patch (ändert ein paar Dinge im OpenSSL Paket). Da dieses Binary auf dem 14.4-er mod aufsetzt, gibt es die Problematik da nicht. Das Binary sollte daher problemlos laufen.

Jörg
 
15.1 kommt bald, vermutlich heute noch. Da ist der Patch schon drin.
 
Hi,

bin neu hier, aber habe mich schon ein wenig in Eurem Forum und im Internet über das Thema VPN informiert.

Also ich habe openVPN schon länger in gebrauch, allerdings auf mehreren Linux rechnern. Habe dann schon verscheidenen Anleitungen gelesen und Versucht openVPN auf der FritzBox 7141 zum laufen zu bringen.

Leider habe ich noch kein bin gefunden, was auf meiner Box läuft. Habe die 7141 mir der Firmware 40.04.37. Glaube das liegt an dem neuen Kernel.

Ich bräuchte eigentlich nur ein OpenVPN was ich auf der oben beschriebenen Box starten kann.

Hoffe einer von Euch kann mir einen Link oder den File schicken, da ich von compilieren usw wenig Erfahrung habe.

Danke
 
... geht es mit dem OpenVPN aus dem Anhang im ersten Beitrag denn nicht?!?

Jörg
 
MaxMuster schrieb:
... geht es mit dem OpenVPN aus dem Anhang im ersten Beitrag denn nicht?!?
Jörg

Nein, leider nicht.

#######
./openvpn
Usage message not available
#######
 
Aber dann geht doch nur die Hilfe nicht, oder? Bau dir deine Config und starte
./openvpn --config <mein-config-file>

Jörg
 
MaxMuster schrieb:
Aber dann geht doch nur die Hilfe nicht, oder? Bau dir deine Config und starte
./openvpn --config <mein-config-file>

Jörg

ok, danke. Jetzt bekomme ich keinen fehler, aber der VPN-Client wird nicht gestartet. Muss mich da noch mal reinhängen. Leider sehe ich auch keine LOG-Files.

Mal sehen. Wenn ich es nicht hinbekomme, dann meld ich mich noch mal hier im Forum.

DANKE schon mal.
 
Gibt es keine Ausgabe? Hast du vielleich daemon mit drin? Ansonsten wäre noch die Frage, ob denn das "Tunnel-Device" existiert? Aus dem OpenVPN-Wiki für den Fall, dass es nicht da ist:
in der Shell: mknod /var/tmp/tun c 10 200
in der Config: dev-node /var/tmp/tun
Bei weiteren Fehlern: Auf was hast du denn verb gesetzt? Ein Wert von 6 bietet sich für die meisten Problemfälle an.

Jörg
 
MaxMuster schrieb:
Gibt es keine Ausgabe? Hast du vielleich daemon mit drin? Ansonsten wäre noch die Frage, ob denn das "Tunnel-Device" existiert? Aus dem OpenVPN-Wiki für den Fall, dass es nicht da ist:
in der Shell: mknod /var/tmp/tun c 10 200
in der Config: dev-node /var/tmp/tun
Bei weiteren Fehlern: Auf was hast du denn verb gesetzt? Ein Wert von 6 bietet sich für die meisten Problemfälle an.

Jörg

Hi,
jetzt klappt jetzt. Hatte vergessen das Tunel-Device anzulegen. Mit mknode hat es dann geklappt.

DANKE
 
Brauch leider noch das Bridge-tool brctl für meine FritzBox. Hat das schon jemand, oder muss ich mich jetzt darum kümmern rauszubekommen, wie man sowas selbst macht.

DANKE
 
Kommt darauf an, ob Du gern was dazu lernst und eine gewisse Unabhängigkeit zu schätzen weißt...
 
Also, da hat Alexander recht, du findest hier im Forum beides, sowohl die "Grundlagen", das zu bauen als auch das Tool selbst.

Ansonsten kannst du, unabhängig von dem Tool, auch die ar7.cfg editieren. Dort gibt es einen Abschnitt für das Bridging brinterfaces, in dem kannst du das Interface tap0 in gleicher Syntax hinzufügen.

Jörg
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.