62 votes

Conseils et astuces pour iptables

Je suis sûr que les administrateurs système de Linux sont assez familiers avec iptables l'interface utilisateur de l netfilter cadre de filtrage de paquets.

Maintenant, cette "Question" est censée être une Wiki communautaire pour rassembler les différents morceaux de iptables sagesse. Rien n'est trop commun ou trop obscur. Publiez tout ce que vous savez qui pourrait aider d'autres personnes à tirer le maximum de iptables .

0voto

unc0nnected Points 125

Quelque chose que je fais, principalement en raison de mon ignorance d'une solution plus élégante, est de vérifier manuellement mes journaux Nginx toutes les 4 heures et les journaux du serveur de messagerie toutes les 2 minutes pour un accès excessif par des IP individuelles. Je lance quelques scripts ensemble que :

  1. Vérifiez le access.log et de lister les 10 premières adresses IP organisées par le nombre d'accès au serveur.
  2. Transférer les résultats dans un fichier journal
  3. Demandez à un autre script de regarder ce fichier journal et de bannir toute IP qui a frappé le serveur plus de X fois au cours des X dernières heures.
  4. Sauvez mon iptables.save

Voilà à quoi ça ressemble :

autoBanIPs_mail.sh

#!/bin/bash

# This script checks the last 2 minutes of log entries to see if any 
# IP has made over 99 connections

now=$(date +"%m_%d_%Y")

/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
    grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
    awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh

checkBadIPs_mail.sh

Une chose qui est TRÈS importante à noter ici, c'est que vous DEVEZ configurer une liste blanche ou vous allez commencer à bloquer beaucoup d'IP authentiques de serveurs dont vous recevez juste beaucoup d'e-mails ou dans le cas d'autres journaux, des IP qui frappent juste beaucoup votre serveur pour des raisons légitimes. Ma liste blanche est juste construite dans ce script en ajoutant des pipes grep juste après | grep ']] | qui ressemblent à quelque chose comme ceci "grep -v 127.0 |" .
Vous devez prendre le temps d'apprendre à votre serveur quelles IP à fort trafic sont légitimes et lesquelles ne le sont pas. Pour moi, cela signifie que j'ai dû passer la première semaine à vérifier manuellement mes journaux toutes les deux heures, à rechercher les adresses IP à fort trafic sur iplocation.net, puis à ajouter à cette liste blanche celles qui sont légitimes, comme amazon, box.com ou même les plages d'adresses IP de mon domicile/bureau. Si vous ne le faites pas, vous risquez d'être bloqué sur votre propre serveur ou de commencer à bloquer des serveurs de messagerie/web légitimes et de provoquer des interruptions de la messagerie ou du trafic.

cat /var/log/mail.log | awk \
    -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
    awk '{print $1}' | sort | uniq -c | sort -n | tail -10

BlockIP

#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

Encore une fois, je sais que c'est très rudimentaire et qu'il existe probablement un protocole efficace et propre qui fait tout cela, mais je ne le connaissais pas et cela dure depuis un an ou deux maintenant et garde les méchants à distance. La seule chose que je recommande SERIEUSEMENT est d'avoir un proxy ou un autre serveur dans les coulisses que vous pouvez utiliser pour accéder à votre serveur principal. La raison en est que si vous êtes en train de faire du développement web un jour et que vous vous envoyez 2000 ping en 5 heures pour des tests, vous pourriez être bloqué et n'avoir aucun moyen de revenir en arrière, sauf avec un proxy.

Vous pouvez voir cela dans checkBadIPs.sh J'ai mis grep -v 127.0 et dans mes fichiers actuels, j'ai une tonne de règles d'ignorance pour mes propres IP et d'autres plages d'IP de confiance, mais parfois votre IP change, vous oubliez de mettre à jour et vous êtes bloqué sur votre propre serveur.

Enfin, j'espère que ça vous aidera.

UPDATE

