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).