Acho que uma VPN (por exemplo, openVPN ou uma solução IPSEC como strongswan) pode funcionar melhor.
Você pode usar o SSH com a opção -R
:
-R remote_socket:local_socket
Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the given host and port, or Unix socket, on the local side. This works by allocating a socket to listen to either a TCP port or to a Unix socket on the remote side. Whenever a connection is made to this port or Unix socket, the connection is forwarded over the secure channel, and a connection is made to either host port hostport, or local_socket, from the local machine.
Você precisaria apenas de algo no seu Pi para iniciar a conexão e reiniciá-lo se ele falhar. O NAT aqui é irrelevante, porque o túnel seria diretamente entre seu host público e Pi - no seu host, você teria um ouvinte (por exemplo, 127.0.0.1:9999) e configuraria seu servidor da Web para usar esse ouvinte como um a montante.
Provavelmente, você desejaria ter um usuário dedicado para criar este encaminhamento (já que seu Pi precisaria ser capaz de se autenticar em seu servidor, o que quase certamente significa que você precisaria de uma chave privada sem senha). Você também precisaria criar uma conexão encaminhada por porta, se você precisasse de mais de uma.
Eu suspeito que uma VPN seria mais fácil de fazer o trabalho de forma confiável, e exigiria menos scripts, essencialmente. Ambas as abordagens funcionariam, no entanto.