Iptables LOG и DROP в одном правиле

Я пытаюсь вывести исходящие соединения с помощью iptables. То, что я хочу, это удаление и прием соединения при их регистрации. Я обнаружил, что опция -j принимает DROP/REJECT/ACCEPT/LOG. Но я хочу сделать что-то вроде DROP и LOG или ACCEPT и LOG. Есть ли способ достичь этого?

Ответы

Ответ 1

Пример:

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

Лог-экзамен:

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

Другие параметры:

   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.

Ответ 2

Хотя уже более года, я несколько раз наткнулся на этот вопрос на другой поиск Google, и я считаю, что могу улучшить предыдущий ответ на благо других.

Короткий ответ: вы не можете комбинировать оба действия в одной строке, но вы можете создать цепочку, которая делает то, что вы хотите, а затем вызвать ее в одном лайнере.

Создайте цепочку для регистрации и принятия:

iptables -N LOG_ACCEPT

И пусть заполняет его правила:

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

Теперь создайте цепочку для регистрации и удаления:

iptables -N LOG_DROP

И пусть заполняет его правила:

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

Теперь вы можете делать все действия за один раз, перепрыгивая (-j) на пользовательские цепочки вместо стандартного LOG/ACCEPT/REJECT/DROP:

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

Ответ 3

nflog лучше

sudo apt-get -y install ulogd2

Пример правила блока 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

И вы можете найти префикс "ICMP Block" в журнале:

/var/log/ulog/syslogemu.log

Ответ 4

На работе мне нужно было регистрировать и блокировать соединения SSLv3 на портах 993 (IMAPS) и 995 (POP3S) с помощью iptables. Итак, я объединил Gert van Dijk Как снять SSLv3 в вашей сети с помощью брандмауэра iptables? (POODLE) с ответом Prevok и придумал следующее:

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&[email protected] 12>>26&[email protected] 0 & 0xFFFFFF00=0x16030000 && \
   0>>22&[email protected] 12>>26&[email protected] 2 & 0xFF=0x01 && \
   0>>22&[email protected] 12>>26&[email protected] 7 & 0xFFFF=0x0300" \
  -j SSLv3

Объяснение

  • В LOG и DROP создайте пользовательскую цепочку (например, SSLv3):

    iptables -N SSLv3
    iptables -A SSLv3 -j LOG --log-prefix "SSLv3 Client Hello detected: "
    iptables -A SSLv3 -j DROP
    
  • Затем перенаправляйте то, что хотите, к LOG и DROP к этой цепочке (см. -j SSLv3):

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

Примечание: соблюдайте порядок правил. Эти правила не работали для меня, пока я не поставил их выше того, что у меня было на моем брандмауэре script:

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

Ответ 5

для фарфора GFW:

sudo iptables -I INPUT -s 173.194.0.0/16 -p tcp --tcp-flags RST RST -j DROP
sudo iptables -I INPUT -s 173.194.0.0/16 -p tcp --tcp-flags RST RST -j LOG --log-prefix "drop rst"

sudo iptables -I INPUT -s 64.233.0.0/16 -p tcp --tcp-flags RST RST -j DROP
sudo iptables -I INPUT -s 64.233.0.0/16 -p tcp --tcp-flags RST RST -j LOG --log-prefix "drop rst"

sudo iptables -I INPUT -s 74.125.0.0/16 -p tcp --tcp-flags RST RST -j DROP
sudo iptables -I INPUT -s 74.125.0.0/16 -p tcp --tcp-flags RST RST -j LOG --log-prefix "drop rst"