【问题标题】:iptables LOG and DROP in one ruleiptables LOG 和 DROP 在一条规则中
【发布时间】:2014-03-13 08:39:56
【问题描述】:

我正在尝试使用 iptables 记录传出连接。我想要的是,在记录它们的同时丢弃并接受连接。我发现 -j 选项需要 DROP/REJECT/ACCEPT/LOG。但我想做一些类似 DROP 和 LOG 或 ACCEPT 和 LOG 的事情。有没有办法做到这一点?

【问题讨论】:

标签: linux security iptables


【解决方案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.

【讨论】:

  • 这没有回答问题
  • 这没有回答问题,@Prevok 提到的自定义链是要走的路。
  • 一个小提示:在前缀 --log-prefix "INPUT:DROP " 中添加一个空格作为最后一个字符,您会得到一个日志条目,其中您的前缀不会与行的其余部分混淆。
【解决方案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

【讨论】:

  • 我到目前为止还没有 iptables-guru,但猜想 LOG_ACCEPT-chain 的日志前缀应该是 "INPUT:ACCEPT:" 而不是 "INPUT:DROP:" 才有意义还是我误解了?请澄清...
  • 你是对的,它应该是 INPUT:ACCEPT 前缀才有意义,我更正了它。从技术上讲,它可以是任何东西,它只是一个字符串,但将 drop 附加到 accept 和 drop 并没有多大意义。
  • iptables -A -j LOG_ACCEPTiptables -A -j LOG_DROP 不适合我。 INPUT 从这些中丢失了吗?
  • @RichardCook 我更新了最终代码块以增加清晰度。这是不完整的伪代码。
【解决方案3】:

中国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"

【讨论】:

  • 完全错过了问题
【解决方案4】:

nflog 更好

sudo apt-get -y install ulogd2

ICMP Block 规则示例:

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

【讨论】:

    【解决方案5】:

    在工作中,我需要使用 iptables 记录和阻止端口 993 (IMAPS) 和 995 (POP3S) 上的 SSLv3 连接。因此,我将 Gert van Dijk 的 How to take down SSLv3 in your network using iptables firewall? (POODLE) 与 Prevok 的 answer 结合起来,得出了这个结论:

    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
    

    说明

    1. LOGDROP,创建一个自定义链(例如SSLv3):

      iptables -N SSLv3
      iptables -A SSLv3 -j LOG --log-prefix "SSLv3 Client Hello detected: "
      iptables -A SSLv3 -j DROP
      
    2. 然后,将您想要的LOGDROP 重定向到该链(请参阅-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
      

    注意:注意规则的顺序。这些规则对我不起作用,直到我把它们放在防火墙脚本上的这个上面:

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

    【讨论】:

    • 为什么 -m state --state 而不是 -m conntrack --ctstate?
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2012-08-31
    • 2013-05-06
    相关资源
    最近更新 更多