Tenho alguma experiência com iptables e fail2ban. Ambos estão funcionando como deveriam, mas eu gostaria de otimizar a maneira como os pacotes são "DROPed" quando ocorre a sondagem de IP e porta.
Fail2Ban está fazendo um bom trabalho bloqueando IPs que estão tentando acessar várias portas (ou seja, SSH, MySQL, etc).
No entanto, uma vez que um IP é bloqueado em uma porta específica (ou seja, porta 22 para SSH), o HOST ainda pode ser acessado via ICMP, mesmo que o Fail2Ban tenha adicionado uma condição "DROP - all" ao iptables.
Posso estar errado, mas acho que tem a ver com a ordem em que o iptables está lendo o Fail2Ban CHAIN.
Isto é o que iptables -L
revela (IPs e DNSs foram substituídos):
user@ SERVER > iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT all -- 10.10.10.1/25 anywhere
fail2ban-SSH all -- anywhere anywhere
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
fail2ban-SSH all -- anywhere anywhere
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain fail2ban-SSH (3 references)
target prot opt source destination
DROP all -- badip.baddomain.org anywhere
DROP all -- 299.299.299.11 anywhere
DROP all -- prober.hackers.com anywhere
RETURN all -- anywhere anywhere
Além disso, aqui está meu iptables
arquivo como ponto de referência:
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:fail2ban-SSH - [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
#
#
#
-A INPUT -j fail2ban-SSH
-A FORWARD -j fail2ban-SSH
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
Como você pode ver, existe uma linha que PERMITE ICMP:
ACCEPT icmp -- anywhere anywhere icmp any
Isso é feito propositalmente, pois preciso que usuários legítimos possam fazer ping em determinados servidores.
Você pode ver no meu arquivo iptables que adicionei o CHAIN "fail2ban-SSH" antes dos outros na esperança de que ele fosse lido antes de todas as outras regras, mas isso não funcionou.
Meu objetivo seria DEIXAR QUALQUER solicitação de um IP que o Fail2Ban tenha bloqueado por qualquer motivo, incluindo solicitações ICMP.
Existe uma maneira de configurar o iptables para ler as regras Fail2Ban, antes de todas as outras CHAINS e regras, para que eu possa realmente bloquear e IP em todas as portas e protocolos?
Responder1
Se entendi sua pergunta corretamente, os IPs em sua prisão SSH devem estar bloqueados em todas as portas do sistema e não devem ser capazes de executar ping em você. Todos os outros IPs devem poder executar ping.
Para banir um IP de todas as portas, você precisará configurar sua prisão SSH para usar a configuração de ação iptables-allports. Você pode configurar se deseja usar DROP, REJECT, etc. em /etc/fail2ban/action.d/iptables-blocktype.conf
[sshd]
enabled = true
action = iptables-allports[name=sshd]
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 300
bantime = 7200
Se você também quiser evitar que esse IP específico faça ping em você enquanto permite que qualquer outra pessoa que não esteja na prisão SSH faça ping, você precisará adicionar outra ação à sua prisão SSH.
- Faça cópias de iptables-allports.conf e iptables-blocktype.conf.
- Dê novos nomes aos arquivos, como: iptables-blockping.conf e iptables-blocktype-ping.conf.
- Abra iptables-blockping.conf e atualize a seção [INCLUDES] para apontar para iptables-blocktype-ping.conf.
- Abra iptables-blocktype-ping.conf e altere o tipo de bloco para
REJECT --reject-with icmp-host-prohibited
.
As prisões podem ter múltiplas ações, então diretamente abaixo de iptables-allports[name=sshd], liste o nome do seu novo arquivo de configuração de ação, iptables-blockping.conf.
Isso deve funcionar para seus propósitos - os IPs na sua prisão SSH terão entradas específicas no iptables para rejeitar solicitações de ping. Estas regras serão lidas após a sua regra para permitir pings.