J'ai un peu modifié les choses et maintenant, au lieu de vérifier toutes les deux heures, je vérifie certains journaux toutes les deux minutes, principalement mon journal d'authentification ssh et le journal de messagerie, car ils étaient surchargés :(.

Je configure des scripts spécifiques pour chaque fichier journal bien que ce serait assez facile à partir du scripts manuel que j'utilise moi-même lorsque je veux inspecter les journaux. Cela ressemble à ceci :

#!/bin/bash

log=$1 time=$2

cat /var/log/${log} | awk \
    -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
    sort | uniq -c | sort -n | tail -10

Cette fonction nécessite deux entrées au moment de son exécution : le fichier journal que vous souhaitez analyser et la date à laquelle vous souhaitez remonter dans le passé.

Donc, si je voulais vérifier le fichier mail.log pour le nombre d'ip, disons 75 minutes dans le passé, je le ferais :

$ sudo script.sh mail.log 75

0voto

MR.X Points 1

Je suis d'accord avec les commentaires sur les ipsets et les drapeaux tcp, mais il manque encore beaucoup de choses :

Utiliser xtables-addons geoip match au lieu d'ipsets pour les listes de pays. Mettez à jour les données geoip régulièrement (au moins une fois par mois). Les données sont plus dynamiques qu'une liste d'ipsets "fire-and-forget".

Considérer le suivi de l'état de la connexion avec les drapeaux tcp. Par exemple, un RST ou ACK tcp n'a de sens que pour une connexion établie. SYN n'a de sens que pour les nouvelles connexions et les connexions connexes. Un SYN pour une connexion établie signifie soit que votre SYN+ACK a été perdu, soit qu'il s'agit d'une tentative de piratage et qu'il doit être réinitialisé car les deux parties de la connexion ne sont pas d'accord sur l'état.

Bien qu'aucune, SYN+RST et FIN+RST soient des combinaisons illégales, SYN+FIN est maintenant valide sous TCP fast-open (TCP option 34), surtout pour le DNS. Les paquets SYN, même avec fast-open, ne doivent pas être fragmentés. Je ne considère pas les règles avec les drapeaux PSH et URG comme utiles. Ne confondez pas l'état de suivi de connexion avec l'état TCP : Une réponse RST à un paquet SYN est établie à des fins de suivi.

SYNPROXY est pour les paquets transférés et n'ajoute rien pour les paquets délivrés localement au-delà du support de syncookie.

Les paquets d'erreur ICMP seront toujours dans l'état "related" et de longueur 48:576 s'ils sont valides. Longueur 84:1280 pour IPv6. Tous les autres doivent être ignorés. Comme leur taille maximale est également le MTU minimal, ils ne doivent jamais être fragmentés. Les requêtes ICMP (pings, timestamps, etc.) seront toujours nouvelles, et les réponses établies. Abandonnez les paquets ICMP dans les autres états.

Comme dans l'exemple de SSH avec une liste récente et en n'acceptant que les paquets SYN suivants, la même chose devrait être faite pour SMTP, et est similaire à une "liste grise" sur la seule donnée de l'adresse IP.

Dans la table de filtrage, la première (ou la deuxième, si elle accepte d'abord les paquets d'état établis) règle des chaînes d'entrée et de sortie doit accepter tout ce qui se trouve sur l'interface de bouclage. Vous devriez faire confiance à vos propres paquets internes. Si ce n'est pas le cas, vous avez des problèmes plus importants qu'une solution de pare-feu.

Enfin, ne copiez pas aveuglément les règles, sauf si vous comprenez vraiment ce qu'elles font. C'est ce que font tant de listes de règles similaires, et la plupart du temps, le résultat est risible.

-2voto

Blixxstopher Points 1
#!/bin/bash
# The following iptables/ip6tables configurations have
# been kindly shared with us from ArckWiki. There are
# a few additions apart from what has been defined.
#
#=================Flush current definitions==============
    iptables -F
    ip6tables -F
    iptables -X
    ip6tables -X

#
#=================Chains=================================
#
#----Define chains for opened ports
    iptables -N TCP
    ip6tables -N TCP
    iptables -N UDP
    ip6tables -N UDP

#
#----Setting up the filter table for NAT
#   iptables -N fw-interfaces
#   ip6tables -N fw-interfaces
#   iptables -N fw-open
#   ip6tables -N fw-open

#
#================Default Chain reactions=================
#
#----Default FORWARD reaction
    iptables -P FORWARD DROP
    ip6tables -P FORWARD DROP

#
#----Default OUTPUT reaction
    iptables -P OUTPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT

#
#----Shellshock
    iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
    ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

#
#----Default INPUT reaction
    iptables -P INPUT DROP
    ip6tables -P INPUT DROP
#
#----Drop spoofing packets
    iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan1 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -s 10.0.0.0/8 -j DROP
    iptables -A INPUT -s 169.254.0.0/16 -j DROP
    iptables -A INPUT -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -s 224.0.0.0/4 -j DROP
    iptables -A INPUT -d 224.0.0.0/4 -j DROP
    iptables -A INPUT -s 240.0.0.0/5 -j DROP
    iptables -A INPUT -d 240.0.0.0/5 -j DROP
    iptables -A INPUT -s 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 239.255.255.0/24 -j DROP
    iptables -A INPUT -d 255.255.255.255 -j DROP

#
#================Ping rate limiting globally=============
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/min --limit-burst 8 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 --match limit --limit-burst 8 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 -j DROP

#
#----flooding RST packets, smurf attack Rejection
    iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Bogus packet DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

#
#================RELATED,ESTABLISHED reaction============
    iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#
#================unfetered loopback======================
    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

#
#================INVALID catagory of packets=============
    iptables -A INPUT -p 41 -j ACCEPT
    iptables -A INPUT --match conntrack --ctstate INVALID -j DROP
    ip6tables -A INPUT --match conntrack --ctstate INVALID -j DROP

#
#================IPv6 reactions and definitions==========
    ip6tables -A INPUT -s fe80::/10 -p icmpv6 -j ACCEPT
    ip6tables -t raw -A PREROUTING -p icmpv6 -s fe80::/10 -j ACCEPT
    ip6tables -t raw -A PREROUTING --match rpfilter -j ACCEPT
    ip6tables -t raw -A PREROUTING -j DROP
#
#=======Acceptable INVALIDs and a curteous response======
    iptables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    ip6tables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    iptables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP

#
#================Defining the TCP and UDP chains
#
#########################################################
#            Notes for port open definitions            #
# It is important to note that this should be config-   #
# ured differently if you're providing any routing      #
# activity for any purpose. it is up to you to actively #
# define what suites your needs to get the job done.    #
# In this example, I'm exempting IPv6 from being able   #
# to interact with SSH protocols for two reasons. The   #
# first is because it is generally easier and more com- #
# for internal networks to be deployed with IPv4. The   #
# second reason is, IPv6 can be deployed globally.      #
#########################################################
#
#----SSH configured for eth0
    iptables -A TCP -i eth0 -p tcp --dport ssh -j ACCEPT

#!---Blocking SSH interactions in IPv6
    ip6tables -A TCP -p tcp --dport ssh -j DROP

#!---Leave commented for end service device
#   iptables -A TCP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 80 -j ACCEPT
#   iptables -A TCP -p tcp --dport 443 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 443 -j ACCEPT
#
#!---Uncomment for remote service to this device
#   iptables -A TCP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 22 -j ACCEPT
#
#!---Uncomment if you're providing routing services
#   iptables -A UDP -p udp 53 -j ACCEPT
#   ip6tables -A UDP -p udp 53 -j ACCEPT
#
#=================Tricking port scanners=================
#
#----SYN scans
    iptables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    ip6tables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    iptables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP
    ip6tables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP

#
#----UDP scans
    iptables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    ip6tables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    iptables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP
    ip6tables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP

#
#----For SMURF attack protection
    iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
    iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
    iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Ending all other undefined connections
    iptables -A INPUT -j DROP
    ip6tables -A INPUT -j DROP

#
#=======Defining the IN_SSH chain for bruteforce of SSH==
#
#!---I've elected to keep IPv6 out of this realm for
#!---ease of use
    iptables -N IN_SSH
    iptables -A INPUT -p tcp --dport ssh --match conntrack --ctstate NEW -j IN_SSH
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --set -j ACCEPT
    iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH

#
#==================Setting up a NAT gateway==============
#
#########################################################
#                                                       #
# I commented this half out because it's not something  #
# that will apply to all setups. Make note of all par-  #
# tinate interfaces and what exactly is going on.       #
#                                                       #
#########################################################
#
#----Setting up the FORWARD chain
#   iptables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#   ip6tables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#
#
#----Defining the fw-interfaces/open chains for FORWARD
#   iptables -A FORWARD -j fw-interfaces
#   ip6tables -A FORWARD -j fw-interfaces
#   iptables -A FORWARD -j fw-open
#   ip6tables -A FORWARD -j fw-open
#   iptables -A FORWARD -j DROP # Should be REJECT. But, fuck them
#   ip6tables -A FORWARD -j DROP
#   iptables -P FORWARD DROP
#   ip6tables -P FORWARD DROP
#
#
#----Setting up the nat table
#   iptables -A fw-interfaces -i ### -j ACCEPT
#   ip6tables -A fw-interfaces -i ### -j ACCEPT
#   iptables -t nat -A POSTROUTING -s w.x.y.z/S -o ppp0 -j MASQUERADE
#   ip6tables -t nat -A POSTROUTING -s fe::/10 -o ppp0 -j MASQUERADE
#----The above lines should be repeated specifically for EACH interface
#
#----Setting up the PREROUTING chain
#
#######################################################
#                             #
# The PREROUTING chain will redirect either port      #
# targets to be redirected. This can also redirect    #
# traffic inbound to your network from the gateway    #
# to this machine. This can be useful if you're using #
# a honeypot or have any service within your network  #
# that you want to be pointed to a specific device.   #
#                             #
#######################################################
#
#----SSH honeypot server
#   iptables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#----With intuition, you can configure the above to also direct specific
#----requests to other devices providing those services. The bellow will
#----be for a squid server
#   iptables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#   ip6tables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#
#===============Declare configurations=================
    iptables -nvL
    ip6tables -nvL

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X