ロギングを備えたストレートパススルートンネルは、既存の(または簡単に見つけられる)ユーティリティから一緒に石畳にすることができます。
socat -v -x tcp-l:8080、fork、reuseaddr tcp:localhost:80 2> log
この例では、に接続するhttp://localhost:8080/
とに渡されhttp://localhost:80/
、ログデータはに転送されlog
ます。
ツールTCPreenは、まさにこの目的に特化しています。
root権限を持っている場合、トラフィックをリダイレクトすることなく、ネットワークから直接パケットをキャプチャできるtcpdumpやtcpflowなどの多くのアナライザがあります。
socat
また、文字を削除/追加/置換するオプションを使用して,cr
、非常に基本的なストリーム変更を行うこともできます。,crnl
\r
いずれにせよ、元の質問に戻りましょう…Javaを作成してから何年も経ち、これはまったくテストされていませんが、再送信する前にトラフィックを変更できるトンネルは難しくありません。
public class ForwardAndChangeCaseThread extends Thread {
private Socket in, out;
public ForwardAndChangeCaseThread(Socket in, Socket out) {
this.in = in; this.out = out;
}
public void run() {
byte[] buf = new byte[4096];
InputStream in = this.in.getInputStream();
OutputStream out = this.out.getOutputStream();
int count;
while ((count = in.read(buf)) > 0) {
for (int i = 0; i < count; i++)
if (buf[i] >= 0x40) buf[i] ^= 0x20;
out.write(buf, 0, count);
}
}
}
public class TcpForwarder {
public static void main(String[] args) {
ServerSocket listen = new ServerSocket(8080, 1);
for (;;) {
Socket local = listen.accept();
Socket remote = new Socket("localhost", 80);
new ForwardAndChangeCaseThread(local, remote).start();
new ForwardAndChangeCaseThread(remote, local).start();
}
}
}