web-dev-qa-db-fra.com

iptables LOG et DROP dans une règle

J'essaie de me connecter aux connexions sortantes avec iptables. Ce que je veux, c'est abandonner et accepter la connexion tout en les enregistrant également. J'ai trouvé que l'option -j prend DROP/REJECT/ACCEPT/LOG. Mais je veux faire quelque chose comme DROP and LOG ou ACCEPT and LOG. Existe-t-il un moyen d'y parvenir?

24
Abhay PS

Exemple:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP

Journal Exampe:

Feb 19 14:18:06 servername kernel: INPUT:DROP:IN=eth1 OUT= MAC=aa:bb:cc:dd:ee:ff:11:22:33:44:55:66:77:88 SRC=x.x.x.x DST=x.x.x.x LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=x PROTO=TCP SPT=x DPT=x WINDOW=x RES=0x00 SYN URGP=0

Autres options:

   LOG
       Turn on kernel logging of matching packets.  When this option 
       is set for a rule, the Linux kernel will print some 
       information  on  all  matching  packets
       (like most IP header fields) via the kernel log (where it can 
       be read with dmesg or syslogd(8)).  This is a "non-terminating 
       target", i.e. rule traversal
       continues at the next rule.  So if you want to LOG the packets 
       you refuse, use two separate rules with the same matching 
       criteria, first using target LOG
       then DROP (or REJECT).

       --log-level level
              Level of logging (numeric or see syslog.conf(5)).

       --log-prefix prefix
              Prefix log messages with the specified prefix; up to 29 
              letters long, and useful for distinguishing messages in 
              the logs.

       --log-tcp-sequence
              Log TCP sequence numbers. This is a security risk if the 
              log is readable by users.

       --log-tcp-options
              Log options from the TCP packet header.

       --log-ip-options
              Log options from the IP packet header.

       --log-uid
              Log the userid of the process which generated the packet.
19
pOchi

Bien que déjà âgé de plus d'un an, je suis tombé sur cette question plusieurs fois sur d'autres recherches Google et je pense que je peux améliorer la réponse précédente pour le bien des autres.

La réponse courte est que vous ne pouvez pas combiner les deux actions sur une seule ligne, mais vous pouvez créer une chaîne qui fait ce que vous voulez, puis l'appeler dans une seule ligne.

Créons une chaîne pour se connecter et accepter:

iptables -N LOG_ACCEPT

Et remplissons ses règles:

iptables -A LOG_ACCEPT -j LOG --log-prefix "INPUT:ACCEPT:" --log-level 6
iptables -A LOG_ACCEPT -j ACCEPT

Créons maintenant une chaîne à enregistrer et à supprimer:

iptables -N LOG_DROP

Et remplissons ses règles:

iptables -A LOG_DROP -j LOG --log-prefix "INPUT:DROP: " --log-level 6
iptables -A LOG_DROP -j DROP

Maintenant, vous pouvez effectuer toutes les actions en une seule fois en sautant (-j) vers vos chaînes personnalisées au lieu du LOG ​​/ ACCEPT/REJECT/DROP par défaut:

iptables -A <your_chain_here> <your_conditions_here> -j LOG_ACCEPT
iptables -A <your_chain_here> <your_conditions_here> -j LOG_DROP
53
Prevok

nflog c'est mieux

Sudo apt-get -y install ulogd2

Exemple de règle de blocage ICMP:

iptables=/sbin/iptables
# Drop ICMP (PING)
$iptables -t mangle -A PREROUTING -p icmp -j NFLOG --nflog-prefix 'ICMP Block'
$iptables -t mangle -A PREROUTING -p icmp -j DROP

Et vous pouvez rechercher le préfixe "Bloc ICMP" dans le journal:

/var/log/ulog/syslogemu.log
2
user4839775

Au travail, je devais enregistrer et bloquer les connexions SSLv3 sur les ports 993 (IMAPS) et 995 (POP3S) à l'aide d'iptables. J'ai donc combiné Comment supprimer SSLv3 de votre réseau à l'aide du pare-feu iptables de Gert van Dijk? (POODLE) avec Prevok's réponse et est venu avec ceci:

iptables -N SSLv3
iptables -A SSLv3 -j LOG --log-prefix "SSLv3 Client Hello detected: "
iptables -A SSLv3 -j DROP
iptables -A INPUT \
  -p tcp \! -f -m multiport --dports 993,995 \
  -m state --state ESTABLISHED -m u32 --u32 \
  "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFFFFFF00=0x16030000 && \
   0>>22&0x3C@ 12>>26&0x3C@ 2 & 0xFF=0x01 && \
   0>>22&0x3C@ 12>>26&0x3C@ 7 & 0xFFFF=0x0300" \
  -j SSLv3

Explication

  1. Pour LOG et DROP, créez une chaîne personnalisée (par exemple SSLv3):

    iptables -N SSLv3
    iptables -A SSLv3 -j LOG --log-prefix "SSLv3 Client Hello detected: "
    iptables -A SSLv3 -j DROP
    
  2. Ensuite, redirigez ce que vous voulez LOG et DROP vers cette chaîne (voir -j SSLv3):

    iptables -A INPUT \
      -p tcp \! -f -m multiport --dports 993,995 \
      -m state --state ESTABLISHED -m u32 --u32 \
      "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFFFFFF00=0x16030000 && \
       0>>22&0x3C@ 12>>26&0x3C@ 2 & 0xFF=0x01 && \
       0>>22&0x3C@ 12>>26&0x3C@ 7 & 0xFFFF=0x0300" \
      -j SSLv3
    

Remarque: attention à l'ordre des règles. Ces règles n'ont pas fonctionné pour moi jusqu'à ce que je les place au-dessus de celle que j'avais sur mon script de pare-feu:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT