Jak ustawić ssh, aby za każdym razem próbował nie tylko portu 22, ale również portu dodatkowego?

9

W ramach moich starań, aby zmniejszyć hałas w logach i nieznacznie zmniejszyć wykrywalność (i oprócz fail2ban, umożliwiając tylko uwierzytelnianie za pomocą klucza publicznego itp.) Rutynowo zmieniam porty sshd na serwerach, które skonfigurowałem na inny port, powiedzmy 5492. Obecnie Dodaję -p 5492 do mojego polecenia ssh lub dodaję port dla każdego określonego serwera do mojego ssh_config.

Czy istnieje sposób skonfigurowania ssh, aby próbował połączyć się zarówno z portem 22, jak i 5492, jeśli port 22 nie działa?

Riley
źródło
1
Wolę zamiast bezpieczeństwa poprzez zaciemnienie, konfigurację VPN i brak otwartych portów ssh do Internetu w ogóle.
Rui F Ribeiro
2
@RuiFRibeiro Zgadzam się, że to nie jest bardziej bezpieczne. Jednak zmniejsza hałas w plikach dziennika. Można również użyć przełączania portów, aby zmniejszyć liczbę prób logowania, co zwiększa bezpieczeństwo.
Ned64
2
@RuiFRibeiro Czy serwer VPN jest jednak bezpieczniejszy niż serwer SSH?
Riley
Wszystko zależy od implementacji. W mojej poprzedniej pracy zdefiniowałem 2 wpisy VPN dla redundancji i żadnej sshobecności na zewnątrz.
Rui F Ribeiro
2
Bezpieczeństwo przez zaciemnienie jest dobrą DODATKOWĄ warstwą nad dobrą konfiguracją, szczególnie gdy dotyczy oportunistycznych napastników.
rackandboneman

Odpowiedzi:

11

Możesz owinąć skrypt powłoki, sshale sshsam tego nie zrobi.

Jednym ze sposobów użycia funkcji bash jest (włożenie ~/.bashrc):

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

Nawiasem mówiąc, zaleca się używanie rootportów zarezerwowanych dla usług systemowych, takich jak sshw celu uniknięcia korzystania przez użytkowników z procesu, który nasłuchuje, powiedzmy, na porcie 5492. W przeciwnym razie mogą grać człowieka w środku i przechwytywać dane logowania. Więc użyj portu <1024.

Ned64
źródło
1
To świetne rozwiązanie. Również świetna uwaga na temat portów!
Riley
5
Zauważ, że drugie połączenie zostanie nawiązane, nawet jeśli pierwsze powiedzie się, jeśli polecenie wykonane przez sshzwraca wartość niezerową. Byłby to trywialny przykład ssh user@server false.
Kusalananda
1
@Kusalananda Dzięki, napisałem commandteraz. Po prostu chciałem uniknąć rekurencji, jak dobrze zgadłeś.
Ned64
Problem, o którym wspomina @Kusalananda, można (przeważnie) uniknąć, testując konkretny status wyjścia ssh- jeśli wystąpi błąd ssh (w przeciwieństwie do niepowodzenia polecenia zdalnego), zakończy działanie ze statusem 255. Zatem command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fipowinien działać.
Gordon Davisson
10

sshsama może to zrobić poprzez Matchudokumentowane, ssh_config(5)chociaż dokumentacja jest nieco rzadka w przykładach. Ta forma może być odpowiednia, jeśli ktoś chce zepchnąć złożoność do konfiguracji SSH, choć jest to ograniczone przez ograniczenia ssh_config(5)składni i może wymagać nieco manipulacji w celu uzyskania pożądanego rezultatu. W szczególności nie można ustawić niestandardowego portu lub można go ustawić nieprawidłowo z poprzedniej Matchpróby. Dlatego poniżej jest ustawiany dwukrotnie podczas testowania lub raz dla wartości domyślnej i nie jest ustawiany podczas ustanawiania kanonicznych wartości domyślnych.

# 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 sprawdza tylko, czy coś odpowiada na danym porcie i może wyglądać

#!/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
gałązka
źródło
1
if-then-else w .ssh / config? Nie uwierzyłbym w to !!
Archemar,
1

Możesz użyć funkcji wieloznacznej ~.ssh/config, umieszczając ten wpis na liście:

Host *
Port 5492

Ale samo to nie spadnie do 22.

Jeśli umieścisz go na końcu, nadal możesz go zastąpić dla tych hostów, w których potrzebujesz 22, ustawiając inną wartość powyżej niego. (I zawsze możesz to zmienić w wierszu poleceń).

Paŭlo Ebermann
źródło