【问题标题】:Parsing iptables log to insert into mysql解析iptables日志以插入mysql
【发布时间】:2017-03-13 04:00:41
【问题描述】:

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

10 月 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 窗口=7300 RES=0x00 SYN URGP=0 选择 (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 窗口=7300 RES=0x00 SYN URGP=0 选择 (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)

10 月 30 日 13:01:09 192.168.1.1 内核: 下拉=vlan2 输出= 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

10 月 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 窗口=7300 RES=0x00 SYN URGP=0 选择 (020405840402080A0035C6800000000001030300)

我想将每个字段放入一个 mysql 数据库中,以便稍后查看和分析。我正在尝试考虑解析/过滤/执行此操作的最佳方法。我想用 bash 来做,但如果它能让它更高效或更容易,我愿意接受其他替代方案/语言。

我的 iptables 日志文件经常轮换,我将创建一个 bash/sed/awk 脚本来查看日志的每一行并创建一个 sql 文件,以便我可以使用“加载数据输入文件” ' 命令将所有数据加载到一个 INSERT 语句中。

正如您在上面看到的,ICMP 和 TCP 类型的数据包将与写入文件的方式不同(ID 后面的字段数)

我有几种不同的方法来完成这个:

  1. 按 PROTO 搜索,其余的 awk 'print' 命令用于获取所有相关信息。
  2. 在每一行中搜索所有 [PARAM]=[VALUE],而不考虑 PROTO,然后将它们推入 mysql 并稍后分析。

到目前为止(我知道这是基本的,但我想知道在投入更多时间之前是否应该以不同的方式处理它):

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

如果我有更好、更有效的方法来做到这一点,而不是仅仅抓住所有领域?

【问题讨论】:

  • shell 只是一个调用工具的环境。要将文本从一种格式转换为另一种格式,您应该改用 awk。请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解一些(但不是全部)不继续您开始的内容的原因,并阅读 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,以便学习正确的方法。使用编辑器 {} 按钮修复您的输入格式,并添加给定输入的预期输出。
  • 这并没有真正回答我的问题。您说我应该使用 awk 并阅读有关 awk 的书。您认为 awk 是进行这种数据过滤的最佳、最有效的方法吗?你认为我应该使用 python 而不是一般的 bash 或 shell 吗?
  • 没错,问题的答案作为答案发布。我提供的其他信息作为评论发布。知道你想做什么,因为你还没有完成我上周在评论中建议的事情 (Fix your input format using the editors {} button and add the expected output given that input.) 所以我当然不知道最好的方法,但总的来说 awk 是迄今为止你最好的选择用于 UNIX 中的通用文本操作。

标签: bash awk grep iptables


【解决方案1】:

在您开始编写脚本(重新发明轮子)之前,为了解析日志和分析日志数据,opensource 工具可以有效地完成这项工作。请考虑他们!

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

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

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

【讨论】:

  • 感谢您对已经制作的工具的回答 - 我就是这样。这些包希望安装 java,因为它们是用 java 编写的。我觉得java很臃肿,除了ELK包你有没有其他防火墙分析工具的经验?
  • 最好的日志传送、存储、搜索和可视化的开源工具是 ELK,虽然也有一些商业竞争对手,比如 splunk。在资源使用情况下,Java 是相当可调的,并且取决于您要存储和分析多少个源的日志大小。您可以立即使用官方 docker 映像启动并运行 elk 堆栈。试试吧,你会被它的力量所震撼。
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多