Dica sobre iptables ACCEPT e DROP

1. Dica sobre iptables ACCEPT e DROP

hunter
hunter2800aa

(usa Debian)

Enviado em 01/11/2024 - 08:13h

Bom dia galera, gostaria de tentar entender esse problema!!!

Tenho as seguintes regras no meu firewall/gateway nessa mesma ordem...

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A FORWARD -p icmp -j DROP

Porem os computadores em minha rede conseguem se pingar e pingar outras redes internas respeitando o limite 1/s....
mas não conseguem pingar para fora da rede (sites), ao não ser se eu remover a ultima regra DROP do FORWARD

E meu servidor não consegue pingar fora se eu não remover e penultima regra DROP do INPUT...

Se eu remover essas duas ultimas regras funciona de boas, mas os pings não respeitam o limite 1/s


Lembrando q lá no começo do Firewall estou usando as regras padroes assim:
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD DROP



  


2. Re: Dica sobre iptables ACCEPT e DROP

Eduardo Paim Silveira
eduardo

(usa Linux Mint)

Enviado em 01/11/2024 - 08:23h

Acredito que o problema seja que você está liberando o echo-request, mas não o echo-reply, e não possui nenhuma regra para conexões "Relacionadas ou Estabelecidas".
Quando você envia um ping, você envia um echo-request. Se o destino restponder, ele vai retornar um echo-reply. Ou seja, quando um equipamento pinga para fora, ele passa pela regra do FORWARD (echo-request). Porém, o retorno (echo-reply) acaba caindo na última regra (DROP), pois não tem regra liberando o echo-reply.
O mesmo para INPUT, só vai funcionar se alguém pingar firewall, pois será INPUT. Já o firewall pingar vai bloquear o retorno.
Você pode resolver isso adicionando a regra do echo-reply ou adicionando a regra que libera conexões relacionadas ou estabelecidas.

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

Adicione elas antes das regras atuais. Dessa forma, o echo-reply que é referente o echo-request vai deixar passar.
Pelo que me recordo, o ping inicia uma nova conexão a cada echo-request, ou seja, o ping seguinte não é relacionado ao anterior. Caso seja, vai começar a cair nessa nova regra e não vai ter o limite de 1 por segundo. Faça um teste para confirmar.



3. Re: Dica sobre iptables ACCEPT e DROP

hunter
hunter2800aa

(usa Debian)

Enviado em 01/11/2024 - 08:49h


Muito obrigado por responder eduardo.....

Sim...eu tenho as regras
iptables -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
iptables -A FORWARD -j ACCEPT -m state --state RELATED,ESTABLISHED

Porem, elas são as ultimas regras do meu firewall.....
Vou tentar colocar elas antes das regras DROP do meu firewall pra ver se resolve.....

Volto aki pra fazer se deu bom!!!!


4. Re: Dica sobre iptables ACCEPT e DROP

Eduardo Paim Silveira
eduardo

(usa Linux Mint)

Enviado em 01/11/2024 - 08:55h

Isso, coloque pelo menos antes do DROP.
Caso não funcione 1 por segundo, desta forma:

iptables -A FORWARD -j ACCEPT -m state --state RELATED,ESTABLISHED
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp -j DROP

Tente colocar um DROP do echo-request apenas.
Ou seja:

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP
iptables -A FORWARD -j ACCEPT -m state --state RELATED,ESTABLISHED
iptables -A FORWARD -p icmp -j DROP

Faz tempo que testei esse tipo de regra e não me recordo como o ping se porta.



5. Re: Dica sobre iptables ACCEPT e DROP

Buckminster
Buckminster

(usa Debian)

Enviado em 01/11/2024 - 12:01h

Faça um café, sente confortavelmente e leia com calma!

O iptables lê as regras de cima para baixo e da esquerda para a direita de acordo com cada tabela.

Exemplo:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j DROP

A primeira regra libera, a segunda rejeita e a terceira regra nega o acesso.
DROP bloqueia e não manda aviso.
REJECT bloqueia e manda um aviso ao destino (envia pacote icmp unreachable).

