大昔からポートフォーワード、リバース関連のツールはたくさんありました:
ssh, nc, socat, redir...。(tcp tunnel port forwardでgoogle画像を見れば分かる)。
ただし、Windows上は、上記のようなツールを利用しようとすると、幾つか現実問題に遭遇します:
- インストーラや実行ファイルは、署名されていないので、信頼できません。
- 企業のセキュリティポリシーに利用が制限されます。
- 自分でソースからコンパイルするのは面倒。
- 極簡単なニーズなのに、sshのような複雑なツールに苦労しなければなりません。
- socatなどは接続情報不明瞭。
- socatなどのポートフォーワードは効率良くない(forkを利用するので)。
一方、Windows上は、IPHelperサービスにより提供しているportproxy機能はあります(netsh portproxyコマンドでポートフォーワードを設定できます)。ただし、パフォーマンスが良くないし、変なエラーが出てます(接続は切られたり)。これはおそらく、HalfOpen関連の処理に不十分です。
Node.jsの世界にもこのへんのツールは少しありますが、期待通りのシンプルではありません。
いいや、納得できません。やはり、作りましょう。
-
tunnel.js
これはsshトンネルの超簡潔版です:TCPポートのフォーワードやリバース over TCPトンネル。設定なし、パスワードなし! adb forwardやreverseの感じです。
利用例:tunnel-listen.js 8888
でTCPトンネルサーバを起動し、tunnel-connect.js トンネルサーバ:8888 forward 8080 宛先:80
で現在マシンの8080をトンネルサーバ経由宛先:80へフォーワードする。逆に、tunnel-connect.js トンネルサーバ:8888 reverse 8080 宛先:80
はトンネルサーバ上の8080を現在マシン経由www.yahoo.co.jp:80へフォーワードする。
-
forward.js
これは単純なポートフォーワドです。パフォーマンスはいい。それに、ENTERキーで中継情報(接続や、データ)は見れます。もう一つ特長は、フォーワード先のソケットサーバはAllowHalfOpenである場合でも対応しています。
ちなみに、ncの超簡潔版nc.jsも作りました。既存のncのサーバモードのコマンドラインの不統一、入力を複数クライアントに送信できないなど、接続情報不明など問題を解消しました。