解析iptables日志以插入mysql

时间:2016-10-31 02:43:33

标签: bash awk grep iptables

我的路由器通过syslog将“DROP”数据包发送到我的服务器,以下列方式记录到文件中:

  

Oct 30 13:01:02 192.168.1.1内核:DROP IN = vlan2 OUT =   MAC = XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX   SRC = 93.108.197.92 DST = 192.168.2.10 LEN = 60 TOS = 0x00 PREC = 0x00 TTL = 51   ID = 44828 DF PROTO = TCP SPT = 55552 DPT = 33248 WINDOW = 7300 RES = 0x00 SYN   URGP = 0 OPT(020405840402080A0035BAC40000000001030300)

     10月30日13:01:06   192.168.1.1内核:DROP IN = vlan2 OUT = MAC = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx   SRC = 93.108.197.92 DST = 192.168.2.10 LEN = 60 TOS = 0x00 PREC = 0x00 TTL = 51   ID = 44829 DF PROTO = TCP SPT = 55552 DPT = 33248 WINDOW = 7300 RES = 0x00 SYN   URGP = 0 OPT(020405840402080A0035BEAE0000000001030300)

     10月30日13:01:07   192.168.1.1内核:DROP IN = vlan2 OUT = MAC = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx   SRC = 189.175.171.76 DST = 192.168.2.10 LEN = 44 TOS = 0x00 PREC = 0x00 TTL = 53   ID = 260 PROTO = TCP SPT = 14779 DPT = 23 WINDOW = 50523 RES = 0x00 SYN URGP = 0 OPT   (020405AC)

     

Oct 30 13:01:09 192.168.1.1内核:   DROP IN = vlan2 OUT =   MAC = XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX   SRC = 125.211.218.39 DST = 192.168.1.1 LEN = 88 TOS = 0x00 PREC = 0x00 TTL = 48   ID = 39896 DF PROTO = ICMP TYPE = 8 CODE = 0 ID = 29389 SEQ = 1

     

Oct 30 13:01:14 192.168.1.1内核:DROP IN = vlan2 OUT =   MAC = XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX   SRC = 93.108.197.92 DST = 192.168.2.10 LEN = 60 TOS = 0x00 PREC = 0x00 TTL = 51   ID = 44830 DF PROTO = TCP SPT = 55552 DPT = 33248 WINDOW = 7300 RES = 0x00 SYN   URGP = 0 OPT(020405840402080A0035C6800000000001030300)

我想将每个字段放入一个mysql数据库中,以便稍后查看和分析。我正在考虑解析/过滤/执行此操作的最佳方法。我想在bash中这样做,但如果能让它变得更有效或更容易,我会对其他替代品/ langs开放。

我的iptables日志文件经常被轮换,我打算创建一个bash / sed / awk脚本来查看日志的每一行并创建一个sql文件,这样我就可以使用'LOAD DATA INFILE '命令将所有数据加载到一个INSERT语句中。

如上所示,ICMP和TCP类型的数据包与写入文件的方式不同(ID后的字段数)

我有几种不同的方法可以完成此任务:

  1. 按PROTO搜索,剩余的awk'print'命令用于获取所有相关信息。
  2. 在每行中搜索所有[PARAM] = [VALUE],无论PROTO如何,只需将它们推入mysql并稍后进行分析。
  3. 到目前为止,我已经(我知道这是基本的,但我想知道在投入更多时间之前我是否应该以不同的方式处理它):

    cat "$fw_file" | while read line; do
       type=$(grep -oP 'PROTO=\w+\s' | cut -d= -f2)
       df=$(grep -oP 'ID=\w+\sDF\s' | cut -d' ' -f2)
       # continuing on for all fields....
       # ......
    done
    

    如果有更好,更有效的方式让我这样做而不只是抓住所有领域?

1 个答案:

答案 0 :(得分:0)

在开始处理脚本之前(重新发明轮子),对于解析日志和分析日志数据,有opensource个工具可以有效地完成工作。请考虑一下!

对于确切的用例,您最好使用ElasticsearchLogstashKibanaELK Stack)。 ELK Stack与脚本和关系数据库方法相比的一些优点:

  • 更容易存储来自多个来源的日志(一个可以是您的路由器)
  • 可扩展(根据您的日志输入速率,您可能很快就会变慢)
  • 使用kibana
  • 可以非常轻松地使用各种图表在Web界面中显示数据
  • ElasticsearchREST API,所以你的开发人员也可以做自己的事情!

网上有很多教程可以让你快速前进。