目标

  • 众所周知,NAT日志是校园网日志重要的一个部分
  • 由于出口绝大多数高校都是NAT,那么作为日志留存,我们就必须能够记录下具体的端口号、公网IP等。
  • 传统方式如果用纯文本保存nat日志的话,量级会非常大,搜索难度非常之高,使用es来保存则可以很快的进行搜索
  • 结合es的冷、温、热机制,也可以很好地满足定期删除的效果
  • 同时,kibana的可视化效果也很好,适合做数据分析

方式

搭建ELK集群

这个不多说了,后面有空详细写。我们的流程是:H3C防火墙(F5030D/F5010)输出syslog->Logstash->Elasticsearch

防火墙配置部分

H3C的NAT444日志分为中国电信、中国联通、中国移动以及H3C等几种格式。我们以中国电信为例,如下:

es的日志减少存储空间_IP

详细说明可以看:http://www.h3c.com/cn/d_202110/1474391_30005_0.htm

大概的格式如下:

<134> 1 2021 Dec 15 07:33:47 172.1.1.1 F5030_D - NAT444:sessionbasedA [17 172.16.1.1 - 218.2.135.1 47641 38104 -]

观察上面,我们知道:

  • 172.1.1.1是F5030D的接口地址
  • 172.16.1.1:47461是内网IP和端口
  • 218.2.135.1:38104是外网IP和端口

那么,我们首先将日志以syslog形式转发给Logstash

H3C防火墙的配置

  • 首先到系统设置,NAT日志中,选择输出快速日志,这样就可以在快速日志中比较方便的编辑了。
  • 来到基本配置快速日志,新建一个日志,将中国电信日志输出给日志服务器的560端口。
  • 众所周知,syslog的端口是udp514,注一开始我也很头疼如何在一个UDP 514端口上区分多个设备传来的日志?后来才发现,你多起几个端口就是了…这里我们用的就是560端口。
  • 在防火墙上确保到logstash服务器是通的,选择好原地址(一般是防火墙管理口),选择好时区即可

logstash的配置

logstash的安装不多说,也比较简单,配置文件我们注意是inputfilter以及output就可以了,也就是输入、过滤和解析、输出给es。

input部分

input部分如下:

syslog{
        type => "syslog-fw-f5030d-nat"
        host => "172.16.1.1"
        port => 560
    }

这段的意思是,在172.16.1.1也就是logstash服务器上监听560端口,并将这个端口来的syslog标记为syslog-fw-f5030d-nat

filter部分

其实此时日志已经可以进来了,但为了后期方便,我们还需要对他进行处理,将四元组单独作为一个key
如下:

# 出口防火墙的解析,解析nat日志
if [type] == "syslog-fw-f5030d-nat" {
    grok {
        match => {
            "message" => "%{IP:SIP} - %{IP:DIP} %{INT:SPORT} %{INT:DPORT} "
        }
    }
 }

这个其实就是grok语法,我一开始以为很复杂,后来才发现对于nat日志这种,他已经考虑的很齐全了。。。
比如,这段%{IP:SIP} - %{IP:DIP} %{INT:SPORT} %{INT:DPORT}就是在类似<134> 1 2021 Dec 15 07:33:47 172.1.1.1 F5030_D - NAT444:sessionbasedA [17 172.16.1.1 - 218.2.135.1 47641 38104 -]这样的日子中,将第一个IP解析为SIP,将第二个IP解析为DIP,第一个INT解析为DIP,第二个INT解析为SPORT。对于IP的解析,grok已经给出了IP这个特殊代码。

ps,这里其实还是比较偷懒的,等有空再去慢慢研究。

总之最后结果就是

es的日志减少存储空间_f5_02

是不是很赞?

当然,理论上你不做filter也是可以搜索的,但是显然搜索结果很慢,也不方便写搜索语法。

output部分

上面有点跳,你要记得的是logstash的过程是inputfilter,最后是output才能输出给es。

output的代码也比较简单,如下

if [type] == "syslog-fw-f5030d-nat" {
       elasticsearch {
        hosts => ["your-es-ip:9200"]
            user => "elastic"
            password => "your-es-key"
            index => "syslog-fw-f5030d-nat-%{+YYYYMMdd}"
        }
    }

也就是将上述日志syslog-fw-f5030d这个发送给es,并且index名称为syslog-fw-f5030d-nat-日期这样的。

ES部分的配置

此时其实日志已经到了es里面了。但我们还是要做一些简单地操作来优化后续的查询。

  • 首先我们进入kibana的Stack Management,点击索引模式并点击创建索引模式
  • 这里我们可以输入索引模式的名称,例如syslog-fw-f5030d-*,这时候他会去匹配所有的index,因为我们之前index都是按照日期分的,这里直接*就可以匹配所有
  • 此时我们来到kibana的Analytics下的Discover,左侧选择索引模式即可用语法进行搜索了。

至此,大功告成!

总结

当然,还有很多可以完善的地方

  • 首先是负载还不确定,我用校园网试了一下,一天大概在2~3亿条,索引不到50g的样子。这两天再观察一下宿舍cmcc无线的,这个量应该很大,不知道es吃不吃得消?
  • 其次就是这里是有瓶颈的,根据配置文件我们看到,logstash是一个单点,这个挂了日志就没地方发和处理了,我测试的时候看了下,进流量大概20m不到,出反而很大在40m左右。cpu看了下还好,不是太大问题。不知道日志量大的时候会不会丢日志?syslog还是udp协议的,丢了也不知道啊…
  • 以及es是单点。我虽然布了4台es节点,但是logstash只发给了master节点,如果这里出问题也是很麻烦的。

这些问题,准备在下面的es部署部分去完善吧。nat日志作为校园网日志留存很重要的一部分,先存下来,暂时还没想到有什么分析的目的,这个只有ip没有mac,似乎从ac上拿到mac,再去和认证系统匹配的意思更大?但那个用到的一般都是关系数据库了,和日志如何对接,又是一个课题…