iptables encaminhamento de porta (porta de pré-saída 80) e firewall não trabalhando juntos

3

Li muitos artigos e respostas sobre este tópico e estive em discussão com o suporte Linode, mas ninguém parece ser capaz de responder ao meu problema exato.

Parece fácil - eu gostaria de usar um firewall iptables para restringir o acesso a todas as portas, exceto 22, 80 e 443. O Linode tem uma ótima descrição aqui: link e usei as regras de firewall como estão. O firewall funciona bem.

Eu também quero pré-programar algumas portas, porque este é um aplicativo nodejs. Então eu usei:

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

Essas regras funcionam se eu não tiver as regras de firewall. Na verdade, estou usando-os agora, mas tive que deixar o firewall para baixo.

Se eu adicionar as regras de firewall, o PREROUTING para de funcionar. Se eu salvar as regras iptables ativas em um arquivo para exibição, tanto o firewall (regras de filtragem) quanto o PREROUTING (regras nat) estarão presentes, mas apenas as regras de firewall funcionarão. Veja aqui:

# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*security
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*raw
:PREROUTING ACCEPT [1620:139613]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*nat
:PREROUTING ACCEPT [4:248]
:INPUT ACCEPT [6:376]
:OUTPUT ACCEPT [12:728]
:POSTROUTING ACCEPT [12:728]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*mangle
:PREROUTING ACCEPT [1620:139613]
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
:POSTROUTING ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Wed Mar 26 02:40:04 2014 

Se eu usar iptables -F , ele só liberará as regras do firewall (filtro) e o PREROUTING começará a funcionar novamente. Então é definitivamente um conflito. A ordem dos blocos de regras não parece importar, já que esta (acima) é a saída padrão do iptables, independentemente da ordem em que eu salvei as regras para o iptables.

Para mim, parece que é uma das duas coisas:

  1. PREROUTING portas que também têm a regra ACCEPT podem significar o redirecionamento é ignorado
  2. que sou PREROUTING para uma porta que está tecnicamente bloqueada (mas achei que é onde o "PRE" entrou)

Alguém sabe?

Obrigado!

Paul

    
por Paul Wright 26.03.2014 / 20:04

1 resposta

5

Após PREROUTING, os pacotes locais vão para o filtro local, onde são descartados (seu caso 2).

Então você só precisa permitir o tráfego de entrada para essas portas no iptables:

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

iptables -A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT

Como você está redirecionando o tráfego http (s) de 80/443 para 8080/3000 é como se as últimas portas estivessem abertas e expostas à Internet, portanto não há diferença em relação ao mundo exterior e não há mais implicações de segurança.

    
por 26.03.2014 / 21:13