Reinicia um túnel ssh reverso específico?

6

Eu tenho várias máquinas em estado selvagem que abrem conexões reversas do ssh com meu servidor. Cada máquina lá fora está usando uma porta ssh reversa diferente, que eu uso para diferenciar entre as máquinas. Eu uso esses túneis para logar nas máquinas do servidor (obviamente):

me@server:~$ ssh -p 2219 root@localhost
Last login: Sun Jun  7 00:18:44 2015 from localhost
root@remote_machine:~#

As máquinas remotas estão usando tecnologias de acesso bastante diferentes (DSL, VSAT, GPRS / EDGE / 3G / 4G), então a resistência da conexão reversa ssh difere um pouco - e aqui aparentemente está o problema.

Isso é o que nmap lista depois de um período ocioso mais longo (ou seja, nenhum túnel ssh foi reiniciado à força, veja abaixo):

me@server:~$ sudo nmap -sS -p 1000-3000 --open localhost

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:09 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000014s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
Not shown: 1988 closed ports
PORT     STATE SERVICE
1133/tcp open  unknown
1270/tcp open  ssserver
1356/tcp open  cuillamartin
1590/tcp open  unknown
1760/tcp open  unknown
1772/tcp open  unknown
1823/tcp open  unknown
1825/tcp open  unknown
1842/tcp open  unknown
1907/tcp open  unknown
2078/tcp open  unknown
2168/tcp open  unknown
2185/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
me@server:~$

Agora, isso é muito poucas conexões, então vamos matá-las e esperar que as conexões externas voltem:

me@server:~$ for i in $(ps axww|grep ssh_key_used_for_reverse_connctions|grep sshd|sed -e 's/^[ \t]*//'|cut -d " " -f 1); do sudo kill -9 $i; done
me@server:~$

Ok, todas as conexões desapareceram:

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:13 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000014s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
All 2002 scanned ports on localhost (127.0.0.1) are closed

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

Vamos aguardar (as máquinas remotas tentam a cada 30 segundos para estabelecer uma nova conexão) e ver o que está chegando agora:

me@server:~$ sudo nmap -sS -p 1000-3000 --open localhost

Starting Nmap 5.21 ( http://nmap.org ) at 2015-06-07 11:14 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000015s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
Not shown: 1950 closed ports
PORT     STATE SERVICE
1125/tcp open  unknown
1129/tcp open  unknown
1133/tcp open  unknown
1155/tcp open  unknown
1156/tcp open  unknown
1157/tcp open  unknown
1162/tcp open  unknown
1176/tcp open  unknown
1185/tcp open  unknown
1198/tcp open  unknown
1215/tcp open  unknown
1269/tcp open  unknown
1270/tcp open  ssserver
1343/tcp open  unknown
1345/tcp open  unknown
1351/tcp open  equationbuilder
1356/tcp open  cuillamartin
1420/tcp open  timbuktu-srv4
1432/tcp open  blueberry-lm
1541/tcp open  rds2
1590/tcp open  unknown
1698/tcp open  unknown
1743/tcp open  unknown
1760/tcp open  unknown
1772/tcp open  unknown
1773/tcp open  unknown
1812/tcp open  unknown
1823/tcp open  unknown
1825/tcp open  unknown
1842/tcp open  unknown
1859/tcp open  unknown
1900/tcp open  upnp
1907/tcp open  unknown
2002/tcp open  globe
2030/tcp open  device2
2031/tcp open  unknown
2032/tcp open  unknown
2033/tcp open  glogger
2035/tcp open  imsldoc
2058/tcp open  unknown
2078/tcp open  unknown
2093/tcp open  unknown
2159/tcp open  unknown
2168/tcp open  unknown
2169/tcp open  unknown
2180/tcp open  unknown
2185/tcp open  unknown
2186/tcp open  unknown
2219/tcp open  unknown
2221/tcp open  unknown
2228/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds
me@server:~$

Ahh, muito melhor.

Agora, minhas perguntas: Mesmo no primeiro cenário com poucas conexões abertas, ps axww|grep ssh_key_used_for_remote_connections|grep sshd|sed -e 's/^[ \t]*//' mostra muito mais conexões ssh então estão realmente abertas, então a conexão parece morrer silenciosamente no fundo sem que a máquina remota perceba .

Existe uma maneira melhor de implementar as conexões reversas ssh , por exemplo, quaisquer opções ssh que eu possa ter perdido, que façam a máquina remota notar uma conexão morta / travada melhor? Este é o script que está sendo executado nas máquinas remotas para abrir o túnel ssh reverso:

#!/bin/bash

while true
do
  ssh -i /some/dir/reverse-ssh.key -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=3 -nNTv -R $(grep -o "[0-9][0-9][0-9][0-9]" /some/dir/id):localhost:22 [email protected]
  sleep 30
done

Então eu já uso -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=3 . /some/dir/id contém um número de quatro dígitos que cada máquina usa como porta reversa ssh, do ponto de vista dos servidores a porta reversa ssh.

B. Existe uma maneira melhor de kill somente conexões reversas sem resposta , deixando todas as conexões "funcionais" intactas? Por enquanto eu mato todos eles, mas isso parece grosseiro e errado. ps não me deixa ver o id da porta e eu precisaria fazer a conexão da porta reversa do ssh e do PID do ssh no meu servidor de alguma forma.

Eu olhei para autossh , mas isso parece refazer o que meus scripts fazem (?).

mosh está fora de questão, já que usa conexões UDP (que muitas vezes não passam) e portas aleatórias acima de 60000 (que também não passam).

    
por Christian 07.06.2015 / 11:31

2 respostas

1

Isso mostrará os processos usando o túnel:

netstat -tnp | grep :2219 | awk '{print $NF}'

Não consigo reproduzir suas conexões inativas, mas isso deve funcionar

for i in $(seq 2000 2030) do
  if !nmap -p $i localhost
    netstat -tnp | grep 2222 | grep '/ssh *$' | awk '{print $NF}' | sed -e 's#/ssh##' | xargs kill
  fi
end
    
por 11.08.2016 / 04:55
1

Talvez se você alterar seu script de cliente para verificar manualmente o status do túnel reverso comparando o comando hostname localy vs remote-over-tunnel hostname (a mesma composição):

#!/bin/bash

tunport=$(grep -o "[0-9][0-9][0-9][0-9]" /some/dir/id)
while true; do                    # -f (detached, foreground)
   ssh -i /some/dir/reverse-ssh.key -fnNT -R $tunport:localhost:22 [email protected]
   while true; do
      if [ "$(hostname)" = "$(ssh -p $tunport rsuname@$srvip hostname)" ]; then
         sleep 30
      else # kill local and remote process
          pkill -f "ssh .* -R $tunport:localhost"
          ssh [email protected] "lsof -ti tcp:$tunport | xargs -r kill"
          break # to tunnel re-init
      fi
   done
done

parece uma solução à prova de balas, responde com A e B e elimina a necessidade de opções tcpkeepalive, alive / serverMontentialInterval / countMax de cliente / servidor e intervenções administrativas.

    
por 27.02.2018 / 03:06