网络探针,就是一个用于捕获、分析网络数据包的组件。目前有一些捕获、分析网络数据包的开源组件,比如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请求的域名分布情况