TCP-Proxy zur Analyse einer Netzwerkverbindung mit Node.js

Gespeichert von Erik Wegner am/um Fr, 31.01.2014 - 14:34
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.

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.