Add new comment

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.

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.

CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.