Archiv der Kategorie: Software

Alles was mit Software zu tun hat

Finanzbehörden und Verschlüsselung – the never ending story…

Dieser Artikel lag einige Jahre im Entwurfsordner und ist nicht mehr aktuell. Meines Wissens nach nutzt Elster inzwischen korrekte Zertifikate, zudem hat Microsoft das Produkt Forefront TMG eingestellt.

Sicherheit von IT-Systemen spielt in vielen Unternehmen eine immer größere Rolle. Kein Wunder, dass vorallem bei sensiblen Daten wie Mitarbeiterdaten und Behördenkommunikation versucht wird ein gewisses Sicherheitslevel zu halten. Leider gilt das nur für Unternehmen, die Behörden scheinen noch nicht so weit zu sein. Seit 2005 sind Unternehmen verpflichtet Steuerdaten elektronisch an das Finanzamt zu übermitteln. Anfangs kam hierbei die auf Java basierende Schnittstelle „COALA“ zum Einsatz, welche die (intern verschlüsselten) Daten über HTTP-Aufrufe an die Elster-Server weitergab. Mitte des Jahres soll nun letztendlich diese Schnittstelle abgeschaltet werden, fortan ist nur der neuere „ELSTER Rich Client“ aka. ERiC nutzbar. Prinzipiell sind die Unterschiede – abgesehen vom Umstieg auf C statt Java – nur minimal, jedoch hat man die Sicherheit ein kleines Stück erhöht – oder es jedenfalls versucht: Statt HTTP wird nun auf HTTPs gesetzt. Was sich auf den ersten Blick gut anhört ist in der Praxis leider eher nervig, denn die X.509-Regeln interpretiert die zuständige Steuerbehörde etwas frei. Die Zertifikate sind selbstsigniert und haben nicht wie vorgesehen den DNS des Servers sondern den Eigennamen der Behörde als CN deklariert. Das hierauf jedes Sicherheitsprogramm allergisch reagiert und den Zugriff sperrt versteht sich von selbst. Apropos DNS: In der Software sind selbstverstandlich die IPv4-Adressen hardcoded, wer also darauf hofft die Ausnahmefunktion der Sicherheitssoftware nutzen zu können muss bangen. So erlaubt z.B. Microsoft Forefront TMG nur eine Definition von Ausnahmen auf Domainebene, für die IPs direkt ist eine Freischaltung also nicht möglich. Einen Workaround zeigt it-training-grote.de, dieser bietet jedoch ein (zugegebenerßen geringes) Missbrauchspotential, da hier mehr IPs als gewünscht freigegeben werden.

/me vs. encfs: Verdammte Sicherheit…

Dieser Artikel lag einige Jahre im Entwurfsordner und ist ggf. nicht mehr aktuell

Vor einigen Wochen las ich einen Artikel über EncFS: Dateiverschlüsselung im Userspace? Funktioniert mit Android? Perfekt für Cloud-Anwendungen! Einige Minuten später war das Tool installiert und die Dateien verschlüsselt. Sicher, oder? Definitiv. Es kam wie es kommen musste: Nach dem letzten Neustart meines PCs das große Fragezeichen: Wie war nochmal das Passwort? Zwar keine all zu wichtigen Dateien, allerdings liegen die ursprünglichen auf einem Laptop, der grade nicht da ist und die Backups – nunja, Bänder dauern. Also auf in den Kampf:

Schritt 1: Wo schwächelt es
Nunja, EncFS setzt auf gut abgehangene Algorithmen – dort auf Schwachstellensuche zu gehen dürfte aussichtslos sein.

Schritt 2: Gewalt ist eine Lösung
Wordlist, PHP, Go – ein kleines Script rückte encfs auf den Leib: Sicher nicht die schnellste Methode, aber bei über 3 Sekunden bis encfs eine Fehlermeldung spuckt käme vermutlich keine Scriptsprache ins Schwitzen. Primitives Multithreading verkürzt die Zeit da schon eher, so laufen dann einige Wörten in diversen Kombinationen durch die Wordlist – ein Testpasswort kann ja nicht zu schwer sein

