TL; DR;
A solução é definir o valor de StreamLocalBindUnlink como yes na configuração de ssh: sudo echo "StreamLocalBindUnlink yes" >> /etc/ssh/sshd_config
.
Longa história
A razão pela qual isso acontece é porque os arquivos de soquete unix não são removidos automaticamente quando o soquete é fechado. Eles precisam ser limpos manualmente ao fechar, se desejado, chamando remove
/ unlink
com o caminho do arquivo, mas o openssh não faz isso. No entanto, como eu pesquisei o assunto mais eu cheguei à conclusão de que a "melhor prática" com sockets unix é a unlink
right antes ligação a ele ( Verifique esta resposta SO para obter mais detalhes ). E é exatamente isso que o StreamLocalBindUnlink yes
diz ao sshd para fazer.
Página man diz:
StreamLocalBindUnlink
Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new
one. If the socket file already exists and StreamLocalBindUnlink is not enabled, sshd will be unable to forward the port to
the Unix-domain socket file. This option is only used for port forwarding to a Unix-domain socket file.
The argument must be yes or no. The default is no.
A desvantagem dessa abordagem é que a religação ao soquete agora é permitida, mesmo se a conexão antiga ainda estiver lá. Fazer isso parece deixar o velho túnel pendurado lá, de modo que qualquer conexão tcp existente permaneça intacta, mas todas as novas conexões vão para o novo túnel. Além disso, o túnel antigo parece ser permanentemente e irreversivelmente desconectado do endereço do soquete do sistema de arquivos e não poderá receber mais novas conexões mesmo se o novo túnel for fechado.