動的ローカルポート転送を使用するSSH

動的ローカルポート転送を使用するSSH

リモートポート転送が動的にポートを割り当てることができることを知っています。

ssh remote -R 0:10.19.24.19:5555

しかし、残念ながら、リモートサーバーはiptables広範囲のポートをブロックします。

SSHがローカルでポートを動的に割り当てる方法はありますか?それはまるで

ssh remote -L 0:10.19.24.19:5555

ただし、上記のコマンドは常にエラーを発生させます。

2023年2月3日修正

状況はこんな感じです。複数のポート転送を管理するためのツールを開発しています。残念ながら、セキュリティ上の理由から、リモートサーバーには利用可能なポート数が少なくなります。サーバー管理者は制限を軽減することはできません。したがって、転送用にローカルポートを動的に割り当てることができることを願っています。

ローカル転送は任意のポート割り当てをサポートしていないため、シェル関数を使用して任意のポート番号を生成することにしました。そして、ss配信が成功したかどうかをテストするために使用されます。

_next_port() {
    local lower_port upper_port
    read lower_port upper_port </proc/sys/net/ipv4/ip_local_port_range
    while true; do
        local port=$(shuf -i $lower_port-$upper_port -n 1)
        if [[ $(ss -tulpH "sport == $port") == "" ]]; then
            echo $port
        fi
    done
}

事件は終わりましたか?

答え1

sshポートフォワーディング機能を誤って理解しているようです。ローカル/リモートポートはSSHチャネルを介して送信され、ファイアウォール制御とはほとんど関係ありません。

最初の例では、このコマンドはランダムに割り当てられた受信ポートを生成しますremoteHost。プロセスがremoteHost接続されると、トラフィックはルーティングされます。ローカルクライアントからSSH経由で送信システムのポート 5555 を使用するには10.19.24.19:

   ssh -R 0:10.19.24.19:5555 remoteHost

直接remoteHostネットワークアクセスは必要ありません10.19.24.19。これがリモート転送機能の鍵です。

したがって、iptablesこのポートを介してアクセスを制御する方法はなく、システム管理者が課した制限(使用可能な開いているポートの数を説明する制限)は影響しません。

sshランダムポート番号を選択するよりもリモートポート番号を定義すると、はるかに簡単になると思います。しかし、動的に定義することにした場合は、StackExchangeに対する別の答え(ここでは私の答え)SSHトンネルに動的に割り当てられたポートの保存、助けることができます。

関連情報