No Iptables, a primeira regra em caso de conflito e/ou na mesma chain e/ou na mesma tabela SEMPRE SEMPRE SEMPRE terá o privilégio e as regras devem ser colocadas da regra mais específica para a regra mais geral, então, o acesso na porta 443 será liberado para todos, mesmo rejeitando e negando o acesso nas regras subsequentes.
Lembrando que nas regras acima não foi determinada nenhuma tabela (-t), então, elas serão aplicadas somente na tabela padrão, a filter, e, no caso, somente na chain INPUT.

Têm três tabelas: "filter", "nat" e "mangle".
O pacote é bloqueado/liberado na tabela "filter".
A tabela "nat" trata de alterações nos endereços de origem e destino do pacote e nas portas TCP/UDP.
A tabela "mangle" trata de alterações em campos como ToS, para lidar com QoS, filas, etc.

O pacote ao entrar na máquina, passa primeiro na cadeia PREROUTING da tabela nat (caso tiver alguma regra PREROUTING), onde você pode alterar o endereço de destino dele e assim mudar a forma como o pacote é roteado.
De lá, ele pode ir pra cadeia FORWARD da tabela filter se o destino dele for outra máquina ou pode ir para a cadeia INPUT da tabela filter, se o destino dele for a própria máquina.
Se o objetivo é bloquear pings vindos de fora para a rede interna, a regra deve ser colocada na cadeia INPUT, assim:

iptables -A INPUT -p icmp --icmp-type echo-request -s ! $redelocal -j DROP

Mas não basta passar o comando, ele tem de entrar no lugar certo, pois, se, por exemplo, eu tiver outra regra antes dessa dando um "-j ACCEPT" no pacote ICMP ele será aceito e não procesará a regra do "-j DROP".

Caso o objetivo for controlar o ping para outras máquinas, em vez da cadeia INPUT usa-se a cadeia FORWARD.
Se o objetivo for controlar tanto o ping para própria máquina, quanto para rede interna, usa-se a regra nas duas cadeias (INPUT e FORWARD), mas não controla o ping entre as máquinas da mesma sub-rede interna.

Seguindo no exemplo dado antes: caso queiramos negar o acesso à porta 443 somente para alguns IPs, por exemplo, devemos colocar essas regras ACIMA da primeira regra:
iptables -A FORWARD -p tcp -s 192.168.1.1 --dport 443 -j DROP (regra mais específica)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT (regra mais geral)

E caso queira o contrário, liberar para somente alguns IPs, daí inverte:
iptables -A FORWARD -p tcp -s 192.168.1.1 --dport 443 -j ACCEPT (regra mais específica)
iptables -A INPUT -p tcp --dport 443 -j DROP (regra mais geral)

A ordem depende do que você quer, mas aconselho a criar um padrão dentro do teu script, por exemplo, primeiro as liberações (regras mais específicas) e depois uma regra bloqueando tudo (regra mais geral).

INPUT: filtra pacotes quando o destino final é o próprio servidor;
OUTPUT: qualquer pacote gerado no próprio servidor e que deva sair para a rede será tratado pela chain OUTPUT;
FORWARD: filtra qualquer pacote que atravessa o servidor, oriundo de uma máquina e direcionado a outra.

Basicamente funciona assim (lembrando que "servidor" aqui é o sistema onde o Iptables está instalado):
Bloqueando na INPUT pode bloquear para toda a rede porque nem entra no servidor, mas isso depende dos parâmetros colocados na regra, porém, o padrão é bloquear somente para o próprio servidor;
Bloqueando na OUTPUT entra no servidor, mas não sai para a rede;
Bloqueando na FORWARD não entra no sistema do servidor e não sai para a rede, os pacotes são tratados pelo Iptables.
Em qualquer uma das chains os pacotes são recebidos pelo segurança de entrada da boate e só deixa entrar - ou dá um cacete no penetra - se corresponder a alguma regra, por isso se chama "firewall (parede de fogo)".

