[ 
https://issues.apache.org/jira/browse/SSHD-1055?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17553338#comment-17553338
 ] 

Thomas Wolf commented on SSHD-1055:
-----------------------------------

In SSHD-964, it was claimed that

{quote}When a SSH_MSG_CHANNEL_EOF is received In TcpipClientChannel.handleEof() 
serverSession.shudownOutputStream() causes the socket between SSH client and 
SSH server to be closed, and this is not the right behaviour.
{code}
@Override
public void handleEof() throws IOException {
   super.handleEof();
   serverSession.shudownOutputStream();
}
{code}
{quote}

That is wrong. "Between SSH client and SSH server" would be the tunnel. This 
does _not_ shut down output on the tunnel; it shuts down output on the 
forwarded port's socket on that end. I.e., it propagates the EOF out to the 
whatever is connected on that socket. In the diagrams shown at 
https://github.com/apache/mina-sshd/blob/b91a424/docs/technical/tcpip-forwarding.md
 , this shuts down output on "A", not on the tunnel.

> 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
>            Assignee: Thomas Wolf
>            Priority: Major
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> 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. Start 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 [email protected]
> {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 
> [email protected]
> 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 received 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.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to