リモートポート転送が動的にポートを割り当てることができることを知っています。
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トンネルに動的に割り当てられたポートの保存、助けることができます。