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:
-
PREROUTING
portas que também têm a regra ACCEPT podem significar
o redirecionamento é ignorado
- que sou
PREROUTING
para uma porta que está tecnicamente bloqueada (mas achei que é onde o "PRE" entrou)
Alguém sabe?
Obrigado!
Paul