Tengo una pequeña red local que se complementa con un WiFi cautivo, y lo uso ssh
en OS X con -oServerAliveInterval=240
y PuTTY 0.62 en Windows 7 Professional para establecer conexiones a mi Linode, Hetzner y otros servidores.
Con PuTTY, selecciono Connection
→ Sending of null packets to keep session active
a 240. El Enable TCP keepalives (SO_KEEPALIVE option)
está apagado, según los valores predeterminados.
Cuando mi Internet está temporalmente fuera de servicio durante aproximadamente un minuto (tengo que volver a autenticarme en el portal cautivo), PuTTY casi siempre pierde todas las sesiones ssh abiertas que tengo, y especialmente aquellas en las que hubo algún tipo de actividad, pero OpenSSH en OS X nunca pierde ninguna sesión, siempre que mi Internet vuelva a funcionar en aproximadamente un minuto o dos, incluso si realmente intento escribir algo en ssh, y no veo respuesta durante los 60 segundos más o menos, hasta que mi conexión vuelva a estar activa. (Por lo tanto, estoy seguro de que los estados NAT siempre se conservan).
¿Puedo evitar que Windows / PuTTY descarte preventivamente buenas conexiones?
Me parece que SO_KEEPALIVE o algo así está activado de forma predeterminada en Windows, y el tiempo de espera para detectar conexiones obsoletas es demasiado pequeño. Me gustaría aumentarlo a algo más de un par de segundos, de manera similar a cómo OS X es inmune a estas breves interrupciones temporales, siempre que la interrupción sea de solo un par de cientos de segundos y esté por debajo del valor de -oServerAliveInterval
(veces ServerAliveCountMax
).
mosh
es una mejor alternativa)Respuestas:
http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-timeout
Parece que
TcpMaxDataRetransmissions
(REG_DWORD) afecta directamente esto. El valor se puede agregarHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters
conregedit.exe
(la clave falta por defecto, por lo que primero debe agregarla para cambiarla). Cuando está desarmado, es 5. Agréguelo, configúrelo al menos enf
(15) y reinicie.El valor predeterminado de 5 parece bastante inadecuado para mantener las conexiones durante interrupciones breves y temporales de la red; obtendrá un tiempo de espera en cuestión de unos segundos. Agregué esta
TcpMaxDataRetransmissions
clave al registro y configuré su valor enf
(15), reinicié la máquina y, después de hacerlosysctl net.inet.ip.forwarding=0
en el enrutador justo antes de escribir un carácter en PuTTY, me devolvió el carácter después de habilitar el reenvío. en mi enrutador después de esperar 5 minutos (lo probé para determinar que un valor de 0x0000000c (12) hace que la conexión se rompa exactamente 7 minutos después del primer intento de enviar un paquete durante una interrupción). Antes de reiniciar, PuTTY agotaría la conexión dentro de un par de segundos de inmediato. Tenga en cuenta que fue necesario reiniciar, al menos en Windows 7 Professional,¡simplemente cambiar el registro no tiene efecto en conexiones existentes ni nuevas ! ¡Nada cambia en Windows!Mientras lo hace, también podría agregar y establecer
KeepAliveInterval
en60000
decimal (60 segundos) desde el valor predeterminado no establecido de1000
(1 segundo), pero no se supone que tenga ningún efecto en mi caso específico como el anterior, ya que las funciones de mantenimiento TCP no estaban habilitadas.fuente