前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过tcpdump采集主机间的流量情况

通过tcpdump采集主机间的流量情况

作者头像
保持热爱奔赴山海
发布2019-09-17 14:34:38
8480
发布2019-09-17 14:34:38
举报
文章被收录于专栏:DevOps数据库相关

由于公司计划要从idc迁移上云,前期准备工作之一就是要先梳理清楚当前主机间的调用关系链。 

关于这块,ODF大会上,古雷大师已经给我们指明了道路(感兴趣的可以找下 it大咖说的视频:运维数据可视化探索) , 他的比较精美但是也更复杂些。

作为一个苦逼dba,不会那些高大上的招式,怎么办?? 

当然不能放弃,借鉴了下他的思路,我整出了个比较lowbi的方法。

我的思路:

1、在每台机器上tcpdump采集500个包,格式化后写入到统一的数据库中

2、在数据库里 select distinct 查询语法, 即可找到某个主机的数据流的关系

## 在一个专用的mysql服务器 10.0.1.10 上创建账号及库:

代码语言:javascript
复制
create database tcpdump;

use tcpdump;
CREATE TABLE `graph` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'pk',
  `src` varchar(100) NOT NULL DEFAULT '1.1.1.1' COMMENT '源地址',
  `dest` varchar(100) NOT NULL DEFAULT '2.2.2.2' COMMENT '目的地址',
  `cap_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5101 DEFAULT CHARSET=utf8 COMMENT='存放抓包采集的数据流向关系';

grant select,update,delete,insert on tcpdump.* to 'tcpdump'@'%' identified by 'tcpdump';

实际运行的脚本 

vim /root/cap/push.sh 

代码语言:javascript
复制
# 没错,下面你即将看到最 low bi的用法,直接获取数据调mysql客户端插入

# 查询语句:
# SELECT DISTINCT SUBSTRING_INDEX(src, '.', 1) AS src,SUBSTRING_INDEX(dest, '.', 1) AS dest FROM tcpdump.graph WHERE src LIKE 'sh1-%' AND dest LIKE 'sh1-%' AND src LIKE 'sh1-XXXXXX%';

source /etc/profile

port=$(ip a | egrep "10.0.*.*/16" | awk '{print $NF}')

FILE1=dump.log
FILE2=data.log
MYSQL_HOST='10.0.1.10'

tcpdump -i ${port} tcp -p -c 1000 -q > ${FILE1}

# 注意,我这环境的主机名都是 sh1-dbxxxx.demo.com ,因此使用下面的命令能提取出关键的主机信息
cat ${FILE1} | cut -d " " -f 3,5 > ${FILE2}

if `uname -r  | egrep  'el7'` ; then
  mysql_version=/root/cap/mysql_el7
else
  mysql_version=/root/cap/mysql_el6
fi

while read line; do
  echo $line | awk '{print "insert into tcpdump.graph (src,dest) values(\""$1"\",\""$2"\");"}' | ${mysql_version} -h ${MYSQL_HOST} -utcpdump -ptcpdump
done < ${FILE2}

在 /root/cap/ 目录下,我还放了2个版本的mysql客户端(文件名 mysql_el6 和 mysql_el7),用来在不同版本的centos上执行写入操作。

部署到远程主机: 

ansible xxxx -m copy -a "src=/root/cap/ dest=/root/cap/ owner=root group=root mode=0755"

我们也可以再ansible推一个定时任务到全部主机去,当然个人建议是迁移到那个服务,我们就单独去对应服务的主机上多跑一段时间脚本采集数据然后做分析,而不是一下子搞个全网采集,那样数据量可能太大。

查询方法: 

代码语言:javascript
复制
select 
   distinct SUBSTRING_INDEX(src,'.',1) as src,
   SUBSTRING_INDEX(dest,'.',1) as dest 
from tcpdump.graph 
   where src like 'sh1-rabbitmq01%' ;
   
结果类似这样:
+----------------+----------------+
| src        | dest        |
+----------------+----------------+
| sh1-rabbitmq01 | sh1-web20    |
| sh1-rabbitmq01 | sh1-web25    |
| sh1-rabbitmq01 | sh1-web19    |
| sh1-rabbitmq01 | sh1-datax01   |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-k8s11    |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-web10    |
| sh1-rabbitmq01 | sh1-storm04   |
| sh1-rabbitmq01 | sh1-web10    |
+----------------+----------------+

有了数据后,我们还可以在 grafana 里面画图,配置大致是这样的:

1、添加mysql数据源

2、画图,使用table类型的图形展示界面,最终效果类似如下:

更进一步,我们还可以绘制动态的板子。这需要添加一个variables,如下:

这样,我们就可以下拉菜单找到对应的主机了,不需要一股脑的翻的手软眼花了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档