iptables regras para permitir o tráfego HTTP para apenas um domínio

16

Eu preciso configurar minha máquina para permitir o tráfego HTTP de / para serverfault.com apenas. Todos os outros sites, portas de serviços não estão acessíveis. Eu criei estas regras do iptables:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Não funciona muito bem:

  • Depois de largar tudo e seguir para a regra 3:

    iptables -A OUTPUT -p tcp -d serverfault.com --dportar 80 -j ACCEPT

Eu recebo este erro:

iptables v1.4.4: host/network 'serverfault.com' not found
Try 'iptables -h' or 'iptables --help' for more information.

Você acha que isso está relacionado ao DNS? Devo permitir também? Ou devo apenas colocar endereços IP nas regras? Você acha que o que estou tentando fazer poderia ser alcançado com regras mais simples? Como?

Eu gostaria de receber ajuda ou dicas sobre isso. Muito obrigado!

    
por Zenet 04.01.2011 / 21:16

5 respostas

24

Com as regras do IPTables, a ordem é importante. As regras são adicionadas e aplicadas em ordem. Além disso, ao adicionar regras manualmente, elas são aplicadas imediatamente. Assim, no seu exemplo, qualquer pacote que passa pelas cadeias INPUT e OUTPUT começa a ser descartado assim que a política padrão é definida. Este é também, aliás, porque você recebeu o erro mensagem que você fez. O que está acontecendo é isto:

  1. A política de DROP padrão é aplicada
  2. IPTables recebe um nome de host como destino
  3. O IPTables tenta uma pesquisa de DNS em 'serverfault.com'
  4. A pesquisa de DNS é bloqueada pela ação DROP

Embora as opções de origem / destino aceitem nomes de host, isso não é recomendado. Para citar a página man,

Hostnames will be resolved once only, before the rule is submitted to the kernel. Please note that specifying any name to be resolved with a remote query such as DNS is a really bad idea.

Slillibri acertou na cabeça que sua resposta, você perdeu a regra de DNS ACCEPT. No seu caso, não importa, mas geralmente eu definiria a política padrão mais tarde no processo. A última coisa que você quer é trabalhar remotamente e permitir o SSH após ativar uma negação padrão.

Além disso, dependendo da sua distribuição, você deve salvar suas regras de firewall de modo que elas sejam automaticamente aplicadas na hora de início.

Sabendo de tudo isso e reorganizando seu roteiro, aqui está o que eu recomendaria.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
    
por 05.01.2011 / 03:16
7

Adicionar

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

para permitir pesquisas de DNS.

    
por 04.01.2011 / 21:49
5

Esse tipo de requisito pode ser melhor tratado com um proxy da web e / ou filtro. Dansgaurdian pode ser configurado para fazer isso. Você precisará usar regras de NAT para forçar o tráfego através do filtro.

O uso do iptables para filtrar permitirá todos os sites disponíveis a partir dos endereços IP relevantes. Isso normalmente é um pequeno subconjunto de toda a web.

    
por 05.01.2011 / 06:37
2

Eu tenho medo que o iptables não funcione nesse nível, ele só se importa com o endereço IP, não com o nome do host. Se você quiser bloquear o acesso a outros hosts virtuais de nome no mesmo ip, será necessário verificar os arquivos .htaccess.

    
por 04.01.2011 / 21:21
1

Você precisa configurar isso no seu servidor da web. iptables é um filtro de pacotes. Transações HTTP enviam o nome do site (ou seja, stackoverflow) como parte da carga útil TCP (ou seja, não como parte do cabeçalho TCP, que é o que o iptables lê facilmente).

Dado que, e o fato de que transações HTTP são quase certamente distribuídas em múltiplos pacotes (isto é, você não pode apenas combinar uma string no cabeçalho HTTP), isso é muito melhor manipulado pela configuração do seu servidor web ou por um proxy na frente dele.

Seria útil conhecer o raciocínio por trás disso, há algumas outras alternativas:

  1. Redirecione para o URL correto se eles inserirem o URL incorreto (por exemplo, redirecionar para stackoverflow.com, caso eles acessem www.stackoverflow.com)
  2. Informe ao seu servidor da Web para não veicular outros hosts além de stackoverflow.com
  3. Coloque o site em um IP separado que nada mais resolve e obtenha apenas seu servidor da Web para ouvir sobre isso.
por 04.01.2011 / 22:26