TCP-Proxy zur Analyse einer Netzwerkverbindung mit Node.js

Submitted by Erik Wegner on
Body

Um zu sehen, wie sich ein Client- und ein Serverprogramm über das Netzwerk unterhalten, kann ein protokollierender Proxy dazwischengeschaltet werden.

Unter http://delog.wordpress.com/2011/04/08/a-simple-tcp-proxy-in-node-js/ findet sich der Quellcode eines solchen Proxies, der für TCP-Verbindungen genutzt werden kann.

An den entsprechenden Stellen habe ich noch die Ausgabe der Daten ergänzt, sodass die Kommunikation auf der Kommandozeile verfolgt werden kann.

proxy script
var util = require('util');
var net = require("net");

process.on("uncaughtException", function(e) {
console.log(e);
});

if (process.argv.length != 5) {
console.log("Require the following command line arguments:" +
" proxy_port service_host service_port");
console.log(" e.g. 9001 www.google.com 80");
process.exit();
}

var proxyPort = process.argv[2];
var serviceHost = process.argv[3];
var servicePort = process.argv[4];

net.createServer(function (proxySocket) {
var connected = false;
var buffers = new Array();
var serviceSocket = new net.Socket();
serviceSocket.connect(parseInt(servicePort), serviceHost, function() {
connected = true;
if (buffers.length > 0) {
for (i = 0; i < buffers.length; i++) {
//console.log(buffers[i]);
serviceSocket.write(buffers[i]);
}
}
});
proxySocket.on("error", function (e) {
serviceSocket.end();
});
serviceSocket.on("error", function (e) {
console.log("Could not connect to service at host "
+ serviceHost + ', port ' + servicePort);
proxySocket.end();
});
proxySocket.on("data", function (data) {
if (connected) {
console.log("Send: " + data.toString());
serviceSocket.write(data);
} else {
buffers[buffers.length] = data;
}
});
serviceSocket.on("data", function(data) {
console.log("Recv: " + data.toString());
proxySocket.write(data);
});
proxySocket.on("close", function(had_error) {
serviceSocket.end();
});
serviceSocket.on("close", function(had_error) {
proxySocket.end();
});
}).listen(proxyPort)

Um nun die Verbindung zu beobachten, startet man node mit den entsprechenden Parametern, hier am Beispiel einer SMTP-Verbindung auf Port 25:

node tcpproxy.js 25 myrealmailserver 25

Nun kann ein beliebiges E-Mailprogramm angewiesen werden, als Server den Rechner zu nutzen, auf dem der Proxy läuft, der Proxy schickt die Daten an den »echten« Mailserver weiter.