Como configurar o ssh para tentar não apenas a porta 22, mas a porta secundária todas as vezes?

9

Como parte do meu esforço para reduzir o ruído nos logs e reduzir um pouco a capacidade de descoberta (e além do fail2ban, permitindo apenas a autenticação de chave pública etc.), eu mudo rotineiramente as portas sshd nos servidores que configurei para uma porta diferente, digamos 5492. Anexo -p 5492 ao meu comando ssh ou adiciono a porta de cada servidor específico ao meu ssh_config.

Existe uma maneira de configurar o ssh para tentar conectar-se às portas 22 e 5492 se a porta 22 não funcionar?

Riley
fonte
1
Prefiro ter segurança através da obscuridade, configurar uma VPN e não ter portas ssh abertas para a Internet em geral.
Rui F Ribeiro
2
@RuiFRibeiro Concordo que não é mais seguro. No entanto, mantém o ruído baixo nos arquivos de log. Pode-se também usar a porta batendo para reduzir as tentativas de login, o que aumenta a segurança.
Ned64
2
@RuiFRibeiro No entanto, um servidor VPN é mais seguro que um servidor SSH?
Riley
Tudo depende da implementação. No meu trabalho anterior, defini 2 entradas VPN para redundância e nenhuma sshpresença para o exterior.
Rui F Ribeiro
2
A segurança pela obscuridade é uma boa camada ADICIONAL, além de uma boa configuração, principalmente quando se trata de invasores oportunistas.
rackandboneman

Respostas:

11

Você pode envolver um script de shell, sshmas sshele não o fará.

Uma maneira de usar uma função bash é esta (colocar em ~/.bashrc):

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

A propósito, é recomendável usar rootportas reservadas para serviços do sistema ssh, a fim de evitar que os usuários tenham um processo que escute, digamos, a porta 5492. Caso contrário, eles podem brincar de homem no meio e possivelmente capturar dados de login. Portanto, use uma porta <1024.

Ned64
fonte
1
Essa é uma ótima solução. Também uma ótima nota sobre os portos!
Riley
5
Observe que a segunda conexão será feita mesmo que a primeira seja bem-sucedida se o comando executado por sshretornar diferente de zero. Um exemplo trivial seria ssh user@server false.
Kusalananda
1
@ Kusalananda Obrigado, eu escrevi commandagora. Só queria evitar a recursão, como você adivinhou certo.
Ned64
O problema que o @Kusalananda menciona pode ser (principalmente) evitado testando o status de saída específico de ssh- se houver um erro ssh (em oposição à falha do comando remoto), ele sairá com um status de 255. Portanto, command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fideve funcionar.
Gordon Davisson
10

sshele próprio pode fazer isso via Matchdocumentado, ssh_config(5)embora a documentação seja um pouco esparsa em exemplos. Esse formulário pode ser adequado se alguém quiser empurrar a complexidade para a configuração do SSH, embora seja restrito pelas limitações da ssh_config(5)sintaxe e possa exigir algumas brincadeiras com o resultado desejado. Notavelmente, a porta personalizada não pode ser configurada ou pode ser configurada incorretamente da Matchtentativa anterior . É por isso que, abaixo, ele é definido duas vezes quando testado, ou uma vez para o padrão, e não é definido ao estabelecer os padrões canônicos.

# 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 apenas verifica se algo responde na porta especificada e pode parecer

#!/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
agitar
fonte
1
if-then-else em .ssh / config? Eu não teria acreditado !!
Archemar 18/02
1

Você pode usar a função curinga de ~.ssh/config, colocando esta entrada na sua lista:

Host *
Port 5492

Mas isso não volta a 22 por si só.

Se você colocar no final, ainda poderá substituí-lo pelos hosts em que precisar 22, colocando um valor diferente acima dele. (E você sempre pode substituí-lo na linha de comando.)

Paŭlo Ebermann
fonte