Creo que necesita configurar su sistema operativo en su lugar. El cambio de parámetros keepalive por programas aún no es ampliamente compatible. Esto debería ayudarte:
Uso de TCP keepalive para detectar errores de red
También sus parámetros están mal elegidos. Si tcp_keepalives_count=1
funcionó, entonces incluso un paquete de mantenimiento perdido perderá su conexión. Y los paquetes individuales se pierden a menudo. Usaría lo siguiente en /etc/sysctl.conf
en MacOSX/FreeBSD:
net.inet.tcp.keepidle =60000
net.inet.tcp.keepintvl =10000
OS interrumpirá las conexiones como máximo 140 segundos (60 segundos de inactividad + 8 paquetes keepalive en intervalos de 10 segundos) después de perder la conectividad.