Como regra geral, use REJECT quando quiser que a outra extremidade saiba que a porta está inacessível' use DROP para conexões com hosts que você não quer que as pessoas vejam.
Normalmente, todas as regras para conexões dentro de sua LAN devem usar REJECT. Para a Internet, com exceção do ident em determinados servidores, as conexões da Internet geralmente são DESATIVADAS.
O uso de DROP faz com que a conexão pareça ser para um endereço IP desocupado. Os scanners podem optar por não continuar verificando endereços que parecem desocupados. Dado que o NAT pode ser usado para redirecionar uma conexão no firewall, a existência de um serviço bem conhecido não indica necessariamente a existência de um servidor em um endereço.
Ident deve ser passado ou rejeitado em qualquer endereço que forneça serviço SMTP. No entanto, o uso de pesquisas de Ident por servidores SMTP caiu em desuso. Existem protocolos de bate-papo que também contam com um serviço de identificação funcional.
EDIT: Ao usar regras DROP: - Os pacotes UDP serão descartados e o comportamento será o mesmo que conectar a uma porta sem firewall sem serviço. - Os pacotes TCP retornarão um ACK/RST que é a mesma resposta que uma porta aberta sem serviço nela responderá. Alguns roteadores responderão com um ACK/RST em nome de servidores que estão inativos.
Ao usar regras REJECT, um pacote ICMP é enviado indicando que a porta não está disponível.
Normalmente, você deseja ignorar as sondagens de invasores para determinadas portas, o que significa que você não deseja enviar de volta 'conexão recusada'. 'Conexão recusada' significa: 'há um servidor aqui' e, possivelmente, fornece mais informações, enquanto soltar um pacote não fornece pistas sobre versões de software, possíveis vulnerabilidades ou mesmo o fato de um servidor estar ouvindo seu IP.
O acima é uma das principais razões para usar DROP em vez de REJECT.
Eu vejo muitas respostas conflitantes aqui e dado que este é o primeiro artigo no Google com as palavras corretas; aqui está a explicação correta.
É simples:
DROP não faz nada com o pacote. Ele não é encaminhado para um host, não é respondido. A página de manual do IPtables diz que derruba o pacote no chão, ou seja, não faz nada com o pacote.
REJECT difere de DROP por enviar um pacote de volta, mas a resposta é como se um servidor estivesse localizado no IP, mas não tivesse a porta em estado de escuta. IPtables enviará um RST/ACK no caso de TCP ou com UDP uma porta de destino ICMP inalcançável.
Se você está tentando esconder inteiramente a existência de sua máquina, -j DROPé apropriado. Por exemplo, você pode usar isso para implementar uma lista negra.
Se você está tentando esconder o fato de que uma porta está aberta, você deve imitar o comportamento que ocorreria se a porta não estivesse aberta:
Se um scanner de porta perceber que algumas portas estão descartando pacotes enquanto a maioria os está rejeitando, ele pode presumir que os pacotes descartados estão em portas abertas, mas ocultas.
Apesar de muitas respostas corretas, apenas meus dois centavos:
Aqui está um pequeno PoC FW.IDS-DROP-vs-REJECT de mim para o assunto no que diz respeito às regras para ban-system (firewall, IDS, etc).
Em breve:
DROPpode ser usado para intrusos reincidentes, se banir todas as portas (parece que o servidor está inativo no lado do intruso)
REJECT --reject-with tcp-reseté a melhor escolha para banimento de várias portas, porque parece se comportar como uma porta fechada real
se algumas portas estiverem respondendo (o intruso sabe que o host está vivo), DROPe REJECT(sem tcp-reset) dará ao intruso um "sinal" de que algo bloqueando está lá (para que possa estimulá-lo a continuar o "ataque" na esperança de fornecer os dados necessários em algum ponto)
Mesmo quando a regra diz "DROP", o sistema ainda responde a um SYN de entrada com um TCP RST/ACK - que é o comportamento padrão para portas sem serviços em execução. (tcpdump et al não registra isso.)
Se um serviço estiver em execução, o SYN será atendido com o TCP SYN/ACK.
Como o DROP não responde normalmente com um TCP SYN/ACK, mas com um RST/ACK, sua regra DROP anunciará seu firewall e os scanners de porta saberão que você está protegendo algo e podem continuar martelando você na esperança de travar seu firewall.
Agora, o nmap pode relatar "filtrado" em vez de "fechado", por exemplo:
$ nmap localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT STATE SERVICE
21/tcp open ftp
53/tcp open domain
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds
$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT STATE SERVICE
21/tcp open ftp
53/tcp open domain
80/tcp open http
1111/tcp filtered lmsocialserver
Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds
$ iptables -D INPUT 1
Como tal, a única configuração de firewall "invisível" é aquela em que um dispositivo dedicado fica entre seus dispositivos e apenas encaminha portas seletivamente.
Se você realmente quer mexer com os scanners básicos, você pode TARPIT tcp connections, que define a janela TCP como 0 para que nenhum dado possa ser transferido após a conexão ser aberta, ignorando solicitações para fechar a conexão, o que significa que o scanner precisa esperar para que o tempo limite da conexão ocorra, se quiser ter certeza. Mas é trivial para um invasor detectar isso e tornar seu tempo limite muito curto.
Considerando tudo, provavelmente é melhor usar REJECT - ou colocar um dispositivo de encaminhamento de porta dedicado entre seu servidor e a Internet.
Ou apenas executando serviços em suas máquinas voltadas para a Internet que não exigem firewall.
Geralmente, REJECT é melhor para servidores da Web, pois qualquer serviço que esteja tentando acessá-lo (provavelmente você) obterá uma resposta rapidamente e os usuários ou outros serviços não ficarão esperando se perguntando se há uma interrupção na rede.
Como regra geral, use REJECT quando quiser que a outra extremidade saiba que a porta está inacessível' use DROP para conexões com hosts que você não quer que as pessoas vejam.
Normalmente, todas as regras para conexões dentro de sua LAN devem usar REJECT. Para a Internet, com exceção do ident em determinados servidores, as conexões da Internet geralmente são DESATIVADAS.
O uso de DROP faz com que a conexão pareça ser para um endereço IP desocupado. Os scanners podem optar por não continuar verificando endereços que parecem desocupados. Dado que o NAT pode ser usado para redirecionar uma conexão no firewall, a existência de um serviço bem conhecido não indica necessariamente a existência de um servidor em um endereço.
Ident deve ser passado ou rejeitado em qualquer endereço que forneça serviço SMTP. No entanto, o uso de pesquisas de Ident por servidores SMTP caiu em desuso. Existem protocolos de bate-papo que também contam com um serviço de identificação funcional.
EDIT: Ao usar regras DROP: - Os pacotes UDP serão descartados e o comportamento será o mesmo que conectar a uma porta sem firewall sem serviço. - Os pacotes TCP retornarão um ACK/RST que é a mesma resposta que uma porta aberta sem serviço nela responderá. Alguns roteadores responderão com um ACK/RST em nome de servidores que estão inativos.
Ao usar regras REJECT, um pacote ICMP é enviado indicando que a porta não está disponível.
A diferença é que o destino REJECT envia uma resposta de rejeição para a origem, enquanto o destino DROP não envia nada.
Isso pode ser útil, por exemplo, para o serviço de identificação. Se você usar REJECT, os clientes não precisarão esperar pelo tempo limite.
Mais sobre isso: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html
Normalmente, você deseja ignorar as sondagens de invasores para determinadas portas, o que significa que você não deseja enviar de volta 'conexão recusada'. 'Conexão recusada' significa: 'há um servidor aqui' e, possivelmente, fornece mais informações, enquanto soltar um pacote não fornece pistas sobre versões de software, possíveis vulnerabilidades ou mesmo o fato de um servidor estar ouvindo seu IP.
O acima é uma das principais razões para usar DROP em vez de REJECT.
Eu vejo muitas respostas conflitantes aqui e dado que este é o primeiro artigo no Google com as palavras corretas; aqui está a explicação correta.
É simples:
DROP não faz nada com o pacote. Ele não é encaminhado para um host, não é respondido. A página de manual do IPtables diz que derruba o pacote no chão, ou seja, não faz nada com o pacote.
REJECT difere de DROP por enviar um pacote de volta, mas a resposta é como se um servidor estivesse localizado no IP, mas não tivesse a porta em estado de escuta. IPtables enviará um RST/ACK no caso de TCP ou com UDP uma porta de destino ICMP inalcançável.
Se você está tentando esconder inteiramente a existência de sua máquina,
-j DROP
é apropriado. Por exemplo, você pode usar isso para implementar uma lista negra.Se você está tentando esconder o fato de que uma porta está aberta, você deve imitar o comportamento que ocorreria se a porta não estivesse aberta:
-p tcp -j REJECT --reject-with tcp-reset
-p udp -j REJECT --reject-with icmp-port-unreachable
Se um scanner de porta perceber que algumas portas estão descartando pacotes enquanto a maioria os está rejeitando, ele pode presumir que os pacotes descartados estão em portas abertas, mas ocultas.
Apesar de muitas respostas corretas, apenas meus dois centavos:
Aqui está um pequeno PoC FW.IDS-DROP-vs-REJECT de mim para o assunto no que diz respeito às regras para ban-system (firewall, IDS, etc).
Em breve:
DROP
pode ser usado para intrusos reincidentes, se banir todas as portas (parece que o servidor está inativo no lado do intruso)REJECT --reject-with tcp-reset
é a melhor escolha para banimento de várias portas, porque parece se comportar como uma porta fechada realDROP
eREJECT
(semtcp-reset
) dará ao intruso um "sinal" de que algo bloqueando está lá (para que possa estimulá-lo a continuar o "ataque" na esperança de fornecer os dados necessários em algum ponto)Sim, usar DROP é inútil. Use REJEITAR.
Mesmo quando a regra diz "DROP", o sistema ainda responde a um SYN de entrada com um TCP RST/ACK - que é o comportamento padrão para portas sem serviços em execução. (tcpdump et al não registra isso.)
Se um serviço estiver em execução, o SYN será atendido com o TCP SYN/ACK.
Como o DROP não responde normalmente com um TCP SYN/ACK, mas com um RST/ACK, sua regra DROP anunciará seu firewall e os scanners de porta saberão que você está protegendo algo e podem continuar martelando você na esperança de travar seu firewall.
Agora, o nmap pode relatar "filtrado" em vez de "fechado", por exemplo:
Como tal, a única configuração de firewall "invisível" é aquela em que um dispositivo dedicado fica entre seus dispositivos e apenas encaminha portas seletivamente.
Se você realmente quer mexer com os scanners básicos, você pode TARPIT tcp connections, que define a janela TCP como 0 para que nenhum dado possa ser transferido após a conexão ser aberta, ignorando solicitações para fechar a conexão, o que significa que o scanner precisa esperar para que o tempo limite da conexão ocorra, se quiser ter certeza. Mas é trivial para um invasor detectar isso e tornar seu tempo limite muito curto.
Considerando tudo, provavelmente é melhor usar REJECT - ou colocar um dispositivo de encaminhamento de porta dedicado entre seu servidor e a Internet.
Ou apenas executando serviços em suas máquinas voltadas para a Internet que não exigem firewall.
Geralmente, REJECT é melhor para servidores da Web, pois qualquer serviço que esteja tentando acessá-lo (provavelmente você) obterá uma resposta rapidamente e os usuários ou outros serviços não ficarão esperando se perguntando se há uma interrupção na rede.