首页 > 解决方案 > Apache Mina SSHD 端口转发,如 NGROK

问题描述

我正在尝试实现一个“动态”代理转发以从 Internet 访问 localhost,例如纯 Java 中的 Ngrok。

这家伙基本上做同样的事情:https ://serveo.net/#intro (但是,没有客户端)

想法是在服务器上使用相同的端口,并基于子域为每个客户端创建一个动态代理

问题是默认实现在第二个连接上抛出错误..说端口已经打开。

org.apache.sshd.common.forward.DefaultForwardingFilter #doBind

谁知道如何实现这一点?这样做的好处是,您甚至不需要像 Ngrok 这样的客户端……只需使用普通的 ssh 就可以了。

ssh -R http2:9000:localhost:8002 localhost -p 4440
ssh -R http2:pSERVER:localhost:pLOCAL localhost -p SSHD_PORT

我想象的一个选项是在服务器上动态生成端口:忽略“pSERVER”端口,并创建一个 HttpProxy,为每个端口进行重定向。但是我发现这非常低效,我相信只能通过分析请求标头并为相应的通道/连接进行重定向来完成

标签: javanettyapache-mina

解决方案


太头疼之后。代码质量非常低,只是可以实现的概念证明。

实现的想法是通过更改sshd-netty,并添加一个功能来解包http请求并删除HOST HEADER(这里需要改进)。

服务器上只使用了一个端口,它是一种客户端的反向代理......

我希望开发人员的帮助来改进有问题的代码。我对 Netty 和 Mina 的了解非常有限。

欣赏:
来源:https ://github.com/ricardojlrufino/sshd-dyn-tunneling

测试:打开 2 个连接:

ssh -v -R http1:9000:localhost:8001 localhost -p 4440   
ssh -v -R http2:9000:localhost:8002 localhost -p 4440

提出要求:

curl -v -H "Host: http1" http1:9000  
curl -v -H "Host: http2" http2:9000  

启动测试服务器: https ://github.com/ricardojlrufino/sshd-dyn-tunneling/blob/tunel/src/test/resources/setup_remotes.sh


推荐阅读