You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Feng Jiajie (Jira)" <ji...@apache.org> on 2020/08/15 06:41:00 UTC

[jira] [Created] (SSHD-1055) Remote port forwarding mode does not handle EOF properly

Feng Jiajie created SSHD-1055:
---------------------------------

             Summary: Remote port forwarding mode does not handle EOF properly
                 Key: SSHD-1055
                 URL: https://issues.apache.org/jira/browse/SSHD-1055
             Project: MINA SSHD
          Issue Type: Bug
    Affects Versions: 2.5.1
            Reporter: Feng Jiajie


I want to call the remote server's gRPC service locally through an SSH tunnel. 

MyApp -> MINA SSHD -> \{Internet} -> gRPC Server

It works just fine with OpenSSH, but there is a small problem(no problems with core functions, only in unusual circumstances) with Mina SSHD.

I think the problem is Mina SSHD's handling of EOF.

Here is the example:

Step 1. Sstart a gRPC server:

Because we only need a gRPC server to reproduce the problem, so I write a simple version without any service:

 
{code:java}
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty-shaded</artifactId>
    <version>1.27.2</version>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-protobuf</artifactId>
    <version>1.27.2</version>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-stub</artifactId>
    <version>1.27.2</version>
</dependency>

{code}
main:

 
{code:java}
import io.grpc.Server;
import io.grpc.ServerBuilder;

public class EmptyGrpcServer {
  public static void main(String[] args) throws Exception {
    Server server = ServerBuilder.forPort(23645).build().start();
    server.awaitTermination();
  }
}
{code}
Full example can be fond here: [https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java]

 

Step 2. Start a MINA SSHD server:

 
{code:java}
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import java.nio.file.Paths;

public class Example1 {

  public static void main(String[] args) throws Exception {
    SshServer sshd = SshServer.setUpDefaultServer();
    sshd.setPort(12133);
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(Paths.get("/tmp/a.ser")));

    sshd.setPasswordAuthenticator((username, password, session) -> true);
    sshd.setForwardingFilter(AcceptAllForwardingFilter.INSTANCE);
    sshd.start();
    Thread.sleep(10000000);
  }
}

{code}
 

 

Step 3. Create a channel using ssh client

 
{code:java}
ssh -o 'ExitOnForwardFailure yes' -vvv -p 12133 -f -x -N -T -R 0.0.0.0:0:127.0.0.1:23645 test5@127.0.0.1
{code}
 

 

Step 4. Reproduce

If I connect directly to the gRPC server using curl, cause gRPC using http/2, I would get error output like this:

 
{code:java}
$ curl 127.0.0.1:23645
���+Unexpected HTTP/1.x request: GET /
${code}
Then if I do step 3 with an OpenSSH server, I would get same error output:

 

 
{code:java}
$ ssh -o 'ExitOnForwardFailure yes' -f -x -N -T -R 0.0.0.0:0:127.0.0.1:23645 work@dev.kbyte.cn
Allocated port 13525 for remote forward to 127.0.0.1:23645
$
$ curl dev.kbyte.cn:13525
���+Unexpected HTTP/1.x request: GET /
$
{code}
But when I do step 3 with MINA SSHD, curl would stuck without any output:

 

 
{code:java}
$ curl 127.0.0.1:55604


{code}
I found MINA SSHD had already got and wrote the package with the string "Unexpected.HTTP/1.x.request:.GET", and receive SSH_MSG_CHANNEL_EOF.

So I think handleEof should do more? like send SSH_MSG_CHANNEL_EOF to curl?

 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@mina.apache.org
For additional commands, e-mail: dev-help@mina.apache.org