web-dev-qa-db-ja.com

ポート22だけでなくセカンダリポートも毎回試すようにsshを設定するにはどうすればよいですか?

ログのノイズを減らし、発見可能性を少し減らす(そしてfail2banに加えて、公開鍵認証のみを許可するなど)ための私の努力の一環として、別のポートに設定したサーバーのsshdポートを定期的に変更します(例:5492)。 sshコマンドに-p 5492を追加するか、特定の各サーバーのポートをssh_configに追加します。

ポート22が機能しない場合に、ポート22とポート5492の両方に接続するようにsshを構成する方法はありますか?

9
Riley

シェルスクリプトをsshでラップすることもできますが、ssh自体はそれを行いません。

Bash関数を使用する1つの方法はこれです(~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }

ちなみに、rootのようなシステムサービスでは、ユーザーがリッスンするプロセスを回避するために、 ssh- reserved ports を使用することをお勧めします。ポート5492。そうしないと、途中で人を演じたり、ログインデータを取得したりする可能性があります。したがって、1024未満のポートを使用します。

11
Ned64

ssh自体は、 ssh_config(5) に記載されているMatchを介してこれを行うことができますが、ドキュメントの例はやや疎です。この形式は、ssh_config(5)構文の制限によって制限され、SSH構成に複雑さをプッシュする場合に適している可能性があります。特に、カスタムポートを設定できないか、以前のMatch試行から誤って設定されている可能性があります。これが、以下では、テスト時に2回、またはデフォルトに対して1回設定され、正規のデフォルトを確立するときに設定されない理由です。

# here we set the defaults for the Host (no port!)
Match !canonical Host testhost
  CanonicalizeHostname yes
  Hostname 192.0.2.42
  IdentityFile ~/.ssh/id_blahblah
  ...
# port available?
Match canonical Host 192.0.2.42 exec "is-ssh-up %h 2222"
  Port 2222
# or the default port
Match canonical Host 192.0.2.42
  Port 22

is-ssh-upは、指定されたポートで何かが応答するかどうかを確認するだけで、次のようになります。

#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
   puts stderr "Usage: is-ssh-up Host port"
   exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot
10
thrig

~.ssh/configのワイルドカード関数を使用して、このエントリをリストに追加できます。

Host *
Port 5492

しかし、これだけでは22に戻りません。

最後に配置した場合でも、22が必要な場合は、その上に別の値を配置することで、それらのホストを上書きできます。 (そして、あなたはいつでもそれをコマンドラインで上書きすることができます。)

1
Paŭlo Ebermann