Schritt 3: Da war ja was
Da der PC beschäftigt ist mal schnell am Server noch Updates machen – moment… Server? Aha – hier ist das EncFS noch geöffnet! Die Daten wären also spätestens jetzt gerettet (aber als braver Admin habe ich natürlich ohnehin ein Backup). Trotzdem: EncFS muss brechen. Die einfachste Methode: Passwort ändern. Keine Chance, hierzu wird das alte Kennwort erneut abgefragt. Schade drum.

Schritt 4: Wo gehobelt wird gibt’s einen Müllsack
Aber denken wir mal logisch: Wenn ich auf die Daten zugreifen kann muss der Key irgendwo sein. Das /proc-Dateisystem gibt schnell Zugriff auf die relevanten Speicherbereiche*, das Tool strings fördert lesbares hervor. Allerdings kein Kennwort. Nunja, Versuch war es wert.

* Der Support für die nötigen Funktionen wurde offenbar aus Sicherheitsgründen aus dem Kernel entfernt, entsprechend muss man bei neueren Kerneln ggf. selbst Hand anlegen.

Schritt 5: Faulheit obsiegt
Ich hab die Daten, ich bin Faul. Also: Neuen Ordner angelegt, neues Kennwort vergeben und die alten Daten neu Synchronisieren. Der ISP flucht, ich hab ruhe

Schritt 6: Geduldige sind schneller fertig
Kopiervorgang bei knapp 50% und es kommt, was kommen musste: Schritt 2 meldet ein vergnügtes „lamepassword“. Ich sollte weniger hak5 gucken. Und bessere Passwörter holen.

Auch am PC: Musiksuche durch vorsummen

Ihr kennt das sicher: Ihr habt eine Melodie im Kopf, kommt aber nicht auf den Namen des Liedes. Am Handy sind vielen vermutlich Dienste wie SoundHound oder Shazam bekannt, welche auch aus nicht wirklich gut gesummt- oder gesungenen Tonaufnahmen die passende Info heraussuchen. Allerdings hat man nun nicht immer ein Handy zu Hand und Google zu durchsuchen ist bequehmer als die Jackentaschen nach dem neuartigem Mobilfunkempfangsgerät. Ergebnis: Der Vorfahre von SoundHound, genannt Midomi, ist noch online und lässt dort auch eine Suche vom PC zu. Leider nur per Flash und nicht mit modernerem HTML5/WebRTC/Whatever-Voodoo, aber zumindest ich hab für solche Museumsseiten noch einen Chromium mit passenden Libraries im Chroot. Und jetzt die MP3 des gesuchten Liedes auf der Platte. DRM-frei versteht sich.

winsxs: Und es geht doch kleiner…

Wer ein neueres Windows nutzt wird ihm sicher schon einmal begegnet sein: C:\Windows\winsxs. Der Spielverderber für alle, welche die Systemplatte gerne etwas schlanker hätten. Seit Windows Vista werden hier bei jeder Systemänderung Kopien der installierten Bibliotheken aufbewahrt. Während man bei älteren Windows-Versionen unter C:\Windows\$NtUninstall* ein ähnliches verhalten sah hat sich mit WinSxs einiges geändert. Zum Ersten: Man darf ihn nicht mehr einfach löschen. Wärend auf älteren Versionen die Dateien ausschließlich zur Deinstallation von Updates dienten werden die älteren Kopien unter Vista und höher auch für Programme und zukünftige Updates herangezogen. Ein Entfernen dieser Dateien kann zu Systemfehlern führen. Hinzu kommt, dass die Ordnergröße trügt: Zwar enthält der Ordner alle gezeigten Dateien, teils sind diese aber auch an anderen Stellen der Partition vorhanen. Dies wird durch die Verwendung von Hard-Links erreicht. Das entfernen der Datei im WinSxs-Ordner würde also nicht nur das System destabilisieren sondern zudem nicht einmal den Platz auf der Festplatte freigeben. Auch sollte man davon absehen den Ordner auf eine andere Festplatte oder Partition zu verschieben – dies würde die Links zerstören und entsprechend ebenfalls dem System schaden.

Auch wenn es nach wie vor einem Kampf gegen Windmühlen gleicht gibt es trotzdem einige Kniffe, mit denen man etwas Platz schaffen kann:

Die Datenträgerbereinigung

