Nachdem mein eigentlich richtig konfigurierter Postfix nach wenigen Stunden online schon als Spamschleuder herhalten musste habe ich beschlossen herauszufinden wie die Spammer ihn zum Senden überreden konnten.
Dazu habe ich mit Java Sockets eine Art “Multithreaded SMTP Logging Proxy Server” programmiert, der die Verbindungen an einen SMTP Server weiterleitet und nach Abschluss einer Verbindungen die übertragenen Nachrichten auf der Konsole ausgibt.
Was noch fehlt ist Logging in Dateien (und zwar Nachrichten- anstatt Verbindunsweise) sowie sinnvolle Möglichkeiten zur Konfiguration, aber die ist mehr eine Sache des “Loaders”, da der Proxy an sich keine main-Funktion hat und alles was ich derzeit als Parameter vorgesehen habe bei der Instanzierung übergeben wird.
Ein paar Worte zur Architektur:
Die Klasse SMTPManager ist quasi der Kern des Proxies, sie wird vom Loader instanziert und erstellt ihrerseits einen SMTPListener sowie eine Anzahl von SMTPWorker-Threads (kann zunehmen, aber nicht ab). Dieser hat die Aufgabe auf eingehende Verbindungen zu warten und den SMTPManager über solche zu informieren. Eigentlich sollte der SMTPListener ein Thread werden, was ich dann aber doch nicht gemacht habe (d.h. man könnte SMTPListener auch in SMTPManager integrieren, was ich vielleicht später einmal machen werde). Sobald der SMTPListener nun eine eingehende Verbindung bekommt (ServerSocket.accept() halt) wird der neue Client per SMTPManager.assignClient(int Clientid, Socket Client) einem freien SMTPWorker (ja, hier ist der Multithreaded-Part
zugewiesen.
Der SMTPWorker verbindet sich dann seinerseits mit dem eigentlichem SMTP Server (in meinem Fall also Postfix mit geändertem Port) und leitet einfach alle Nachrichten in beiden Richtungen weiter. Nebenbei loggt er alles in einer Variable die er, zusammen mit der Clientnummer, an den SMTPManager übergibt sobald die Verbindung von Client oder Server geschlossen wurde und bevor er sich wieder als frei markiert.
Ein Problem ist derzeit noch, dass die Log-Variable nur ein String ist und deswegen überlaufen könnte (d.h. eine Dateibasierte Echtzeitabspeicherung ist von hoher Priorität).
Ausserdem kommen aus Sicht des SMTP Servers alle Verbindungen von Localhost, d.h. dieser muss entsprechend konfiguriert werden, oder auch: Relays von 127.0.0.1/8 zu erlauben ist mit diesem Proxy eine wirklich, wirklich blöde Idee ![]()
Was auch sehr wichtig ist: Der Proxy schützt nicht vor Spam, er soll nur dabei helfen herauszufinden, wie Spammer E-Mails relayen können. Es ist also wichtig Port 25 ausgehend zu sperren (ich mache das z.B. in meiner Firewall, diese erzeugt dann für mich automatisch passende iptables Regeln. Wer kein solches Firewallscript hat kann einfach mal nach iptables Googeln – das sollte man nämlich noch gerade so hinbekommen wenn man einen Mailserver betreiben will
)
Sobald der Code etwas besser dokumentiert ist (derzeit fast keine Kommentare) und mir ein Name einfällt (SMTProxy gibt es leider schon als Working Title, sollte aber bald frei werden *g*) werde ich ihn unter GPL veröffentlichen.
Wer vorher schon einen Blick drauf werfen will findet einen Snapshot hier: http://blog.seb7.de/smtp.tar.gz
[UPDATE] Neue Version 1.1, siehe https://sebmeyer.de/?p=19
Fehlt eigentlich nurnoch, dass mein Server wieder als Spam Relay “missbraucht” wird (kann ja nix passieren, da E-Mails nicht zugestellt werden und ich vorm Deaktivieren der Firewall alle anstehenden Mails per postsuper -d ALL lösche) , aber nein, natürlich findet mich diesmal nach über einem Tag kein Spammer… *grml* *wart*
Gruß, Sebastian

