Alles was man dazu benötigt, um einen SOCKS5-Tunnel über SSH zu fahren ist ein openSSH auf dem “SOCKS-Server” und den bereits benutzten und bekannten “Proxifier”, ebenso wie unter Windows-Systemen das Programm PuTTY.
Als erstes muß der sichere Tunnel aufgebaut werden (unter OS X hierzu in der Konsole folgenden Befehl eingeben):
ssh -2 -N -D 8080 user@<ip of your SOCKS5-Host>
zum Beispiel:
ssh -2 -N -D 8080 myuser@192.168.1.11
Unter Windows muß PuTTY wie folgt konfiguriert werden:
Den Hostname (fim Beispiel: 192.168.1.11 – hier muß aber die IP Ihres SSH/SOCKS-Servers eingetragen werden!) im Bereich “Sessions” eintragen.
Dann im Reiter “Tunnels” den Source Port auf 8080 stellen
Dann “Dynamic” unter dem Punkt Destination Port anwählen
Open anklicken um den Tunnel aufzubauen
Als nächstes wird der Proxifier gestartet und folgende Einstellung vorgenommen:

Ich finde es nützlich (aber nicht unbedingt notwendig) die folgende Regel noch den Proxification Rules hinzuzufügen:

Das wars: openSSH hat einen integrierten SOCKS-Proxy. Proxifier sendet nun den gesamten Datenverkehr über den verschlüsselten SSH-Tunnel, und der SOCKS-proxy in openSSH auf der anderen Seite schickt den Datenverkehr an die richtige Zieladresse, bzw. leitet den eingehenden Datenverkehr wieder korrekt zurück.
nachdem ich google nach SOCKS durchsucht hatte fand ich eine häufig empfohlene Implementierung von SOCKS5: Dante
Außerdem gibt es eine sehr nette Übersicht über verschiedene Implementierungen auf wikipedia: http://en.wikipedia.org/wiki/SOCKS
Die Installation ist sehr einfach: Unter SuSE findet man ein passendes rpm welches einfach installiert wird, unter FreeBSD findet man Dante in den ports (cd /usr/ports/net/dante/; make; make install ). Interessanter wird nun die Konfiguration von Dante, die ich heute erklären möchte (ich habe nirgendwo ein HowTo gefunden und mußte deswegen die gesamte Dokumentation lesen):
Das config-file findet man unter /etc/sockd.conf (/usr/local/etc/sockd.conf unter FreeBSD). Dieses muß in der folgenden Weise angepasst werden:
#Logfile fuer Dante konfigurieren
logoutput: /var/log/dante.log#IP und Port auf der Dante fuer eingehende Verbindungen warten soll
internal: <IP address of your dante server> port = 80#IP/Interface welches Dante ausgehend benutzen soll
#Name des Interface erhaelt man ueber ifconfig
external: eth0
#Alternative: >external: <IP address that should be used>#Authentifizierung: deaktiviert, da eine statische IP-Adresse authentifizierung genug ist.
method: username none#unprivileged user
user.notprivileged: nobody
Soviel mal zu den Grundlagen – nun zum interessanten Teil:
#Wer darf den SOCKS-Tunnel konnektieren?
client pass {
from: <your ip here>/32 port 1-65535 to: 0.0.0.0/0
}#Loopback darf ebenfalls den Tunnel verwenden
client pass {
from: 127.0.0.0/8 port 1-65535 to: 0.0.0.0/0
}#Alle anderen nicht
client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}#Nach erfolgreicher Verbindung: wohin darf konnektiert werden?
#Loopback darf niemand von aussen konnektieren
block {
from: 0.0.0.0/0 to: 127.0.0.0/8
log: connect error
}#Verbindungen von aussen an den Client sind erlaubt
pass {
from: <your ip here>/32 to: 0.0.0.0/0
protocol: tcp udp
}pass {
from: 127.0.0.0/8 to: 0.0.0.0/0
protocol: tcp udp
}#Der Rest wird geblockt
block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
Kleiner Hinweis: dieses Beispiel erlaubt den Zugang von einer IP-Adresse (/32) aus, selbstverständlich kann auch von mehreren aus der Zugang erlaubt werden. Wer mit dem Subnetting und der Slash-Notation kämpft, der findet hier eine passende Hilfe: Subnet Cheat Sheet
nach dieser recht einfachen Konfiguration sollte der Dante-Dienst ohne Probleme sich starten lassen über folgenden Befehl:
/etc/rc.d/sockd start
(Unter FreeBSD muß zuerst sockd_enable=”YES” in die /etc/rc.conf eingetragen werden, und dann der Befehl: /usr/local/etc/rc.d/sockd start ). Ab jetzt kann man im Logfile /var/log/dante.log zusehen was passiert.
Ok – damit kommen wir zum komplizierten Teil: OS X davon zu überzeugen mit SOCKS5 zusammenzuarbeiten.
Als erste (und nicht erfolgreiche) Idee kam mir, dies über die Systemeinstellungen unter Netzwerk zu konfigurieren. (Systemeinstellungen öffnen, Netzwerk und dort “Weitere Optionen” anklicken, dann auf den Reiter “Proxies”. In diesem Fenster den SOCKS Proxy aktivieren und die IP des Servers und den zugehörigen Port eintragen; die Änderungen speichern und aktivieren.) Leider helfen diese Einstellungen nur bei Cocoa and WebKit-basierten Programmen (und da selbst diese Applikationen nicht alle die Systemeinstellungen benutzen ist man hier auch nur zu 95% abgedeckt).