Meist müde belächelt kann diese ausnahmsweise Weiterhelfen. Unter anderem finden sich hier ab und an Setupdateien, welche wohl auch in WinSxs deponiert sein können. Auf Servern ist diese im Übrigen nicht verfügbar und müsste ggf. über das Feature „Desktopdarstellung“ nachinstalliert werden. Bei Windows Server 2012 versteckt sich dies unter „User Interface and Infrastructure“.

Wenn noch nicht geschehen benötigt man noch ein Update für Windows 7 oder Windows Server 2008 R2 um dem Tool die Updatebereinigung beizubringen. Mehr gibt es im Technet: Win7, Win2008R2, Win12.

Die Service-Packs

Service-Packs enthalten oft eine vielzahl von Updates, welche bereits in der Vergangenheit separat verteilt wurden. Hat man nicht vor ein Downgrade durchzuführen lassen sich diese fest inst System integrieren. Hierzu öffnet man bei aktuellen Windows-Versionen (>=Windows 7 oder >=Windows Server 2008 R2 Service Pack 1) die Konsole als Administrator und verwendet folgenden Befehl:

DISM.exe /Online /Cleanup-Image /spsuperseded

Der Vorgang kann einige Zeit in anspruch nehmen, auch wenn der Fortschritt mit 100% angegeben wird. Ich konnte den Ordner so immerhin von 20,8 auf 16,1GB verkleinern – eine Ersparnis von über 20%.

Die Backups

Hier kommen wir eher in den ungemütlichen Bereich. Microsoft selbst rät davon ab im Ordner manuell herum zu spielen, aber je nach System hat man meist keine andere Wahl mehr als irgendwo notdürftig Platz zu schaffen. In den meisten Fällen sollte es aber problemlos möglich sein den unterordner „Backup“ zu löschen. Hier werden Bibliotheken hersortiert, welche sonst keine Verwendung finden sollten.

…und nu?

Nach wie vor ist mir der Ordner WinSxs ein Dorn im Auge. Eine Windows-Installation, welche mehr als 40GB frisst macht weder virtualisiert noch physikalisch Spaß. Immerhin kann man mit diesen Tricks etwas Platz schaffen und so den Platztod etwas herauszögern. Ansonsten ist es wie immer eine gute Gelegenheit die Windows-Admins mit einem süffisanten „Mit Linux wär‘ das nich‘ passiert“ zu strafen.

Tipp: Hash Check für Windows

Wenn es darum geht die Integrität einer Datei zu prüfen werden meist Hashwerte verwendet. So lässt sich schnell feststellen, ob ein Download beschädigt oder eine Datei seit der letzten Prüfung manipuliert wurde. Da der Hash aus dem Inhalt berechnet wird ist diese Methode deutlich zuverlässiger als das Prüfen von Metadaten wie z.B. Änderungszeit oder Dateigröße.

Unter Windows ist die bekannteste Software für diesen Zweck HashTab. Es fügt in den Dateieigenschaften einen neuen Reiter hinzu, welcher verschiedenste Hash-Werte zum direkten vergleichen anzeigt. Leider ist die Software nur für private Zwecke kostenlos. Die Business-Version ist mit $10 zwar erschwinglich, aber in vielen Firmen ist die Budgetbeschaffung mit etwas Papierkram verbunden, welche man um „mal schnell“ etwas nachzuschauen gerne umgehen möchte.

Auf meiner Suche bin ich auf HashCheck gestolpert. Diese Software steht unter einer BSD-ähnlichen Lizenz und ist somit auch im komerziellen Umfeld ohne Einschränkungen nutzbar. Zwar bietet HashCheck weniger Features als HashTab, die wichtigen MD5- und SHA-1-Prüfsummen sind jedoch vorhanden womit nahezu all meine Anwendungsbereiche abgedeckt sind. Die obligatorische Spende für gute Projekte kann dann noch dem „mal schnell“ in Ruhe erledigt werden.

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/02/hashcheck.png

 

Falsche Zeitzone im OwnCloud Webinterface

Ich nutze OwnCloud hauptsächlich um u.A. Termine zwischen meinen Mobilgeräten und den PCs auf einem gemeinsamen Stand zu halten. Vor kurzem kam ein Schwung Termine rein,  ich war jedoch an einem Bastellaptop ohne Kallenderanwendung. Kein Problem: Das Webinterface der OwnCloud erlaubt es ja auch Termine einzutragen. Gesagt, getan – im Webinterface tauchte der Termin nach dem Eintragen wie Folgt auf:

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/01/1.png

 

