Encontrei a solução para o problema.
O que eu não mencionei foi que ambos os aplicativos são executados dentro de um contêiner do Docker.
Aparentemente, o Docker altera diretamente o iptables. Para fazê-lo funcionar com o ufw, é necessário encaminhar todo o tráfego do Docker executando este comando ufw allow in on docker0
.