LXC e sobreposição de porta

2

Fiz muita pesquisa no Google e pesquisei o que encontrei no Server Fault, mas não encontrei nenhuma solução para isso.

Eu tenho um servidor que está executando contêineres LXC (2 para agora, ambos Ubuntu). A rede LXC é conectada (10.0.3.0/24), com o servidor DHCP por ela estar em 10.0.3.1, e estou usando dois IPs dessa rede: 10.0.3.2 (container 1 [CN1]) e 10.0.3.3 (contêiner 2 [CN2]).

Eu tenho o Apache configurado em ambos e tenho um subdomínio configurado no DNS para um site meu que aponta para o meu IP público (web1 - > CN1 e web2 - > CN2). Os subdomínios são resolvidos corretamente, mas aqui é onde o problema começa.

Dependendo da regra que eu tenho primeiro no iptables determina qual container é atingido com a página da web. Portanto, se eu tiver a porta externa 80, pressione CN1 primeiro, então esse arquivo index.html será mostrado, e se 80 for definido para CN2 primeiro, então esse arquivo index.html será mostrado.

O que eu pensei em fazer foi configurar os servidores Apache para escutar em uma porta diferente, então eu configurei o CN1 para escutar 801 e CN2 para escutar 802, então eu configurei o iptables para rotear a porta externa da rota 80 para ambos destes, mas a mesma questão ainda surge.

Meu objetivo final é fazer com que web1 e web2 exibam seus respectivos arquivos index.html sem especificar uma porta externa específica (por exemplo, ip: 81- > CN1 e ip: 82- > CN2). Só outra coisa que posso pensar é configurar um proxy (ou seja, nginx) no host e ter solicitações de proxy com base no (sub) domínio solicitado, mas prefiro não fazer isso, se possível.

Regras do iptables:

Tabela NAT

root@SKYNet:~# iptables -t nat -L  
Chain PREROUTING (policy ACCEPT)  
target     prot opt source               destination  
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.3.2:801
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.3.3:802

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.3.0/24          anywhere

Tabela padrão

root@SKYNet:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Eu entendo a lógica do iptables e roteando-o para um ponto, mas eu pensei que o iptables basicamente tentaria direcionar o pacote para a porta 801, e se ele não combina com o VHost, ele irá rejeitá-lo e o iptables irá para o próximo (802 neste caso).

    
por Eric Hansen 26.05.2013 / 16:37

2 respostas

2

iptables está fazendo o seu trabalho. iptables não tem ideia do que é HTTP se você segmentar a mesma porta, somente a primeira regra corresponderá ao que acontece com a solicitação depois.

A única maneira de conseguir o que você precisa é configurar um proxy reverso que receberá todas as solicitações HTTP e as redirecionará para o servidor HTTP correto, dependendo do nome do host.

    
por 26.05.2013 / 16:57
0

Você precisa de um proxy para fazer isso. IPtables apenas redirecionará os pacotes que correspondem a esta regra - não verificará se vai a algum lugar ou se qualquer porta inacessível de ICMP será retornada. Mesmo que isso acontecesse, no entanto, isso ainda não funcionaria - você não obterá falhas que o IPtables conhecerá, porque a única falha será uma camada 7. O handshake TCP real (que é o bit iptables se preocupa com) será concluído com sucesso pelo tempo que isso acontecer.

    
por 26.05.2013 / 17:00