3

カスタム 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 で開いているポートを通知させる方法です。

4

0 に答える 0