19:30 – passt. Mein Tabelt synchronisierte wenig später und notierte folgendes im Kalender

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/01/Screenshot_2015-01-23-13-15-29-300×86.png

Nanu – eine Stunde Unterschied? Klingt nach Zeitzonenfehler und dieser bestätigt sich auch in Details des Handys.

Etwas Ratlosigkeit – die WebUI in OwnCloud ist bereits auf Deutsch eingestellt. Die Lösung hat etwas gedauert, denn in den Kalenderansicht versteckt sich eine eigene Zeitzoneneinstellung, welche offenbar standardmäßig auf „Abidjan“ steht. Diese findet sich hinter dem Zahnrad in der unteren, linken Ecke. Nach dem Ändern werden neue Termine korrekt abgespeichert.

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/01/2.png

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/01/3-120×300.png

 

Zu Beachten ist, dass die WebUI offenbar keine Zeitzonen beachtet – in der Übersicht werden Termine mit abweichender Zeitzone zwar korrekt angezeigt, bearbeitet man diese wird jedoch die Zeitzone ohne Zeitanpassung auf die aktuelle zurückgesetzt – wer Zeitzonen absichtlich nutzt kann sich so schnell Termine zerschießen.

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/01/4.png

 

[Gentoo] Fehler bei der Installation von net-libs/webkit-gtk-2.4.7

Während eines Updates brach ein Rechner regelmäßig bei der Aktualisierung bzw. Installation von net-libs/webkit-gtk-2.4.7 mit einem Linkerfehler(?) ab. Ursache ist die verwendete GCC-Version (x86_64-pc-linux-gnu-4.7.3) – nach einem Wechsel auf x86_64-pc-linux-gnu-4.8.3 per gcc-config ließ sich das Paket fehlerfrei kompilieren.

Unreal Tournament (1999) unter Arch Linux

Zugegeben, mit über 15 Jahren ist das originale UT etwas betagt, aber wenn man die Installationsmedien findet weckt das doch das Bastlerego – ob es auf einem aktuellen Linux läuft? Sollte eigentlich – das Spiel selbst kann bereits seit längerem über den Loki Installer auf Linux lauffähig zu bekommen. Eher Bedenken hatte ich da bei den Libraries: Sound in Kombination mit Pulseaudio hat mir schon bei RTCW:ET eine Menge Bastelzeit gekostet. Auch der Installer setzt GTK1.2 voraus – findet man heute eher nicht mehr. Glücklicherweise bin ich bei Arch da gleich doppelt im Vorteil: Während man bei Ubuntu & Co. das alte GTK manuell installieren muss kann ich auf ein passendes AUR-Paket zurückgreifen. Oder es sein lassen, denn ein Paket namens „UT1999“ erlaubt die Installation ohne den GUI-Installer. Leider ist auch das Paket nur ein Ansatz, aber keine Lösung. Nachdem die Installations-CDs vom Paket erfolgreich in /opt/ut platziert wurde folgte schnell Ernüchterung. Der Befehl wird ohne Meldung beendet, als Exitcode erscheint ein Fehler.

adlerweb@zeus /opt/ut/System $ ./ut-bin
adlerweb@zeus /opt/ut/System $ echo $?
1

Könnte natürlich eine Library sein, da UT99 eine 32-Bit Binary ist und ich auf einem 64-Bit System arbeite. Kurzer Blick: libgl, SDL, openal – alles genannte ist auch in 32-Bit bereits vorhanden. Nach etwas Suchen half dann der Parameter „-log“ den Fehler genauer zu identifizieren:

adlerweb@zeus /opt/ut/System $ ./ut-bin -log
Unreal engine initialized
Bound to SDLDrv.so
Joystick [0] : Unknown Joystick
SDLClient initialized.
Bound to Render.so
Lighting subsystem initialized
Rendering initialized
LoadMap: Entry
Failed to load 'Entry': Can't find file 'Entry'
Failed to load 'Level None.MyLevel': Can't find file 'Entry'
appError called:
Failed to enter Entry: Can't find file 'Entry'
Executing UObject::StaticShutdownAfterError
Executing USDLClient::ShutdownAfterError
UGameEngine::Init
InitEngine
Preparing to exit.
Purging garbage
Unbound to Engine.so
Unbound to Core.so
-0.0ms Unloading: Package Engine
-0.0ms Unloading: Package Core
Game engine shut down
Unbound to SDLDrv.so
SDL client shut down.
Unbound to Render.so
-0.0ms Unloading: Package Render
Lighting subsystem shut down
Rendering shut down
Garbage: objects: 231->0; refs: 0
Object subsystem successfully closed.
Exiting.
Name subsystem shut down

