用docker+elastic打造属于自己的网络探针

网络探针,就是一个用于捕获、分析网络数据包的组件。目前有一些捕获、分析网络数据包的开源组件,比如Yaf、bro、packetbeat等,但是这些组件的核心在于流量的采集,而流量日志的存储、界面展示则没有。所以我们会希望拥有自己的网络探针,捕获、分析数据包,并以界面的形式展示查询。这篇文章告诉你如何用docker打造你专属的网络探针。

一个完全使用开源组件的解决方案是,使用packetbeat来监听网络流量,而将流量日志存储在elasticsearch中,使用kibana读取elasticsearch中的日志并以日志检索、统计图表等形式提供界面查询。但是在每一个不同的环境上部署网络探针时,都需要重新把所有组件下载一遍配置一遍,实在是很繁琐。那么可不可以利用docker容器技术,将配置好的环境生成镜像,以后在不同的环境,只需要导入这个镜像运行即可?如下图所示:

PacketBeat目前支持的协议类型如下:

  • ICMP (v4 and v6)
  • DNS
  • HTTP
  • AMQP 0.9.1
  • Cassandra
  • Mysql
  • PostgreSQL
  • Redis
  • Thrift-RPC
  • MongoDB
  • Memcache
  • TLS

下面咱们就来尝试一下吧!

1.安装docker

如果是CentOS 7系统,那么安装docker非常简单,只需要一句简单的命令:yum install docker即可。安装完毕后,使用systemctl start docker命令,启动docker daemon进程;并且使用systemctl enable docker命令设置docker为开机启动。

在安装好后,运行docker info命令,即可以确认docker正确安装并运行了:

2.  尝试运行一个CentOS docker容器

其中-i表示保证stdin标准输入是开启的,而-t表示为docker容器分配一个伪tty终端。运行这个命令之后,docker首先会检查本地是否有CentOS镜像,如果没有的话,就会从官方的Docker Hub Registry下载镜像,然后再用该镜像运行一个新容器。

鉴于不可描述的原因,访问国外的docker镜像站点非常的慢,而且有时会拉取镜像不成功。所以一般推荐把镜像切换为国内镜像,命令为:

 

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["http://f2d6cb40.m.daocloud.io"]

}

EOF

systemctl restart docker

鉴于下载的centos镜像为最小包镜像,所以需要手动安装一些必要的软件。如:

yum install wget

yum install net-tools

yum install libpcap

yum install libpcap-devel

yum install sudo

 

3.安装必要的软件

下载需要的安装包,包括JDK1.8,elasticsearch,packetbeat以及kibana。将它们放在一个目录下,如下图所示:

由于elasticsearch不可以用root用户运行。所以我们新建一个名为dell的用户,并赋予它免密码sudo权限。

 

useradd dell

passwd dell

visudo

然后切换到dell用户(su – dell)。

开始安装JDK,将JDK1.8解压到/home/dell目录下,并配置环境变量:

运行java -version命令有版本信息被打印出来,即安装成功。

接着解压缩elasticsearch到/home/dell目录下,并配置elasticsearch.yml文件,配置cluser.name为my_network_probe,network.host为localhost,http.port为9200。

然后解压缩packetbeat到/home/dell目录下,并配置packetbeat.yml文件里需要写入的elasticsearch:

再解压缩kibana到/home/dell目录下,配置/home/dell/kibana/config/kibana.yml文件:

并指定查询的elasticsearch:

最后再在/home/dell目录下新建start.sh文件,负责启动所有组件:

4.将运行的容器生成为镜像

5.  将镜像打包

6.   将镜像导入到另外一台需要使用此镜像的机器上

此时使用docker image查看,是可以看到导入的这个镜像的:

运行此镜像,指定–network=host参数,表示docker容器共享宿主机网络。共享宿主机网络的好处就在于,可以使用packetbeat来监听宿主机上指定网卡的流量。由于共享了网络,所以无需进行端口映射,在docker容器里打开的端口即是在宿主机上打开端口,进入容器看到的主机名也是宿主机的主机名。

进入该容器,修改kibana对应的配置文件里的Ip(就配置为宿主机的IP),方便外部主机访问web界面:

默认packetbeat是配置的监听所有网卡的流量,如果期望只监听特定网卡的流量,则修改/home/dell/packetbeat/packetbeat.yml文件里的packetbeat.interface.device:网卡名即可(以root权限修改)。举个例子,我们这台主机的p2p4网卡是作为镜像流量接入的网卡,所以我们将监听的网卡配置为p2s4:

运行start.sh脚本,启动所有组件:

ctrl+p+q退出容器并保持容器是运行状态。

此时可以看到宿主机上的5601端口已经处于监听状态:

此时访问5601端口,即可以看到对应的kibana界面。在索引发现处填入packetbeat-*:

我们就可以看到写入的数据量:

然后还可以在Discover处查看到流量日志的相关信息:

可以看到packetbeat采集的流量,类型包括flow流之外,还有icmp,dns,tls等,还是比较丰富的:

我们可以在Discover界面上添加过滤器,查询指定sip、dport的流量:

以后在这台主机上直接使用容器id进行启动、停止、连接容器动作即可,非常方便。

7.   使用探针进行数据分析

7.1 查看访问最多的目的IP

7.2 查看某个特定IP在时间范围内的下行流量趋势情况

7.3 DNS请求的域名分布情况

 

 

 

 

Spread the word. Share this post!

Meet The Author

Leave Comment