Você não precisa de um túnel SSH para ir de B para C, já que a webapp em B conecta-se a C usando sockets normais, certo?
No servidor A, você deve invocar o SSH assim:
ssh -L44014:serverc:3306 user@serverb
Isso estabelece um túnel SSH entre A e B. Quando o processo de backup, executado no servidor A, se conecta ao localhost: 44014, o encapsulamento fará com que o processo sshd no servidor B conecte-se à porta 3306 no servidor C. Ponto de vista de C, a conexão parecerá vir do servidor b em alguma porta de cliente aleatória.
Se você quiser usar isso dentro de um script, você também pode passar a opção -N
para evitar gerar um shell, apenas faça o encaminhamento da porta. Assim, você pode executar o comando em segundo plano e eliminá-lo quando não precisar mais do túnel:
ssh -NL44014:serverc:3306 user@serverb &
TUNNEL_PID=$!
# do the backup on localhost:44014
kill $TUNNEL_PID
Se os administradores do servidor B tiverem desabilitado o encaminhamento de porta local, você poderá usar socat
para emular esse comportamento, mas será um pouco mais complicado. Aqui nós geramos um socat localmente para fazer com que os dados passem pelo stdio do ssh, e um socat remoto para redirecioná-lo para o socket apropriado. Para que funcione, você deve ter o login sem senha do ssh funcionando:
socat TCP-LISTEN:44014 EXEC:"ssh user@serverb socat STDIO TCP:serverc:3306"