Podman + Windows: Resolvendo erro "No connection could be made because the target machine actively refused it"
Published: 2024-07-10 11:47:40

Enquanto estava estudando para escrever o post [WSL: Gerenciando o disco da distro](https://dev.to/poveda/wsl-gerenciando-o-disco-da-distro-ld1) precisei reiniciar as distros do WSL algumas vezes. Entre essas distros estava a VM utilizada pelo [Podman Desktop](https://podman-desktop.io/).

Qual foi a minha surpresa quando no dia seguinte precisei utilizar o podman e recebi a seguinte mensagem

> Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM
Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:63708: connectex: No connection could be made because the target machine actively refused it.

Num primeiro momento tentei parar e subir a VM novamente com os comandos `podman machine stop` e `podman machine start` porém sem sucesso. Depois disso resolvi ler a mensagem de erro em busca mais pistas. A mensagem dizia para rodar o comando `podman system connection list` e validar se o podman esta escutando na porta mencionada.

Rodando o comando a saída confirmou que porta 63708 estava sendo utilizada pela VM:

```powershell
$ podman system connection list
Name                         URI                                                Identity                                                        Default     ReadWrite
podman-machine-default       ssh://root@127.0.0.1:64624/run/podman/podman.sock  ~\.local\share\containers\podman\machine\machine  false       true
podman-machine-default-root  ssh://root@127.0.0.1:63708/run/podman/podman.sock  ~\.local\share\containers\podman\machine\machine  true        true
```
> Obs: Os caminhos do identity foram encurtados para facilitar a leitura

Ainda sem ideia sobre o que fazer resolvi olhar o que mais a mensagem dizia. A outra opção sugerida pela mensagem era subir uma nova VM do podman para solucionar o problema, entretanto essa era uma opção que não desejava executar num primeiro momento pois tenho alguns pods parados e imagens salvas no cache que demorariam muito para baixar novamente (ex: sql server).

Com o cenário desenhado, iniciei as pesquisas para tentar solucionar o problema. Encontrei a ["issue No connection could be made because the target machine actively refused it"](https://github.com/containers/podman/issues/19554) e tentei a maioria das soluções propostas na issue porém sem sucesso. Inclusive vi que [implementaram uma correção](https://github.com/containers/podman/pull/19557) para o podman e que também não resolveu meu problema 😢.

Voltei novamente para as informações fornecidas pelo podman e tive um estalo:

*"O podman desktop se comunica com a VM via SSH. Será que a porta 63708 está habilitada no serviço"*

Com essa suspeita acessei a distro do podman e abri o arquivo `/etc/ssh/sshd_config` no editor de texto. Indo para o final do arquivo constatei que somente a porta 64624 estava habilitada para acesso ssh. Então resolvi adicionar a porta 63708. O arquivo que ficou da seguinte forma após editado

```vi
...
# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
Port 64624
Port 63708
```

Depois de salvar a alteração o próximo passo foi reiniciar o serviço do ssh com o comando: 

```shell
sudo systemctl restart sshd
```

Aguardei uns segundos e rodei o comando `systemctl status sshd` a fim de validar se o serviço havia iniciado. O resultado do comando  comprova que o serviço estava rodando sem problemas:


```sh
● sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Wed 2024-07-03 21:02:01 -03; 3s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 7207 (sshd)
      Tasks: 1 (limit: 4697)
     Memory: 1.3M
        CPU: 12ms
     CGroup: /system.slice/sshd.service
             └─7207 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Jul 03 21:02:01 PovedaRyzen systemd[1]: Starting sshd.service - OpenSSH server daemon...
Jul 03 21:02:01 PovedaRyzen (sshd)[7207]: sshd.service: Referenced but unset environment variable evaluates to an empty string: OPTIONS
Jul 03 21:02:01 PovedaRyzen sshd[7207]: Server listening on 0.0.0.0 port 63708.
Jul 03 21:02:01 PovedaRyzen sshd[7207]: Server listening on :: port 63708.
Jul 03 21:02:01 PovedaRyzen sshd[7207]: Server listening on 0.0.0.0 port 64624.
Jul 03 21:02:01 PovedaRyzen sshd[7207]: Server listening on :: port 64624.
Jul 03 21:02:01 PovedaRyzen systemd[1]: Started sshd.service - OpenSSH server daemon.
```

Com o ssh liberado para a porta 63708, rodei alguns comandos a fim de validar a conexão. Para a minha felicidade os resultados foram esses:

```sh
$ podman ps -a
CONTAINER ID  IMAGE                                                  COMMAND               CREATED      STATUS                    PORTS       NAMES
5a6ba726847e  localhost/podman-pause:5.1.0-dev-4817811cb-1713312000                        3 weeks ago  Exited (0) 292 years ago              234f8433dbf7-infra
9fecc6f0544a  docker.io/library/nginx:latest                         nginx -g daemon o...  3 weeks ago  Exited (0) 292 years ago              nginx-nginx
```

```sh
$ podman images
REPOSITORY                           TAG                             IMAGE ID      CREATED       SIZE
localhost/podman-pause               5.1.0-dev-4817811cb-1713312000  d3af6c318a9d  3 weeks ago   1.14 MB
docker.io/library/nginx              latest                          4f67c83422ec  5 weeks ago   192 MB
docker.io/julianopoveda/readonlyapi  v1                              ac7c4054326e  2 months ago  120 MB
docker.io/kindest/node               <none>                          09c50567d34e  4 months ago  962 MB
```

### Conclusão

Por algum motivo que não consegui descobrir o real motivo da porta ter se tornado incomunicável. Essa questão dificultou bastante a busca de uma solução, pois é bem provável que alguém já passou por esse problema e reportou em algum lugar como solucionar.

No fim tive que contar com a minha experiência e memória para resolver o problema, sem o auxilio de uma fonte externa. E esse é um dos motivos pelos quais tenho escrito esses posts, ter uma base de solução de problemas documentada tanto online quanto offline.

Uma última curiosidade: enquanto buscava algumas informações para enriquecer esse post descobri que poderia ter trocado a porta default de comunicação para a porta utilizada pelo rootless usando o comando `podman system connection default podman-machine-default`. Esse comando teria resolvido o problema de forma bem mais simples, visto que a porta 64624 estava aberta no sshd.


### Referências

- [Acessar instância do podman por outra distro wsl](https://podman-desktop.io/docs/podman/accessing-podman-from-another-wsl-instance)
- [Issue #19554: No connection could be made because the target machine actively refused it](https://github.com/containers/podman/issues/19554)
- [Fix: Implement automatic port reassignment on Windows](https://github.com/containers/podman/pull/19557)