Eu consegui descobrir isso sozinho. Parece que o tunelamento ssh é basicamente o encaminhamento de porta. Eu corri o seguinte código no servidor por trás do NAT
ssh -N -R 4321:localhost:1234 user@client &
isso configura o túnel que roteia o tráfego de client:4321 para server:1234 , com o & para executá-lo em segundo plano. Ainda no servidor, eu corri:
ncat -lk -c "python myscript.py" localhost 1234 &
que inicia o processo netcat executando myscript.py . Agora posso me conectar ao servidor do meu cliente via netcat
nc localhost 4321
(Eu não tenho ncat no meu cliente, mas nc também funcionou. Meu caso de uso real foi usar a biblioteca socket em python para conectar, o que funcionou da mesma forma)