Screenshot Systempreferences network german
Thunderbird und Firefox zum Beispiel benutzen nicht die Systemeinstellungen. Beide Programme kann man so konfigurieren, daß sie einen SOCKS-Tunnel benutzen, aber um ehrlich zu sein: Ich habe keine Lust an jedem Ort wo ich hinkomme meine Programme neu zu konfigurieren bevor ich arbeiten kann. Deswegen machte ich mich auf die Suche nach einem generellen SOCKS-Proxy für OS X.
Nach einigem Suchaufwand konnte ich Proxifier finden – ein kommerzielles Produkt welches leicht zu installieren, konfigurieren und mit nur ein paar Klicks zu benutzen ist. Außerdem gibt es auch eine Version für Windows und ich denke (getestet habe ich es nicht), diese wird ebenso gut funktionieren wie die Mac-Variante für OS X.
Die Konfiguration ist sehr einfach und benötigt die ausführliche Dokumentation auf der Homepage von Proxifier eigentlich nicht. Für dieejenigen, die gerne Dokumentationen lesen und sich somit besser fühlen: Hier ist die Anleitung für OS X zu finden: http://www.proxifier.com/mac/documentation/ProxifierHelp.html
Nachdem Proxifier gestartet und konfiguriert ist war ich direkt wieder online – unter “umgehen” der Firewall meines Kunden indem nun aller Datentransfer über den Port 80 “geroutet” wird.
ACHTUNG: Dante und SOCKS ist nicht mit einem VPN zu verwechseln (auch wenn es sich so anfühlt)! Der gesamte Datenverkehr läuft unverschlüsselt und kann mit jedem Packetsniffer im Klartext mitgelesen werden!
Ich gehe davon aus, daß qmail bereits so konfiguriert ist, daß es mit maildirsmtp und serialmail zusammen arbeitet. Es funktioniert auch die Mailweiterleitung per SMTP, wenn der maildirsmtp-Befehl direkt auf der Konsole ausgeführt wird. Wenn der Befehl aber aus dem crondaemon heraus ausgeführt wird, so funktioniert die Weiterleitung nicht mehr.
Das erste was getan werden sollte, ist, daß alle Pfade absolut in der crontab stehen, da der cron-daemon sich um systemweite Variablen und Pfade häufig nicht schert. Gib alle Pfade in der crontab immer und überall absolut an!
Damit sieht die crontab ungefähr wie folgt aus:
* * * * * /usr/local/bin/maildirsmtp /path/to/Maildir <remove-delivery-> 1.2.3.4 mail.host.net
Zunächst sollte noch das Logging aktiviert werden:
* * * * * /usr/local/bin/maildirsmtp /path/to/Maildir <remove-delivery-> 1.2.3.4 mail.host.net 2>&1| /var/qmail/bin/splogger serialmail
Durch diesen Zusatz wird das Ergebnis des Befehls in das Systemlog geschrieben (in meinem Fall ist das /var/log/maillog). Hier finden wir nach der Änderung die folgende Fehlermeldung:
Jul 10 11:45:00 mxhost serialmail: 1247219100.556374 maildirserial: fatal: unable to run tcpclient: file does not exist
Jul 10 11:45:00 mxhost serialmail: 1247219100.557665 maildirserial: fatal: unable to run tcpclient: file does not exist
Jul 10 11:45:00 mxhost serialmail: 1247219100.558582 maildirserial: fatal: unable to run tcpclient: file does not exist
Jul 10 11:45:00 mxhost serialmail: 1247219100.558801 maildirserial: fatal: making no progress, giving up
Das Problem ist, daß maildirsmtp das Programm tcpclient nicht findet, welches aber zum Aufbau der SMTP-Verbindung benötigt wird. Deswegen öffnen und modifizieren wir nun das maildirsmtp-script ein wenig und ergänzen dieses (die Ergänzung ist dick gedruckt):
#!/bin/sh
# WARNING: This file was auto-generated. Do not edit!exec \
/usr/local/bin/maildirserial -b -t 1209600 — “$1″ “$2″ \
/usr/local/bin/tcpclient -RHl0 — “$3″ 25 \
/usr/local/bin/serialsmtp “$2″ “$4″
Durch diese kleine Ergänzung wird die Mailzustellung mit maildirsmtp über einen cron funktionieren. Achte auf Änderungen an Deinem qmail – da das Script automatisch generiert wird, wird diese Änderung ggfs. überschrieben, wodurch die Mailzustellung über den cron-daemon wieder versagen wird!
Mein Workbench in eclipse wird leider sehr häufig beschädigt, und all die guten Ratschläge im Netz wie dies zu reparieren sei funktionieren nicht, da sie von der Tatsache ausgehen, daß eclipse gestartet ist. Was aber, wenn eclipse wegen der beschädigten Workbench überhaupt nicht mehr startet (Wie das normal bei mir der Fall ist)?
Als erstes sollte man das Logfile prüfen. Es ist im workbench-Verzeichnis zu finden und heißt “.metdata”. In diesem Verzeichnis ist die Datei “.log” zu finden. Öffne diese Datei und siehe nach, ob hier nicht etwas nützliches zu finden ist. Hier ist das File, welches ich heute erhalten habe:
!ENTRY org.eclipse.osgi 4 0 2009-06-25 18:56:21.330 !MESSAGE Application error !STACK 1 org.apache.commons.lang.exception.NestableError: Java Model Exception: Java Model Status [src/net/project/windows [in project] does not exist] at com.instantiations.designer.core.utils.execution.ExecutionUtils.runRethrow(ExecutionUtils.java:66) at com.instantiations.designer.core.editor.DesignPage.initialize(DesignPage.java:96) at com.instantiations.designer.core.editor.multi.MultiMode.create(MultiMode.java:74) at com.instantiations.designer.core.editor.multi.MultiPagesMode.create(MultiPagesMode.java:63) at com.instantiations.designer.core.editor.multi.MultiPageEditor.createPartControl(MultiPageEditor.java:57) at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:661) at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:428) at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:594) at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:306) at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180) at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270) at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65) at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473) at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1256) at org.eclipse.ui.internal.PartStack.handleDeferredEvents(PartStack.java:1224) at org.eclipse.ui.internal.LayoutPart.deferUpdates(LayoutPart.java:400) at org.eclipse.ui.internal.PartSashContainer.handleDeferredEvents(PartSashContainer.java:1401) at org.eclipse.ui.internal.LayoutPart.deferUpdates(LayoutPart.java:400) at org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1383) at org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1373) at org.eclipse.ui.internal.WorkbenchPage.access$14(WorkbenchPage.java:1364) at org.eclipse.ui.internal.WorkbenchPage$15.runWithException(WorkbenchPage.java:3261) at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3342) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3071) at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803) at org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1363) at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3342) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3071) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2295) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) at org.eclipse.equinox.launcher.Main.run(Main.java:1236) Caused by: Java Model Exception: Java Model Status [src/net/siteduke/windows [in SiteDuke] does not exist] at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:491) at org.eclipse.jdt.internal.core.PackageFragmentRoot.getUnderlyingResource(PackageFragmentRoot.java:678) at org.eclipse.jdt.internal.core.PackageFragment.getUnderlyingResource(PackageFragment.java:337) at org.eclipse.jdt.internal.core.Openable.getUnderlyingResource(Openable.java:333) at org.eclipse.jdt.internal.core.CompilationUnit.getUnderlyingResource(CompilationUnit.java:916) at com.instantiations.designer.core.editor.UndoManager.<init>(UndoManager.java:62) at com.instantiations.designer.core.editor.DesignPage$2.run(DesignPage.java:99) at com.instantiations.designer.core.utils.execution.ExecutionUtils.runRethrow(ExecutionUtils.java:64) ... 52 more !ENTRY org.eclipse.osgi 2 0 2009-06-25 18:56:21.409 !MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists: !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.409 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.apt.pluggable.core_1.0.101.R34x_v20081108-1950.jar [216] was not resolved. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.tool_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.dispatch_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.model_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.411 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.util_0.0.0. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.411 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.compiler.apt_1.0.101.R34x_v20090114-1205.jar [218] was not resolved. !SUBENTRY 2 org.eclipse.jdt.compiler.apt 2 0 2009-06-25 18:56:21.412 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.tool_0.0.0. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.412 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.compiler.tool_1.0.100.v_894_R34x.jar [219] was not resolved. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.412 !MESSAGE Bundle reference:file:plugins/com.instantiations.designer.swing.java6_7.0.0.200905010653.jar [417] was not resolved.
In diesem speziellen Fall steckt die nützliche Information hier: org.apache.commons.lang.exception.NestableError: Java Model Exception: Java Model Status [src/net/project/windows [in project] does not exist] Aus irgendeinem Grund kann eclipse eine spezielle Datei nicht mehr auf der Workbench öffnen. Nach einigen Versuchen habe ich dann einen Weg gefunden dieses Problem zu umgehen:
Tip: Lege so häufig wie möglich eine komplette Sicherungskopie Deiner workbench an!
Ach ja – bitte vergiss auf keinen Fall: Du folgst diesem Rat auf eigene Verantwortung
In den letzten Tagen wurde ich des häufigeren gefragt: “Wie konvertiere ich einen string in einen InputStream, sodaß ich meinen XML-String zum Beispiel mit SAX parsen kann?” (Anmerkung: oder natürlich jedem anderen XML-Parser wie DOM, JAXP, JDOM, …).
Um es nicht noch häufiger erklären zu müssen, hier ein Codebeispiel:
1 2 3 4 5 6 7 | String myString = 'content of your very own string'; ByteArrayInputStream in = new ByteArrayInputStream(myString.getBytes()); InputSource is = new InputSource(); is.setByteStream(in); Parser myParser = new Parser(); myParser.parse(is); |
So einfach und schnell funktioniert das in Java