カスタム sshd サーバーとなる Java アプリケーションを作成したいと考えています。クライアントは、このサーバーへのトンネルを作成できる必要があります。
今、私はこの実用的な例を持っています:
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 ポート:ホスト:ポート -N
問題は、ユーザーが同じポートへのトンネルを 2 回作成できないことです。最初の接続は成功しますが、サーバーがトンネルを切断して再接続すると、そのポートは既に使用されています。
2 つ目の問題は、外部 IP 経由で接続できないことです。
たとえば、サーバーは 192.168.1.10 です。クライアントはサーバーへのトンネルを構築し、ポート 2020 を転送します。ここでnmap -p 2020 localhost
、そのポートが開いているnmap -p 2020 192.168.1.10
と言いますが、そのポートは閉じていると言います。
私が尋ねようとしているのは、以前に使用されていた閉じられたポートを sshd サーバーに強制的に再利用させる方法と、外部 IP で開いているポートを通知させる方法です。