Qual é a diferença entre essas duas regras iptables?

6

Tentando permitir tráfego ssh de entrada na porta 22. O comportamento padrão é DROP todo o tráfego de entrada.

Me deparei com dois artigos sobre como permitir o tráfego. No entanto, eles são diferentes.

## open port ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Vs

# Allow all incoming SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Parece que o primeiro permite todo o tráfego e, em seguida, especifica uma rede específica. Parece que esses são mutuamente exclusivos?

Quais são as diferenças entre estes dois e qual deles devo usar?

    
por csi 23.08.2013 / 02:30

3 respostas

16

Ambos os conjuntos de regras têm problemas, e eu não usaria nenhum deles como estão.

No primeiro conjunto, a primeira regra permite novo tráfego de entrada para a porta de destino 22 de qualquer lugar. Isso não é um problema.

O primeiro problema é que a segunda regra permite novo tráfego de entrada para a porta de destino 22 de uma sub-rede específica. Isso é completamente redundante, já que a primeira regra permitiu o tráfego de qualquer lugar.

Meu palpite é que você leu algum tutorial que usou essas regras como exemplos (mutuamente exclusivos), aconselhando-o a selecionar um ou outro, mas não ambos.

O segundo problema é que outra regra é necessária antes dessa regra para tornar o firewall totalmente stateful, e essa regra está faltando aqui. Sem essa regra, somente o pacote SYN seria permitido e a conexão nunca seria concluída.

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

O segundo conjunto de regras tem um problema semelhante. Eu não sei quem originalmente escreveu este conjunto de regras, mas ele foi amplamente copiado em toda a Internet. Parece ter sido escrito por alguém que não estava familiarizado com firewalls stateful em geral, ou iptables em particular.

Neste conjunto de regras, a regra de entrada permite tráfego de entrada novo e estabelecido para a porta de destino 22 de qualquer lugar. Em seguida, a regra de saída permite o tráfego estabelecido da porta de origem 22 para qualquer lugar. Isso é essencialmente um espelho da primeira regra e algo como isso é necessário se sua política padrão no tráfego de saída for descartá-lo ou rejeitá-lo.

O problema é que essas regras de saída se tornam redundantes muito rapidamente, o que leva a problemas de desempenho, bem como problemas de compreensão para os seres humanos que precisam ler as regras mais tarde. Se você estiver descartando o tráfego de saída, apenas uma regra será necessária para o tráfego de saída estabelecido (correspondendo ao tráfego de entrada permitido) em qualquer porta, independentemente de quantas portas de entrada você permitir.

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Para um firewall de host em que a política de entrada padrão é negar tráfego e a política de saída padrão é permitir tráfego, a maioria das regras estará na tabela INPUT. É suficiente ter a regra stateful e, em seguida, regras para abrir as portas para qualquer tráfego que você precisar.

Por exemplo, para permitir conexões ssh e http:

-P INPUT DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

Se você também está negando o tráfego de saída por padrão, também é necessário permitir o tráfego de retorno para essas conexões de entrada permitidas.

-P OUTPUT DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

E isso é um firewall tão simples e efetivo quanto o iptables pode ser.

    
por 23.08.2013 / 03:32
2
O top parece um pouco confuso sobre o que está tentando fazer, ele só parece estar permitindo pacotes ssh se o iptables não tiver visto tráfego em ambas as direções, muito estranho.

O inferior é muito mais sensato, mas a segunda linha é redundante, a menos que você tenha uma política diferente de ACCEPT em sua cadeia OUTPUT. (iptables -L e procure por "Chain OUTPUT (policy XXXXXX)").

Você provavelmente quer apenas a primeira linha do conjunto inferior.

    
por 23.08.2013 / 03:14
2

A linha 1 do primeiro conjunto permitirá tráfego INBOUND da porta 22 se a conexão for = NOVA CONEXÃO. A linha 2 do primeiro conjunto parece não ser necessária, pois só permite que o tráfego da porta 22 para um intervalo de rede definido também seja uma nova conexão. No entanto, a regra anterior na linha 2 já permitiu o tráfego.
Isso parece errado ou incompleto

2º set linha 1, Permitir tráfego INBOUND no 0 se port = 22 e for conexões novas ou estabelecidas Linha 2, Alllow OUTBOUND traffic if device = eth0 & porta = 22 & conexão é estabelecida

Isso permitirá conexões SSH a este host e também permitirá SSH de saída.

O 2º set é a sua melhor opção

    
por 23.08.2013 / 03:12