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


9

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

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


1
私は、あいまいさを介してセキュリティを確保するよりも、VPNを設定して、インターネットへのsshポートをまったく開かないようにしています。
ルイFリベイロ

2
@RuiFRibeiro私は同意します、それはより安全ではありません。ただし、ログファイルのノイズは抑えられます。また、ポートノッキングを使用してログイン試行を減らし、セキュリティを向上させることもできます。
Ned64 2018

2
@RuiFRibeiro VPNサーバーはSSHサーバーよりも安全ですか?
ライリー

それはすべて実装に依存します。以前の仕事では、冗長性のために2つのVPNエントリを定義しsshましたが、外部にはまったく存在しませんでした。
ルイFリベイロ

2
あいまいさによるセキュリティは、特に日和見主義の攻撃者に関する場合には、適切な設定に加えて、追加の適切なレイヤーです。
rackandboneman 2018

回答:


11

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

bash関数を使用する1つの方法は次の~/.bashrcとおりです(に入力):

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

ちなみに、ユーザーがポート5492などをリッスンするプロセスを回避するために、システムサービスにはroot-reservedポートを使用することをお勧めしsshます。したがって、1024未満のポートを使用します。


1
それは素晴らしい解決策です。また、ポートについての素晴らしいメモ!
ライリー

5
によって実行されたコマンドがゼロ以外の値を返した場合、最初の接続成功しても2番目の接続確立されることに注意してくださいssh。些細な例はでしょうssh user@server false
クサラナンダ

1
@Kusalanandaありがとう、私はcommand今書いています。あなたが正しいと推測したように、再帰を避けたかっただけです。
Ned64 2018

@Kusalanandaが言及する問題は、特定の終了ステータスをテストすることで(ほとんど)回避できますssh-(リモートコマンドの失敗とは対照的に)sshエラーがある場合、ステータスは255で終了します。したがって、動作するcommand ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fiはずです。
Gordon Davisson、2018

10

ssh例ではドキュメントがややまばらですが、それ自体がMatchドキュメント化された方法でこれを行うことができますssh_config(5)。この形式は、SSH構成に複雑さをプッシュしたい場合に適していssh_config(5)ますが、構文の制限によって制限されており、目的の結果を得るためにいくつかの操作が必要になる場合があります。特に、カスタムポートを設定できないか、前回の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

1
.ssh / configのif-then-else?信じられなかった!
Archemar

1

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

Host *
Port 5492

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.