как пересылать tcp или udp соединение изначально не зная куда будет обращаться клиент?
Для tcp - никак. Соединение TCP характеризуется четверкой (src_ip, src_port, dst_ip, dst_port). Не зная куда будет обращаться клиент, четверку получить нельзя, а значит и пересылать не получится.
UDP - вообще протокол без соединений. Каждое сообщение (датаграмма) пересылается независимо от предыдущих/последующих.
нужен кэш, но что конкретно в нём хранить?
В кэше хранятся часто используемые данные.
Как видно из схема проблема заключается в большой задержке по спутниковому каналу.
Выставите большой keepalive и socket timeout.
Вообще, я так и не понял, в чем состоит проблема, описанная в вопросе. Если Вы пишете reverse proxy, почитайте про то, как работают директивы *upstream в nginx - может каши поубавится.