Relacionamento entre / etc / hosts e iptables?

1

Estou executando um DigitalOcean Centos 6 VPS. Aqui está o script que eu usei para configurar iptables no Centos 6.4 64 bits:

#!/bin/sh
service iptables stop
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables-save > /etc/sysconfig/iptables
service iptables restart

Eu abro as portas 22, 80 e 443 apenas, redirecionando 80 e 443 internamente para 8080 e 8181, respectivamente.

Devido a um erro / peculiaridade no GlassFish, tive que adicionar o nome do host da máquina a /etc/hosts :

127.0.0.1 localhost
127.0.0.1 example.com

Sem as regras NAT na configuração iptables , posso acessar o servidor GlassFish pelo meu navegador em casa ao tentar conectar-me pela porta 8080 ou 8181. Com as regras NAT adicionadas, não consigo acessar o servidor em nem via 80 nem 443 nem via 8080 e 8181.

Preciso fazer uma alteração em qualquer uma das regras iptables para incluir essa linha extra em /etc/hosts ?

Atualização:

Se eu remover a última regra, iptables -P INPUT DROP , agora posso acessar o servidor por meio de um navegador usando as portas 80/443 e 8080/8181. Isso indica que o encaminhamento está funcionando.

    
por Steve Taylor 05.06.2013 / 16:13

2 respostas

2

A resposta curta é NÃO, você não.

A resposta mais longa é que / etc / hosts está lá para ajudar o resolvedor de pilha de rede. O resolvedor é a parte da pilha IP (TCP / IP v4 e v6) que é responsável por converter nomes amigáveis, como mybigserver, em um endereço IP, como 172.16.0.1.

Em sua postagem, você está nos mostrando um script e o script está executando comandos IPTable.

O script está usando a cadeia PREROUTING para fazer o NAT, mas você afirma na sua pergunta que não consegue acessar o servidor "GlassFish" através do navegador .....

  1. Qual navegador? Navegador no mesmo host Linux ou em outro computador conectado ao mesmo switch que o ETH0?

Se a resposta para # 1 for outro host conectado ao mesmo switch que o seu Linux ETH0, então o problema é que você precisa mudar suas regras NAT para usar a cadeia POSTROUTING. A razão é que você quer NAT a conexão de saída. O que você tem configuração é PAT (Port Address Translation).

Se esta é sua configuração [Seu navegador] ------ [switch de rede] ----- [ETH0 Linux ETH1] ----- {Internet pública]

Em seguida, substitua essas linhas

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181

com:

iptables -A POSTROUTING -t nat -o eth1 

Se isso resolver seu problema, você poderá ajustar essa regra de POSTROUTING para usar um intervalo de portas e / ou um IP ETH1 específico se for multihomed.

    
por 05.06.2013 / 16:27
1

Resposta curta

Você NÃO ACEITA pacotes para 8080 ou 8181 em suas regras!

Resposta mais longa

Without the NAT rules in the iptables configuration, I am able to reach the GlassFish server via my browser at home when attempting to connect either via port 8080 or 8181. With the NAT rules added, I cannot reach the server at all, neither via 80 and 443 nor via 8080 and 8181.

Isso ocorre porque suas regras funcionam e, portanto, encaminham 80 e 443 para 8080 e 8181! Mas você esqueceu de também ACEITAR conexões com essas! É por isso que todos eles são rejeitados!

If I remove the last rule, iptables -P INPUT DROP, I can now access the server via a browser using ports 80/443 and 8080/8181. This indicate the forwarding is working.

Deve fazer sentido agora:

  • Solicitação para a porta 8080 > > DROP (padrão)
  • Solicitação para a porta 8181 > > DROP (padrão)
  • Solicitação para a porta 80 > > Porta 8080 > > DROP (padrão)
  • Solicitação para a porta 443 > > Porta 8181 > > DROP (padrão)

Sem a última linha, você tem o padrão de ACCEPT em vez de DROP, então é claro que funciona.

Solução

Adicione as seguintes duas regras ...

iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8181 -j ACCEPT

... e deve funcionar com a linha INPUT DROP padrão (Porta 80 > > Porta 8080 > > ACCEPT (regra)).

    
por 28.07.2014 / 13:17