EDITAR:
É surpreendente como o desejo de encontrar uma solução às vezes é suficiente para levar alguém lenta mas firmemente a uma solução. Além disso, quanto mais releio a minha pergunta para esclarecê-la, percebo que esta "pergunta" excede o âmbito de uma pergunta 'simples' ou a ideia de obter respostas por parte desta comunidade.
Reestruturarei a estrutura desta questão nas próximas horas, à medida que entender cada vez mais os conceitos operacionais do iptables. O processo de compreensão também rendeu questões mais específicas que irei fornecer a esta comunidade em breve e vincular a esta questão.
Resumindo: Meu problema é encontrar o conjunto certo de regras para fazer:
- minhas próprias regras
- fail2ban
- lista negra de DNS adicional funciona em conjunto, enquanto "minhas regras" também implica colocar meu país na lista de permissões para ssh e, portanto, bloquear todos os outros países para ssh,MASpermitindotodospaíses/intervalos/IPs para consultas DNS, exceto um conjunto de aqueles na lista negra.
Em números:
- para ssh: lista branca de 50 intervalosOUlista negra aprox. 620.000 intervalos (compostos via ipdeny.com etc.)
- entradas na lista negra para DNS: aprox. 140 (conjunto de regras u32,roteiro(s))
- 25+/- regras para os serviços adicionais (veja abaixo)
Versão lírica: Estou lutando para implementar uma solução para minhas necessidades: Cenário como segue. Eu tenho um servidor (suponha DNS por enquanto). Além do bind ssh, sendmail, https e munin precisam ser levados em consideração:
Em geral, isso foi fácil de conseguir. Além disso, o fail2ban foi instalado porque estava enfrentando alguns ataques (d)dos de todo o mundo. Meu objetivo principal era bloquear o servidor tanto quanto possível.
Minha ideia era colocar na lista de permissões apenas alguns intervalos de IP do meu país que correspondam a possíveis alocações dinâmicas de DNS de ISPs aos quais tenho acesso - ou seja, DSL e celular. Assim não vou me trancar.
Pesquisei todos os intervalos de rede dos meus ISPs, o que resultou no seguinte conjunto de scripts/regras:
#ports:
# 22: SSH (#4,#5) (ssh)
# 25: SMTP (#20) (outgoing, sendmail for f2b report)
# 53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind)
# 443: HTTPS (#10) (outgoing, dns-blacklist update)
#4949: munin (#26) (outgoing, sending client stats to server)
# Modify this file accordingly for your specific requirement.
# http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules
# 1. Delete all existing rules
#iptables -F
# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 4. Allow ALL incoming SSH
#iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated)
# note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban!
iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
service fail2ban restart
# 10. Allow outgoing HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT
service munin-node restart
sh /root/update_domain_blacklist.sh
Reiniciar o fail2ban antes do conjunto de regras nº 10 é garantir que as cadeias sejam (re)configuradas corretamente após serem eliminadas do iptable (liberadas por -F no início do script. O mesmo se aplica ao munin, que reclamou de não ser capaz de acessar seu servidor se não sendo reiniciado após a aplicação de regras de exceção).
Pretendo aplicar as regras via /etc/rc.local. Isso implica que já foram criadas cadeias para fail2ban e munin.
O fluxo de verificação do firewall que gostaria de alcançar é: a solicitação é DNS? -> (uma); ssh? -> (b); um dos meus outros serviços? -> (c); algo mais? -> (d):
- (a): servir, se não estiver na lista negra, script de lista negra de DNS
- (b): servir, se não estiver na lista negra OU se estiver na lista branca de acordo com meu intervalo de rede definido
- (c): servir, de acordo com minhas regras definidas
- (d): DROP/TARPIT/qualquer prática recomendada
- se (b), passe adicionalmente fail2ban
Problemascom regras acima:
- fail2ban entra em ação antes da verificação da lista de permissões -bompara minha parte ssh,ruimpara minha parte de DNS: meu palpite
Tentei então usar o ipset para bloquear/colocar na lista negra "o mundo inteiro", exceto meus 50 intervalos. Teoricamente possível, mas a análise dos intervalos de 620k dura mais de 10 minutos; Cancelei a operação e voltei para os intervalos da minha lista de permissões. Próxima ideia: ainda use ipset para os 50 intervalos e bloqueie/coloque na lista negra osinversodessa lista para ssh:
!/bin/bash
#Script to process ip ranges to ban using IPSet and IPTables
# 10. Allow outgoing HTTPS
iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134)
iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -I INPUT -p tcp --dport 4949 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT
#iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
ipset create countryblock hash:net
while read line; do ipset add countryblock $line; done < blocklist.txt
iptables -A INPUT -m set ! --match-set countryblock src -j DROP
enquanto 'blocklist.txt' contém meus 50 intervalos a serem colocados na lista de permissões ou o inverso de serem colocados na lista negra. Mas o inverso desse conjunto também implica que TODO o tráfego DNS seja bloqueado, etc... isso me deixa maluco! :-D
Mas, por algum motivo, eu não tive acesso ao meu servidor ou o inverso não funcionou (tentei alguns miniaplicativos web2ssh apenas para verificar se havia um prompt ssh).
Também encontrei definições de regras de criação de ação fail2ban correspondentes em suas configurações; mas para reduzir a sobrecarga, eu realmente adoraria deixar as regras padrão do munin e do f2b como estão e aplicar as modificações necessárias às minhas próprias regras e talvez ao script dns-blacklist.
Eu sei que esta pergunta/solicitação pode não ser a mais fácil e você pode perguntar por que não simplesmente usar o fail2ban? Gosto de saber se há ações suspeitas e, portanto, é bom receber um relatório de host bloqueado. Embora eu não queira ter isso para todos os hosts estrangeiros (dez vezes mais, já que estou executando o fail2ban em mais de 10 servidores).
Outra abordagem talvez seria um servidor/roteador de firewall dedicado, lidando com todo o tráfego. Mas esta seria uma configuração de regra bastante complexa e não quero bloquear acidentalmente TODOS os meus servidores devido a uma configuração incorreta/regra defeituosa estúpida ou algo assim. Além disso, isso excederia meu tráfego livre, que atualmente é dividido entre todos os 10 servidores.
Espero que algum amigo geek e perspicaz esteja por perto disposto a me ajudar a classificar as regras corretamente.
Antes de preencher desnecessariamente esta questão, estou em espera agora, fornecendo as informações solicitadas.
PS:talvez alguém possa adicionar a tag "ipset", pois não consigo criá-la por falta de reputação. Obrigado!
Responder1
Parece terrivelmente complicado....
Acho que você pode encontrar grande valor em segurança e desempenho apenas movendo sshd
-se munin
para portas diferentes.
A execução desses serviços em portas que não correspondem ao padrão irá suprimir a maior parte do tráfego de força bruta/dos. O Fail2ban deve ser capaz de detectar quaisquer valores discrepantes depois disso.
Ao mudar para custom
as portas, você essencialmente cria o seguinte:
iptables -A "Anyone that doesn't know the correct ssh port" -j DROP
Você ainda pode registrar tentativas de conexão à porta 22
, mas acho que provavelmente poderá encontrar melhores usos para o espaço em disco.
Responder2
ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment
iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT
ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44
salve tudo ipset
ipset save >all.txt
carregar tudo pronto
ipset load <all.txt