Após a discussão com um colega super inteligente, achamos que descobrimos o que está errado, mas ainda estamos para provar isso. O que provavelmente está acontecendo é que o intervalo keep-alive só é levado em conta quando nenhum ACK de keep-alive é recebido. Assim, após 2 horas, se nenhum ACK fosse recebido para este primeiro pacote de manutenção, um segundo pacote seria enviado após 75 segundos e repetidamente em intervalos de 75 segundos até que um ACK fosse recebido.
Acontece que a razão pela qual o intervalo é levado em conta somente quando é maior do que o tempo de manutenção é devido à maneira como o mecanismo keep-alive do Linux funciona, como descrito em meu outra pergunta .