我想创建java应用程序,这将是我的自定义sshd服务器。 客户端应该能够创建到此服务器的隧道。
现在我有了这个有效的例子:
import org.apache.sshd.SshServer;
import org.apache.sshd.common.ForwardingFilter;
import org.apache.sshd.common.Session;
import org.apache.sshd.common.SshdSocketAddress;
import org.apache.sshd.server.PasswordAuthenticator;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.session.ServerSession;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
// create default server
SshServer server = SshServer.setUpDefaultServer();
server.setPasswordAuthenticator(new PasswordAuthenticator() {
@Override
public boolean authenticate(String username, String password, ServerSession session) {
return true; // auth everyone
}
});
server.setPort(2222);
// allow forwarding
server.setTcpipForwardingFilter(new ForwardingFilter() {
@Override
public boolean canForwardAgent(Session session) {
return true;
}
@Override
public boolean canForwardX11(Session session) {
return true;
}
@Override
public boolean canListen(SshdSocketAddress address, Session session) {
return true;
}
@Override
public boolean canConnect(SshdSocketAddress address, Session session) {
return true;
}
});
// random hostkey provider
server.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey"));
server.start(); // start server
}
}
此时,我有最小的sshd服务器。在运行时,可以建立隧道:
ssh user @ host -p 2222 -R port:host:port -N
问题是,用户无法两次创建到同一端口的隧道。第一次连接成功,但在隧道断开连接后重新连接服务器说,该端口已在使用中。
第二个问题是通过外部IP无法建立连接。
例如,服务器是192.168.1.10。客户端构建隧道到服务器并转发端口2020。
现在,nmap -p 2020 localhost
会说,该端口已打开,但nmap -p 2020 192.168.1.10
会说该端口已关闭。
我想问的是如何强制sshd服务器重用先前使用过的封闭端口,以及如何让它在外部IP上宣布打开的端口。