https://www.vivaolinux.com.br/artigo/Manual-do-IPtables-Comentarios-e-sugestoes-de-regras/?pagina=1

As regras do iptables que você forneceu, controlam o tráfego ICMP, especificamente controlam os pacotes de "echo request" que são usados no comando ping.
O echo tem o echo-request (requisição enviada) e o echo-replay (resposta da requisição).

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Esta regra permite que pacotes ICMP do tipo "echo request" entrem no servidor, mas limita a aceitação de 1 por segundo. O destino é o sistema onde o Iptables está e é esse sistema quem responderá ou não ao ping.

iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Semelhante à regra anterior, mas se aplica a pacotes que estão sendo encaminhados (ou seja, não são destinados ao próprio servidor, mas sim a outro host na rede).
O parâmetro echo-request na chain FORWARD bloqueia ping das máquinas da rede interna para fora, mas não bloqueia entre as máquinas da rede interna.

iptables -A INPUT -p icmp -j DROP
Essa regra bloqueia todos os tipos de pacotes ICMP que tentam entrar no servidor, ou seja, bloqueia totalmente o ICMP (ping).

iptables -A FORWARD -p icmp -j DROP
Similar à regra anterior, mas se aplica a pacotes ICMP que passam pelo servidor com destino à rede interna.

O echo-request envia o pedido e aguarda o echo-reply da outra máquina.

"Porem os computadores em minha rede conseguem se pingar e pingar outras redes internas respeitando o limite 1/s....
mas não conseguem pingar para fora da rede (sites), ao não ser se eu remover a ultima regra DROP do FORWARD"
Isso acontece porque os pacotes ICMP estão bloqueados pela última regra na chain FORWARD, então o Iptables não deixará sair para fora da rede e, como já visto, continuam pingando entre si na rede interna.

"E meu servidor não consegue pingar fora se eu não remover e penultima regra DROP do INPUT..."
Óbvio, está bloqueado na chain INPUT (pacotes com destino ao próprio servidor) então o echo é bloqueado para o sistema onde o Iptables está.

"Se eu remover essas duas ultimas regras funciona de boas, mas os pings não respeitam o limite 1/s"
Você testou o ping no servidor e em alguma máquina da rede?
Talvez tenha alguma outra regra interferindo nelas ou faltou a regra mais geral.

Organize seu Iptables sempre por chains, coloque todas as chains INPUT num mesmo bloco, depois as chains OUTPUT e por fim as chains FORWARD para melhor organização e entendimento.
Exemplo:

# Regras INPUT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j DROP
etc etc
#
# Regras OUTPUT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j REJECT
iptables -A OUTPUT -p tcp --dport 443 -j DROP
etc etc
#
# Regras FORWARD
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -j REJECT
iptables -A FORWARD -p tcp --dport 443 -j DROP
etc etc
#
Regras OUTPUT raramente são necessárias, então geralmente você terá somente regras INPUT e FORWARD.

Uma regra numa chain, por definição não interfere nas outras chains, porém, depende dos parâmetros colocados.

Por exemplo, deixe as regras assim e faça um teste:
#
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
#
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP

O Iptables sempre foi meio chato nesse quesito, o Nftables, sucessor oficial dele está melhor nisso.
https://img.vivaolinux.com.br/artigo/Instalar-e-configurar-o-Nftables-com-exemplos-basicos-de-config...

Recomendo deixar as políticas padrões assim, mas antes faça o teste acima.
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Assim bloqueará tudo em todas as tabelas nas chains INPUT e FORWARD, menos na OUTPUT ou coloque tudo DROP.
IMPORTANTE: caso você colocar essas políticas padrões talvez isso mexerá com todas tuas regras e você deverá refazê-las, atente para isso, pois pode bagunçar todo teu script atual do Iptables.

Use o comando no terminal:
iptables -L -n -v
para listar e verificar se as regras ACCEPT estão corretamente posicionadas antes de qualquer regra de bloqueio.

