vert-x3 / issues

Apache License 2.0
36 stars 7 forks source link

TCP proxy ssh error #638

Closed losyn closed 11 months ago

losyn commented 11 months ago

public class VpsVerticle extends AbstractVerticle {
    private static final Map<String, Vps> vps = new ConcurrentHashMap<>();

    @Override
    public void start(Promise<Void> promise) {
        vertx.createNetServer().connectHandler(server -> {
            System.out.println("PTO: " + server.remoteAddress());
            vertx.createNetClient().connect(22, "192.168.10.211", event -> {
                if (event.succeeded()) {
                    vps.put("xxxxx", new Vps(server, event.result()).proxy());
                } else {
                    event.cause().printStackTrace();
                }
            });
        }).listen(10022, tcp -> {
            if (tcp.succeeded()) {
                System.out.println("proxy:10022");
                promise.complete();
            } else {
                promise.fail(tcp.cause());
            }
        });
    }
}
public class Vps implements Serializable {
    private static final long serialVersionUID = -4212035958492348735L;
    private final NetSocket server,client;

    public Vps(NetSocket server, NetSocket client) {
        this.server = server;
        this.client = client;
    }

    public Vps proxy() {
        //转发到客户端
        server.handler(buffer -> {
            System.out.println("111==" + BytesHelper.string(buffer.getBytes()));
            client.write(buffer);
        });
        //转发给终端
        client.handler(buffer -> {
            System.out.println("222==" + BytesHelper.string(buffer.getBytes()));
            server.write(buffer);
        });
        //服务关闭
        server.closeHandler(v -> client.close());
        client.closeHandler(v -> server.close());
        //服务异常
        server.exceptionHandler(e -> {
            e.printStackTrace();
            close();
        });
        client.exceptionHandler(e -> {
            e.printStackTrace();
            close();
        }); return this;
    }

    private void close() {
        server.close();
        client.close();
    }
}
$$     ssh -p 10022 root@127.0.0.1

Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to 10.21.101.149 port 10022: message authentication code incorrect
vietj commented 11 months ago

can you describe what the issue is precisely ?

losyn commented 11 months ago

After using the above code to execute, I was unable to connect to the target service using a shell

vietj commented 11 months ago

I think it is because your server does not implement the SSH protocol

vietj commented 11 months ago

hum actually the issue is that you are loosing packets and you should pause the server socket from reading buffers until you are connected with the NetClient, your code should look like:

vertx.createNetServer().connectHandler(server -> {
            server.pause();
            vertx.createNetClient().connect(22, "192.168.10.211", event -> {
                if (event.succeeded()) {
                    vps.put("xxxxx", new Vps(server, event.result()).proxy());
                    server.resume();
                } else {
                    event.cause().printStackTrace();
                }
            });
        }).listen(10022, tcp -> {
            if (tcp.succeeded()) {
                System.out.println("proxy:10022");
                promise.complete();
            } else {
                promise.fail(tcp.cause());
            }
        });