Primeiro, é impossível encaminhar portas na camada IP ou de transporte para diferentes máquinas internas com base no domínio que o cliente está acessando. Por causa disso, o que você quer fazer tem que ser feito em um nível mais alto da pilha de rede. Mas você já deve ter lido isso, já que está perguntando sobre proxies.
Movendo uma camada para cima da pilha de rede, você encontra uma grande variedade de protocolos diferentes. Alguns são fáceis de usar com base no nome do host, alguns são impossíveis. Eu só conheço quatro protocolos, que podem ser aproximados dessa maneira. Variando do mais fácil ao mais difícil, eles são:
- HTTP
- HTTPS
- DNS
- SMTP
Um proxy HTTP padrão pode manipular o protocolo HTTP para você. Ele funciona com qualquer cliente enviando um cabeçalho de host. Este cabeçalho é opcional em HTTP / 1.0 e obrigatório em HTTP / 1.1. Até agora o HTTP / 1.1 tem mais de uma década, e você pode esperar que praticamente todos os clientes o suportem agora.
O HTTPS é um pouco mais complicado. Ele só funcionará com clientes que suportam o SNI. Eu acho que você encontrará uma maioria apoiando isso, mas você pode encontrar uma minoria significativa de clientes que ainda não apóiam o SNI. Você pode encaminhar todos os clientes sem suporte a SNI para um servidor específico, de modo que pelo menos um dos domínios possa funcionar para clientes sem SNI.
Minha recomendação é atribuir um endereço IPv6 público a cada servidor. Dessa forma, os clientes com suporte a IPv6 não recebem as desvantagens do proxy e você pode usar a conectividade IPv6 do proxy para o servidor real. Isso também significa que o proxy pode realmente usar pesquisas de DNS para encontrar o endereço do servidor, o que pode simplificar as coisas.
Eu tenho implementado como um proxy com suporte a http e https, então sei que isso é possível. Mas acho que, para sua configuração, um proxy de prateleira provavelmente é uma escolha melhor. Eu acho que o squid pode fazer isso. Por outro lado, não acho que o iptables e o bind ajudem muito.