Agora me diga, especificamente, o que você quer?
1- Bloquear ping que vem de fora para tua rede e para teu servidor, mas permitindo teu servidor e tua rede pingarem entre si e para fora?
2- Permitir ping que vem de fora para tua rede e para teu servidor com limite de resposta de 1 segundo e permitir tua rede e teu servidor pingarem para fora?

É melhor postar todo teu script, pois pode ter alguma outra regra interferindo.
Além disso, caso for alguma dessas duas opções acima que você quer, não aconselho.
Aconselho a bloquear todo e qualquer ping com regras e, quando precisar pingar, libere o ping, teste o ping e depois bloqueie de novo, mas isso depende do nível de segurança necessário para tua rede.

Lembre que ping entre máquinas da rede local não passam pelo servidor, ou seja, mesmo com uma regra FORWARD bloqueando ping ainda assim as máquinas da rede local pingarão entre si, a não ser que tiver NAT (mascaramento, MASQUERADE), daí você pode bloquear ping entre as sub-redes com regras específicas.

Exemplo de bloquear ping completamente:
iptables -A INPUT -i enpXXXXX -p icmp --icmp-type 8 -j DROP
iptables -A FORWARD -i enpXXXXX -p icmp --icmp-type 8 -j DROP
No lugar de enpXXXXX tu coloca a placa de rede do servidor.
O número 8 é o echo da RFC 792 (https://datatracker.ietf.org/doc/html/rfc792) e bloqueia echo-request e, consequentemente, echo-replay.
O número 0 bloqueia o echo-replay (pode colocar echo-reply na regra no lugar de echo-request, daí receberá a requisição ping, mas não responderá).
Ou coloque echo-request mesmo, caso preferir, mas veja bem, o parâmetro echo-request na chain FORWARD bloqueia ping das máquinas da rede para fora, mas não bloqueia entre as máquinas da rede, somente com NAT, como já dito.

Você pode também bloquear acrescentando no início do script (no Debian):
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all



_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


6. Re: Dica sobre iptables ACCEPT e DROP

hunter
hunter2800aa

(usa Debian)

Enviado em 01/11/2024 - 14:51h



Faça um café, sente confortavelmente e leia com calma!


Muito obrigado Buckminster...realmente li duas vezes com calma.....foi muito boa a explicação, agradeço muito!!!
Isso sim é uma resposta rica em detalhes!!!!

Com suas dicas fiz algumas mudanças no firewall mas só vou rodar ele quando não tiver mais ninguem na firma ou bem no finalzinho da tarde, pois umas regras iniciais são:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t nat -F POSTROUTING
Então se tiver alguem no telefone com cliente vai derrubar!!!


Mais uma vez agradeço muito a sua paciência e competência!!!!



7. Re: Dica sobre iptables ACCEPT e DROP

Buckminster
Buckminster

(usa Debian)

Enviado em 01/11/2024 - 15:33h

De nada.
O Iptables é meio chato (sempre foi) nesse quesito de ordem de colocação das regras, às vezes uma regra colocada numa posição em que não deveria estar, bagunça todo o script.
Porém, não é tão difícil quanto parece, basta seguir a lógica de que o Iptables lê as regras de cima para baixo e da esquerda para a direita e a primeira regra em caso de conflito e/ou na mesma chain e/ou na mesma tabela sempre terá o privilégio e as regras devem ser colocadas da regra mais específica (sugiro as liberações) para a regra mais geral (o bloqueio de tudo que não foi liberado anteriormente em cada bloco de regras).
E organize o script, use e abuse dos comentários no script... e tenha sempre em mente: o quê eu quero fazer nessa regra?


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


8. Re: Dica sobre iptables ACCEPT e DROP

hunter
hunter2800aa

(usa Debian)

Enviado em 04/11/2024 - 09:24h

Gostaria de agradecer ao Eduardo e Buckminster que comentaram sobre o echo-reply...

Consegui resolver dessa forma com a dica de vcs!!!

A regra ficou dessa maneira:
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-reply -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A FORWARD -p icmp -j DROP

Vlw galera!!!!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts