OK, em uma tentativa de obter alguma resposta, uma versão TL; DR. Eu sei que o seguinte comando:
iptables -A PREROUTING -t nat -i eth0 --dport 80 --source 1.1.1.1 -j REDIRECT --to-port 8080
... redirecionará todo o tráfego da porta 80 para a porta 8080. O problema é que preciso fazer isso para cada porta a ser redirecionada. Para ser à prova do futuro, eu quero que todas as portas para um IP sejam redirecionadas para um IP (interno) diferente, para que se alguém decidir ativar o SSH, elas possam se conectar diretamente sem se preocupar com o iptables.
O que é necessário para redirecionar todo o tráfego de um IP externo para um IP interno e vice-versa?
Versão estendida
Eu pesquisei na internet por isso, mas nunca recebi uma resposta sólida. O que eu tenho é um servidor físico (HOST), com várias máquinas virtuais (VM) que precisam de tráfego redirecionado para elas. Basta fazê-lo funcionar com uma única máquina é o suficiente por enquanto.
As VMs são executadas no VirtualBox e são configuradas para usar um adaptador somente host (vboxnet0). Tudo parece funcionar, mas está muito atrasado. Tanto o host (CentOS 5.6) quanto o guest (Ubuntu 10.04) estão rodando o Linux.
O que eu fiz foi o seguinte:
- Configure a VM para ter um IP estático na rede do adaptador vboxnet0.
- Adicione um alias de IP ao host, registrando-o no IP dedicado (fora).
- Configure o iptables para permitir que o tráfego apareça (via sysctl).
- Configure o iptables para dados DNAT e SNAT de um determinado endereço IP para o endereço interno.
Comandos iptables:
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
iptables -t nat -I PREROUTING -d $OUT_IP -I eth0 -j DNAT --to-destination $IN_IP
iptables -t nat -I POSTROUTING -s $IN_IP -o eth0 -j SNAT --to-source $OUT_IP
Agora o site funciona, mas é muito, muito lento. Eu espero que eu tenha perdido algo simples, mas estou sem ideias por enquanto.
Algumas informações em segundo plano: antes disso, o site estava trabalhando com o encaminhamento de porta básico. Por exemplo. a porta 80 foi mapeada para a porta 8080 usando o iptables. No VirtualBox (com o adaptador de rede configurado como NAT), um encaminhamento de porta ao contrário fazia as coisas funcionarem lindamente. O problema era duplo: primeiro, várias portas precisavam ser encaminhadas (para interfaces administrativas, https, ssh, etc). Segundo, só permitia que um endereço IP usasse a porta 80.
Para resolver as coisas, vários endereços IP externos são usados para diferentes (sub) domínios. Da mesma forma, a rede "VirtualBox" conterá as máquinas virtuais:
DNS Ext. IP Adapter VM "VirtalBox" IP
------------------------------------------------------------------
a.example.com 1.1.1.1 eth0:1 vm_guest_1 192.168.56.1
b.example.com 2.2.2.2 eth0:2 vm_guest_2 192.168.56.2
c.example.com 3.3.3.3 eth0:3 vm_guest_3 192.168.56.3
E assim por diante. Simplificando, o objetivo é canalizar todo o tráfego de a.example.com
para vm_guest_1
(de maneira diferente, de 1.1.1.1
para 192.168.56.1
). E conseguir isso com uma velocidade aceitável:).