动态重写tcp流:有多难?如何转储所述流?

Ach*_*lle 3 java linux networking stream tunnel

我正在尝试编写一个tcp流'tunnel'(类似于默认情况下的SSH句柄),但有一个例外,我必须在流经时重写某些信息.

我确定那里有类似的东西,但我找不到它.我有三个主要问题:

  • 是否有一种简单的方法来保存tcp流以供观察?(即使用netcat,或者使用ssh -r/-l/-D,或者使用其他一些实用程序)
  • 在飞行中重写流有多难?

编辑:重写的信息只是初始身份验证.

eph*_*ent 11

带有日志记录的直通隧道可以从现有(或容易找到的)实用程序拼凑在一起.

socat -v -x tcp-l:8080,fork,reuseaddr tcp:localhost:80 2>log

在此示例中,连接到http://localhost:8080/将传递到http://localhost:80/,并记录传输到的数据log.

TCPreen工具专门用于此目的.

如果您具有root权限,则有许多分析器(如tcpdumptcpflow)可以直接从网络捕获数据包,而无需重定向流量.

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)