Tenho visto muitas pessoas usando os sinalizadores ESTABLISHED e RELATED juntos para ACCEPT o tráfego após uma conexão ter sido aceita anteriormente (consulte Permitindo Sessões Estabelecidas ).
Digamos que eu configurei meu firewall com as seguintes regras:
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp -s x.x.x.x --dport 22 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -m tcp ! --syn -d x.x.x.x -j ACCEPT
-A INPUT -i all -p all -j REJECT
Espero que todas as novas conexões sejam bloqueadas pela última regra, a menos que seja para a porta 80 ou 22. No entanto, para a porta 22, limito as conexões a um endereço IP de entrada (digamos, meu escritório doméstico).
Então, espero que a regra com --state ESTABLISHED,RELATED
aceite apenas o tráfego conectado anteriormente usando a regra com a porta 80 ou a porta 22.
Pelo que posso ver em meus contadores de firewall, porém, parece que se eu tiver ESTABLISHED e RELATED, qualquer tráfego no TCP pode ser enviado para o servidor...
Nos meus testes, digamos que eu tenha outro servidor HTTP na porta 8080, primeiro conecto na porta 80 claramente permitida, então, de alguma forma, consigo conectar e enviar um GET e receber a resposta na porta 8080, mesmo que ela não esteja aberta.
Da mesma forma, se eu conectar na porta 22, qualquer outra porta TCP atualmente aberta e escutando em 0.0.0.0 estará acessível. Minha preocupação é que isso significa que alguém que se conecta à porta 80 agora tem acesso à porta 22, pois o RELATED permite (supondo que a porta 80 esteja aberta, uma nova conexão é feita na porta 22).
Estou correcto? Eu estava pensando em mudar a regra para isso:
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp ! --syn -d x.x.x.x -j ACCEPT
(ou seja, nenhum estado RELACIONADO, apenas ESTABELECIDO)
Eu também pensei que ! --syn
iria bloquear o estabelecimento de novas conexões usando essa regra, mas isso também parece incorreto...
Deixe-me supor as 3 coisas a seguir em sua configuração:
-A INPUT -i all -p all -j REJECT
é 0AFAIK o
-i
parâmetro não possui uma palavra-chave comoall
, por isso é considerado um nome de interface. Não há erro ao carregar esta regra porque é legal criar regras em interfaces que ainda não existem, ou que não estão ativas. Portanto, sua última regra não pega nada e, como sua política padrão éACCEPT
, todos os pacotes que não correspondem a nenhuma regra são aceitos.Se você deseja o que espera, não mencione nenhuma interface e a regra será aplicada a todas as interfaces disponíveis:
Este também é um bom exemplo para definir uma política padrão de DROP na mesa (mas pelo menos coloque-se na lista de permissões antes, é claro):
Espero que isso resolva seu problema. Informe-nos se o contador de pacotes ou a política padrão não for como eu supunha.