O problema mais comum é que o seu gateway reescreve o endereço de destino do pacote para o servidor interno, mas não a fonte. Então, quando o servidor interno responde, ele vê que o pacote veio de algo na rede local, envia o pacote diretamente - e o cliente não pode dizer que isso é do servidor, porque o pacote ainda tem o interno, não o público. , endereço sobre isso.
A correção padrão é forçar o tráfego a voltar pelo seu gateway. Uma maneira de conseguir isso é colocar o servidor para o qual o endereço público redireciona em uma "DMZ", para que o tráfego entre o cliente e o servidor tenha que passar pelo roteador.
A outra maneira é também aplicar NAT ao endereço de origem das conexões internas ao IP externo, para que pareçam ter vindo do gateway. O servidor interno responderá ao gateway, que irá desfazer ambas alterações NAT, e enviar o pacote de volta para o cliente interno.