iptables firewall só permite tráfego de internet se a porta de origem de 80 for permitida

3

Estou configurando um firewall iptables, atualmente apenas para permitir o tráfego http e https. Ele está funcionando, mas sob uma regra particularmente estranha - devo permitir conexões de entrada com uma porta de origem de 80.

Isso não faz sentido para mim se o tráfego de entrada não tiver uma porta de destino de 80?

Abaixo está um exemplo da minha configuração. Se eu remover a regra que permite o tráfego de entrada na porta 80, não consigo acessar o google ou qualquer outra coisa, ative a regra e tudo funciona. Os servidores da Web não devem estar escutando nessa porta e enviando de uma porta aleatória?

# Set all major commands to DROP by default
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow HTTP and HTTPS
# Need to consider limiting to ESTABLISHED, RELATED for OUTPUT
# consider NEW for INPUT
# configure source ports in range 1024:65535

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT

# ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# allow loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

# Logging before Drop for troubleshooting
iptables -A INPUT -j LOG
iptables -A INPUT -j LOG
    
por Rob 12.08.2012 / 10:50

4 respostas

2

Se o servidor da Web respondeu à sua solicitação de uma porta aleatória, como o seu sistema operacional saberia enviar esse tráfego para o navegador?

Veja como funciona, em geral:

  1. Seu navegador deseja fazer uma conexão de saída com um servidor, portanto, ele solicita um soquete ao SO.
  2. A menos que o navegador esteja fazendo algo estranho, não importa qual porta o soquete está usando, então o SO atribui um livre aleatório.
    • Para este exemplo, usarei 53904 como nossa porta aleatória no lado do navegador.
  3. O navegador solicita que o SO conecte esse soquete ao IP do servidor (normalmente encontrado pelo DNS) e porta de escuta (geralmente 80 para HTTP de texto sem formatação ou 443 para HTTPS; ocasionalmente, algo mais especificado na URL).
    • Para este exemplo, vamos supor que você está fazendo HTTP em texto simples pela porta 80.
  4. O sistema operacional envia uma solicitação de conexão TCP (SYN) ao destino especificado pelo navegador, com os seguintes detalhes: IP de origem: o IP da interface de rede; porta de origem: 53904; IP de destino: o IP do servidor; porto de destino: 80 .
  5. A solicitação TCP é roteada pela (s) rede (s) entre você e o servidor.
    • A conversão de endereços de rede (NAT) pode alterar o IP de origem (para o IP do roteador) e a porta (para um endereço aleatório que o roteador mapeia para a conexão original recebida), mas não afeta o destino. / li>
    • O roteador que faz o NAT escutará a nova porta "de origem" e converterá o tráfego de resposta em respostas à solicitação original do seu computador.
    • Por simplicidade, não vou mais entrar no NAT neste exemplo; vamos supor que tanto o seu endereço quanto o do servidor são IPs publicamente roteáveis exclusivos.
  6. A solicitação chega na porta 80 do servidor (ou 443 ou qualquer outro). O processo do servidor da web já informou ao sistema operacional do servidor que gostaria de accept de conexões TCP de entrada nessa porta.
  7. O sistema operacional do servidor cria e envia uma confirmação (SYN-ACK) em resposta. Ele precisa ter os mesmos detalhes do pacote de entrada, exceto que a origem e o destino são revertidos: IP de origem: o IP do servidor; porta de origem: 80; IP de destino: seu IP; porto de destino: 53904 .
  8. Essa resposta retorna pela Internet para o seu computador, onde seu sistema operacional está ouvindo para ver se obtém o SYN-ACK na porta 53904 desse endereço IP.
    • Há também uma coisa chamada "números de seqüência" e "números de confirmação" que são usados para verificar se a conexão é a que deveria ser e impedir que algum outro computador fingir que é o servidor com o qual você está tentando falar .
    • Obviamente, essa proteção contra falsificação (spoofing) do servidor só funciona se o invasor não conseguir observar / interceptar o tráfego que você está enviando. Uma parte significativa do SSL / TLS, a única coisa que adiciona segurança ao HTTPS, é um mecanismo mais robusto para autenticar o servidor.
  9. Seu sistema operacional obtém o SYN-ACK e responde com seu próprio ACK, invertendo a origem e o destino novamente (ou apenas reutilizando a origem e o destino originais; a mesma coisa).
  10. Agora que a conexão foi confirmada por ambos os lados, seu sistema operacional permite que seu navegador saiba que agora ele pode enviar dados por meio do soquete.
  11. O sistema operacional do servidor, agora que recebeu a confirmação de sua máquina (e verificou os números de sequência), cria um novo soquete para ser utilizado pelo software do servidor da web. Esse soquete é usado para comunicar o tráfego para a conexão TCP recém-concluída e está vinculado à porta 80 no IP do servidor e à porta 53904 no seu IP; ele receberá dados e enviará dados da porta 80 .