Hintergrund: Das Paket kopiert die Daten an die falsche Stelle. Doll. (Der offizielle Installer veranstaltet angeblich das selbe). Also räumen wir mal auf:

cd /opt/ut/System/
cp -Rv Entry.unr Entry
cp -Rv AS-* CTF-* DM-* DOM-* EOL_* ../Maps

Und siehe da – kurz darauf sieht man das gute, alte

In 2291, in an attempt to control violence among deep space miners, the New Earth Government legalized no-holds-barred fighting.

Ja, sieht. Denn Ton ist wie erwartet ein Problem. Dankenswerterweise muss man sich hier nicht mit PunkBuster o.Ä. herumärgern und darf direkt herumdoktern. Zuerst wird das Audiosystem auf OSS erzwungen, so ist das Basteln einfacher. Hierzu unter /home/[user]/.loki/System/UnrealTournament.ini die Zeile

AudioDevice=ALAudio.ALAudioSubsystem

durch

AudioDevice=Audio.GenericAudioSubsystem

ersetzen. Danach würde ich eigentlich mit padsp starten, aber dieser lädt lediglich die 64Bit-Version, welche der UT-Binary nichts anhaben kann. Dann machen wir es halt manuell:

LD_PRELOAD="/usr/lib32/pulseaudio/libpulsedsp.so"

Viola:

Liandri Mining Corporation, working with the NEG, established a series of leagues and bloody public exhibitions.

– diesmal aus den Boxen. Auch eine kleine Testrunde lief selbst auf 1920×1080 in bester Qualität (für ’99). Da steht einem Onlinespiel auf einem der über 600 aktiven Gameservern ja nichts im Wege…

[ZFS/Linux] Priorisierung und Systemlast durch Scrubbing kontrollieren

Das Scrubbing ist ein wichtiger Part der regelmäßigen Pflege eines ZFS-Systems. Hierbei liest das System alle belegten Dateisystemblöcke, vergleicht den Inhalt mit der hinterlegten Prüfsumme und korrigiert – wenn nötig – Fehler auf dem Speicher. Hierdurch ist sichergestellt, dass kippende Bits auf den Festplatten nicht den Inhalt der Datei beschädigen und Fehler frühzeitig erkannt werden. Ein Scrub wird hierbei über den Befehl „zpool scrub poolname“ gestartet.

Um Wöchentlich ein Scrubbing aller zpools durchzuführen nutze ich etwas Bash-Magie – das folgende Script erstellt eine Liste aller im System bekannten zpools und führt ein scrubbing dieser durch. Da ich zum Teil mehrere zpools auf Partitionen einer Platte habe wird immer nur ein Scrub simultan durchgeführt, so wird das Storage nicht zu stark belastet.

#!/bin/bash
date
for i in `zpool list | cut -d ' ' -f 1 | tail -n +2` ;do
    echo $i
    zpool scrub $i

    #Voodoo to prevent simultanous scrubs
    while (zpool status audio | grep scan: | grep scrub > /dev/null) ;do
        sleep 60
        #Scrub still running
    done
done
date

Aber auch ein einzelner Scrub stellt für das System eine nicht unerhebliche Last dar, welche sich negativ bemerkbar machen kann. In meinem Fall ist es eine Datenbank mit vielen kleinen Schreiboperationen, welche während des Scrubs nicht hinzunehmende Delays aufweist. Um hier Abhilfe zu schaffen kann ZFS eine Pause einlegen, sobald IO-Aktivität auf dem Pool entdeckt wird. Kontrolliert wird dieser Wert unter Linux mit dem Parameter /sys/module/zfs/parameters/zfs_scrub_delay – dieser ist per Default auf 4 eingestellt. Die Angabe bezieht sich hierbei laut Dokumentation auf Systemticks, bei den meisten Desktop-PCs ist Tickrate von 1000Hz, bei Server meist 100Hz, üblich. Um zu Prüfen wie das eigene System eingestellt ist kann meist folgender Einzeiler verwendet werden:

