Iptables para iniciantes
O Iptables é considerado um dos principais recursos defensivos para muitos administradores de sistema, apesar de ter sido substituído pelo Nftables. Os principais fabricantes de redes incorporaram o Iptables ao hardware ainda em ambientes de produção.
O Iptables é altamente versátil e aceita comandos direto do usuário que pode carregar e descarregar regras de acordo com a necessidade.
Este tutorial mostra como proteger um servidor da Web, encaminhar conexões para endereços IP internos de nossa LAN e oferecer serviços específicos apenas para endereços IP da lista de permissões.
Nota:Este tutorial do Iptables foi lançado pela primeira vez há dois anos e atualizado em 23/05/2021 com exemplos aprimorados e capturas de tela de melhor qualidade.
Como instalar
Iptables são omitidos por padrão em distribuições que incorporam Nftables.
Para instalar o Iptables em distribuições Linux baseadas em Debian, execute o seguinte comando:
Abrindo portas HTTP e HTTPS
Primeiro de tudo, vamos adicionar todas as políticas ACCEPT começando com o servidor web.
Observação: Se você criar um script com regras, não precisará usar sudo.
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Para ver as regras adicionadas, execute “iptables -L ”
Onde :
Iptables = chama o programa
-A=adiciona uma regra
INPUT=tráfego de entrada
-p=protocolo
–ddport=porta de destino
-j = especifica o “alvo”; o alvo é o tipo de política: ACCEPT, DROP, REJECT (Built-in)…
Iptables -L=lista todas as regras carregadas de iptables (Iptables -L -v=o mesmo com verbosidade.)
No exemplo acima, instruímos o Iptables a adicionar uma regra para que o tráfego de entrada através do protocolo TCP e as portas 80 (http) e 443 (https) sejam aceitas.
Podemos alterar o comando para aceitar a conexão apenas de um IP específico adicionando o parâmetro “-s ”:
Onde :
s = origem
Você também pode testar seu firewall com nmap:
Nota:No exemplo acima, a porta 443 não é mostrada porque o servidor não possui um certificado SSL configurado adequadamente.
Nota: Para mais informações sobre o Nmap, você pode ler isto.
Protegendo seu servidor com Iptables:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#Open SSH Port Service
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Onde os novos parâmetros são:
-m significa “correspondência” e é usado para chamar extensões do Iptables como conntrack, que não faz parte das funções principais do iptables.
conntrack = Permite rastrear informações sobre conexões como endereços específicos ou, neste caso, o estado da conexão. Isso deve ser usado com cuidado, pois muitas regras para defender servidores de alguns ataques usam conntrack enquanto o hardware limita seu uso, e tal limitação pode ser usada para sobrecarregar os recursos do servidor.
-ctstate = determina o estado da regra a ser correspondida; os estados possíveis são: NEW, ESTABLISHED, RELATED e INVALID.
to access iptables -A INPUT -p tcp -s X.X.X.X --dport 22 -m conntrack --ctstate NEW,
ESTABLISHED -j ACCEPT
#Protect your SSH Service against brute force attacks by limiting connection attempts
Iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j 22-test
Iptables -A 22-test -m recent --name CONNECTIONS --set --mask 255.255.255.255 --rsource
Iptables -A 22-test -m recent --name CONNECTIONS --rcheck --mask 255.255.255.255
--rsource --seconds 30 --hitcount 3 -j 22-protection
Iptables -A 22-test -j ACCEPT
Iptables -A 22-protection -j DROP
Onde :
No primeiro liNe, nossa regra diz “-m conntrack –ctstate NEW, ” o que significa que se a conexão for nova, passe para a regra “22-test ”.
A segunda linha diz que os pacotes netmask 255.255.255.255 são nomeados como CONNECTIONS.
A terceira linha diz que se CONNECTIONSfor superior a 3 vezes em 30 segundos, o firewall continua aplicando a cadeia 22-protection. A quarta linha diz que se as CONNECTIONS não forem vistas mais de 3 vezes em 30 segundos, elas poderão ser aceitas.
A quinta linha, que pertence à cadeia 22-proteção , diz para descartar CONNECTIONS se elas parecem ser mais de 3 vezes em 30 segundos.
Agora, para terminar, vamos recusar todas as conexões de entrada não permitidas e permitir todo o tráfego de saída:
iptables -P INPUT DROP
P refere-se à política da cadeia; lembre-se de que o alvo é a política ACCEPT, DROP, REJECT. Nesse caso, estamos dizendo que a política padrão para o tráfego de saída é aceitar e a política padrão para o tráfego de entrada é recusar, a menos que especifiquemos algo diferente nas regras anteriores. Este é um firewall muito básico que não inclui regras para muitos ataques, para fins de aprendizado e não para produção; no final do artigo, anexo um firewall que usei para produção em um servidor; tem comentários explicando cada regra.
ENCAMINHAR UMA CONEXÃO PARA UMA PORTA ESPECÍFICA PARA UM ENDEREÇO IP ESPECÍFICO
Isso também é muito útil para usuários de desktop que desejam rotear uma conexão por meio de um dispositivo específico; pode ser útil até mesmo para jogadores; normalmente, fazemos isso nas configurações do roteador, mas vamos supor que o dispositivo de roteamento esteja executando o Iptables.
iptables -A POSTROUTING -t nat -p tcp -j SNAT --to-source X.X.X.X
As regras acima invocam NAT (Network Address Translation) para especificar conexões através do protocolo TCP para o endereço X.X.X.X, e a porta 8080 será redirecionada para o endereço Y.Y.Y.Y, porta 80. A segunda regra especifica que as respostas devem ser enviadas para o endereço de origem (X.X.X.X). Podemos usar essas regras para permitir o acesso a uma câmera IP, habilitar jogos online com redes externas, etc.
Este tutorial foi criado para apresentar o Iptables aos iniciantes e explica apenas um número limitado de fundamentos. Abaixo você pode ver uma amostra de um firewall bem planejado usado para um servidor de produção; inclui algumas das regras que já vimos até regras mais complexas para prevenir DDoS, entre outros tipos de ataques.
Bônus: amostra de firewall de produção
#---- Enable bad error message protection
enable /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
#---- Turn on reverse path filtering. Safer, but breaks asymmetric routing and/or IPSEC
enable /proc/sys/net/ipv4/conf/*/rp_filter
#---- Don't accept source routed packets. Source routing is rarely used for legitimate
purposes disable /proc/sys/net/ipv4/conf/*/accept_source_route
#---- Disable ICMP redirect acceptance which can be used to alter your routing tables
disable /proc/sys/net/ipv4/conf/*/accept_redirects
#---- As we don't accept redirects, don't send Redirect messages either
disable /proc/sys/net/ipv4/conf/*/send_redirects
#---- Ignore packets with impossible addresses
disable /proc/sys/net/ipv4/conf/*/log_martians
#---- Protect against wrapping sequence numbers and aid round trip time measurement
enable /proc/sys/net/ipv4/tcp_timestamps
#---- Help against syn-flood DoS or DDoS attacks using particular choices of initial
TCP sequence numbers enable /proc/sys/net/ipv4/tcp_syncookies
#---- Use Selective ACK which can be used to signify that specific packets are missing
disable /proc/sys/net/ipv4/tcp_sack
modprobe nf_conntrack_ipv4
modprobe nf_nat
# modprobe nf_conntrack_ipv6
# modprobe nf_conntrack_amanda
# modprobe nf_nat_amanda
modprobe nf_conntrack_h323
modprobe nf_nat_h323
modprobe nf_conntrack_ftp
modprobe nf_nat_ftp
# modprobe nf_conntrack_netbios_ns
# modprobe nf_conntrack_irc
# modprobe nf_nat_irc
# modprobe nf_conntrack_proto_dccp
# modprobe nf_nat_proto_dccp
modprobe nf_conntrack_netlink
# modprobe nf_conntrack_pptp
# modprobe nf_nat_pptp
# modprobe nf_conntrack_proto_udplite
# modprobe nf_nat_proto_udplite
# modprobe nf_conntrack_proto_gre
# modprobe nf_nat_proto_gre
# modprobe nf_conntrack_proto_sctp
# modprobe nf_nat_proto_sctp
# modprobe nf_conntrack_sane
modprobe nf_conntrack_sip
modprobe nf_nat_sip
# modprobe nf_conntrack_tftp
# modprobe nf_nat_tftp
# modprobe nf_nat_snmp_basic
#Now we can start adding selected services to our firewall filter. The first such thing
is a localhost interface iptables -A INPUT -i lo -j ACCEPT
#We told the firewall to take all incoming packets with tcp flags NONE and just DROP them.
iptables -A INPUT -p tcp ! -m conntrack --ctstate NEW -j DROP
#We tell iptables to add (-A) a rule to the incoming (INPUT)- SSH works on port 50683
instead 22.
iptables -A INPUT -p tcp -m tcp --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set
--name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4
--rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4
--rttl --name SSH -j DROP
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set
--name SSH
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update
--seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_bru
iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update
--seconds 60 --hitcount 4 --rttl --name SSH -j DROP
#Now I allow imap,and smtp.
-A INPUT -p tcp --dport 25 -j ACCEPT
# Allows pop and pops connections
-A INPUT -p tcp --dport 110 -j ACCEPT
-A INPUT -p tcp --dport 995 -j ACCEPT
############ IMAP & IMAPS ############
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
########### MYSQL ###################
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
########## R1soft CDP System ###############
iptables -A INPUT -p tcp -m tcp -s specific ip --dport 1167 -j ACCEPT
############### outgoing ###################
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
### Allow ongoing, block incoming not defined ###
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -L -n
iptables-save | tee /etc/iptables.test.rules
iptables-restore < /etc/iptables.test.rules
#service iptables restart