A partir daí, o navegador e o servidor da web falam HTTP entre si sobre esse canal TCP. Eu não vou entrar nos detalhes disso, no entanto. Isso tudo é apenas para ilustrar por que seu firewall precisa permitir pacotes de entrada originados da porta 80 de um servidor se você quiser obter respostas HTTP desse servidor.

    
por 25.01.2017 / 10:52
1

Você escreve

..If I remove the rule that allows incoming traffic on port 80 then I can't access google or anything else, active the rule and it all works. Shouldn't web servers be listening on this port and sending from a random port?

Não. www.google.com enviaria da porta 80 para sua porta aleatória.

Da mesma forma, qualquer servidor da Web que você executar não ouviria apenas na porta 80, ele enviaria pacotes com a porta de origem de 80.

E, é claro, o seu servidor da web não se comunica com o servidor da web do google.

E quem quer que acesse o seu servidor web terá uma porta aleatória aberta ao final

E quando você acessa o Google, você tem uma porta aleatória para abrir sua conta.

Sua confusão está em não perceber que INPUT não tem a ver com uma "conexão de entrada" especificamente. São todos os pacotes chegando ... incluindo pacotes vindos de uma conexão de saída.

Então seu servidor escutando nas portas 80 e 443

Eu não sou especialista, mas

Eu vou dar uma configuração comum, como descrito em "para o conjunto de regras perfeito" (ou como usado por aqueles que apontam para ele)

link

- Permitir tudo para fora

-Allow em todos os estabelecidos e relacionados (relacionados inclui novas conexões a partir dele, como o que o antigo protocolo FTP requer - não que você está usando FTP. e inclui erros ICMP)

-Allow em todos os pacotes para as portas do servidor.

Assim, suas políticas seriam

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

usando -m conntrack is e --ctstate é mais recente que -m state e --state

E além das políticas, suas regras seriam

iptables -A INPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

iptables -A INPUT -p tcp -m multiport --sports 80,443 -j ACCEPT

Além disso, o estilo que você usou e que escrevi acima, mantendo o formulário, é estilo de linha de comando, mas alguns podem dizer que é mais profissional usar um script do iptables. e uma linha iria ler -A entrada em vez de iptables -A entrada. E iptables-save > arquivo e iptables-restore < arquivo.

    
por 19.11.2014 / 21:00
0

Você realmente precisa de duas regras para lidar com as portas 80 e 443, isto é, HTTP; o tráfego é transportado sempre na porta 80, mas você precisa de 2 regras ... A primeira regra permite enviar a solicitação para uma página remota… A segunda regra permite a resposta desse pedido (enviado pelo servidor HTTP apontado) volte para o seu navegador.

Estas são as regras

iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT 

e você deve apagar esta regra

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 80,443 -j ACCEPT
    
por 25.08.2012 / 01:48
0

Também é necessário:

iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

E a regra para respostas de DNS precisa ser restrita a respostas reais:

iptables -A INPUT -p udp -i eth0 --sport 53 -m state --state ESTABLISHED -j ACCEPT
    
por 15.06.2014 / 01:40

Tags