zcat /proc/config.gz | grep -E "^CONFIG_HZ_.*=y$"
CONFIG_HZ_250=y

Wie zu sehen ist läuft mein System auf 250Hz. Zusammen mit der Angabe oben würde ZFS bei IO also für 16ms (1s/250Hz*4) pausieren. Um mir etwas Zeit zu verschaffen möchte ich diesen Wert auf 250ms erhöhen:

1 Sekunde / 250Hz = 0,004 Sekunden/Tick = 4 Millisekunden/Tick
250 Millisekunden / 4 Millisekunden ~= 63 Ticks

Dieser Wert wird entsprechend dem Parameter zugewiesen.

echo 63 > /sys/module/zfs/parameters/zfs_scrub_delay

Wirklich messbar ist der Unterschied nur schwer, da er sich nur bei kleinen, zeitlich verteilten Operationen und nicht bei den benchmarküblichen und konstanten Sequential und Random-Operationen bemerkbar macht, gefühlt ist die Reaktion jedoch trotz scrub besser geworden.

Natürlich sollte man bedenken, dass der Scrub entsprechend länger dauert, die Werte sollten also nur temporär oder mit viel Vorsicht geändert werden.

Interfacebasiertes OpenVPN-Routing und martian packets

Ab und an sehen meine Wünsche recht speziell aus, ich weiß. Heut sieht die Aufgbe wie folgt aus:

Ein Router besitzt 3 Netzwerkkarten, eth0 ist direkt an das Internet angeschlossen, eth1 versogt das Netzwerk A und eth2 das Netzwerk B. Zusätzlich gibt es über OpenVPN (tap0) einen Link zu einem externen Internetzugang. Ziel ist nun, dass alle Internetanfragen von Netzwerk B (eth2) über das VPN versendet werden, der Rest jedoch nicht.

Der (zusammenkopierte) Entwurf lautete wie folgt:

iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-xmark 0x1/0xffffffff
-> Alles was aus Netzwerk B kommt wird mit Flag 0x1 versehen

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
-> Alles was über tap0 raus geht wird per NAT maskiert

ip route add unreachable default table 42
-> Alles auf der Routingtabelle 42 wird per default abgelehnt

ip rule add from all fwmark 0x1 table 42
-> Alles mit der Markierung 0x1 gehört zur Tabelle 42

ip route replace 0.0.0.0/1 via *OpenVPN-IP* table 42
ip route replace 128.0.0.0/1 via *OpenVPN-IP* table 42
-> Alles auf Tabelle 42 wird über den VPN-Server abgewickelt

net.ipv4.ip_forward ist auf 1

Auf den ersten Blick ist auch alles OK, Netzwerk A und der Server funktionieren fehlerfrei. Vom Netzwerk B ist jedoch kein Internetzugriff möglich. Getreu dem guten alten Troubleshooting-Guide also auf die Suche.

Wenn ich von einem Client in Netzwerk B pinge kommt das Paket am Router auf eth2 an:

[eth2] 10.222.100.53 > 8.8.8.8: ICMP echo request

…und wird auf tap0 nach draußen gesendet:

[tap0] 10.8.0.16 > 8.8.8.8: ICMP echo request

Kurz drauf trifft auch von draußen über das VPN eine Antwort ein:

[tap0] 8.8.8.8 > 10.8.0.16: ICMP echo reply

und dann hing es… Die Antwort wird nicht auf eth2 wieder weitergegeben, dort ist kein Traffic erkennbar. Scheint, als ob irgendwas beim NAT schief geht. Wenn ich logging auf Maximum stelle (net.ipv4.conf.tap0.log_martians=1) ist im syslog folgendes zu lesen:

kernel: IPv4: martian source 10.222.100.53 from 8.8.8.8, on dev tap0

Ich vermute, dass hier das NAT durch die verschiedenen Routing-Tabellen ein zu großes Chaos verursacht. Als „Workarround“ ist auf dem VPN-Interface jetzt Source-Filterung ausgeschaltet (net.ipv4.conf.tap0.rp_filter=0). Da die Gegenseite ohnehin nochmals nattet sollte da nichts böses(™) drüber eintrudeln.

Sollte jemand genauer erklären können was hier passiert freue ich mich über einen Kommentar.