node.jsでTCPプロキシ&ポートフォワーディング
node.jsでTCPプロキシ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
var util = require('util'); var net = require("net"); process.on("uncaughtException", function(e) { console.log(e); }); if (process.argv.length != 5) { console.log("引数が正しく入力されていません:" + " proxy_port target_host target_port"); console.log("node scriptfile 3000 www.google.com 80"); process.exit(); } var proxyPort = process.argv[2]; var targetHost = process.argv[3]; var targetPort = process.argv[4]; net.createServer(function (proxySocket) { var connected = false; var buffers = new Array(); var targetSocket = new net.Socket(); targetSocket.connect(parseInt(targetPort), targetHost, function() { connected = true; if (buffers.length > 0) { for (i = 0; i < buffers.length; i++) { console.log(buffers[i].toString()); targetSocket.write(buffers[i]); } } }); proxySocket.on("error", function (e) { targetSocket.end(); }); targetSocket.on("error", function (e) { console.log("targethostに接続できません " + targetHost + ', port ' + targetPort); proxySocket.end(); }); proxySocket.on("data", function (data) { console.log("send: "+data.toString()); //送信データ if (connected) { targetSocket.write(data); } else { buffers[buffers.length] = data; } }); targetSocket.on("data", function(data) { console.log("rec: " + data.toString()); //受信データ proxySocket.write(data); }); proxySocket.on("close", function(had_error) { targetSocket.end(); }); targetSocket.on("close", function(had_error) { proxySocket.end(); }); }).listen(proxyPort); |
使い方)
1 |
$ node tcp_proxy.js [プロキシポート] [ターゲットホスト] [ターゲットポート] |
例)
1 |
$ node tcp_proxy.js 23 example.com 23 |
tcp_proxy.jsを実行した端末で、ローカルホストにtelnetクライアントで接続すると、プロキシ経由でexample.comにアクセスします。
smtpとかsshとかいろんなプロトコルで試してみると面白いかも?
http-proxyモジュールを使ったポートフォワーディング
モジュールのインストール
1 |
npm install http-proxy |
1 2 3 4 5 6 7 8 9 10 |
var httpProxy = require('http-proxy'); var options = { hostnameOnly:true, router: { 'example.com': '127.0.0.1:8080', 'hoge.example.com': '127.0.0.1:9090' } } httpProxy.createServer(options).listen(80); |
実行すると80番ポートでlistenして、example.comにアクセスしてきた通信を8080ポートに、hoge.example.comでアクセスしてきた通信を9090ポートに送信します。