目标
- 众所周知,NAT日志是校园网日志重要的一个部分
- 由于出口绝大多数高校都是NAT,那么作为日志留存,我们就必须能够记录下具体的端口号、公网IP等。
- 传统方式如果用纯文本保存nat日志的话,量级会非常大,搜索难度非常之高,使用es来保存则可以很快的进行搜索
- 结合es的冷、温、热机制,也可以很好地满足定期删除的效果
- 同时,kibana的可视化效果也很好,适合做数据分析
方式
搭建ELK集群
这个不多说了,后面有空详细写。我们的流程是:H3C防火墙(F5030D/F5010)输出syslog->Logstash->Elasticsearch
防火墙配置部分
H3C的NAT444日志分为中国电信、中国联通、中国移动以及H3C等几种格式。我们以中国电信为例,如下:
详细说明可以看: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的安装不多说,也比较简单,配置文件我们注意是input
,filter
以及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,这里其实还是比较偷懒的,等有空再去慢慢研究。
总之最后结果就是
是不是很赞?
当然,理论上你不做filter也是可以搜索的,但是显然搜索结果很慢,也不方便写搜索语法。
output部分
上面有点跳,你要记得的是logstash的过程是input
,filter
,最后是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,再去和认证系统匹配的意思更大?但那个用到的一般都是关系数据库了,和日志如何对接,又是一个课题…