Python系统公网私网流量监控实现流程


Posted in Python onNovember 23, 2020

目前很多公司业务已经上云,使用了大量的云主机。当前大多数云厂商的云主机公网都是采用的eip,也就是内网和外网使用的同一张网卡,所以流量全部经过的同一个网卡。然而这就面临一个问题,如何将公网和私网的流量分开统计呢?特别是当机器流量异常的时候,如何快速的判断流量是来自公网还是私网。当然云厂商一般也提供了eip的监控,然而很多公司也有一套自己的监控,对于自建监控如何实现,这就值得思考了。

本文将采用python实现云主机的公网和私网流量分开统计,可以将结果输入到自建监控中,当发生业务故障时,可以快速定位问题。

1. iftop

iftop是linux系统下面一个监控主机与外部通信的工具,它可以实时监控本机与外部机器的流量大小,需要自行下载安装包编译安装。iftop类似与linux系统自带的top命令,在屏幕终端动态输出监控结果。同时,iftop支持很多参数可选项,其中-t 参数使用不带ncurses的文本界面,可以实现将结果保存到文件。

2. os.popen函数

os是python的系统模块,os.popen可以调用系统的shell命令,相当于直接在shell终端执行shell命令。

3. 实现思路

使用python的os.open来调用iftop命令获取到和主机通信的所有ip的流量大小。然后分别分析公网和私网的流量,将各自的流量之和统计起来,从而实现分别监控系统的公网和私网流量。

4. 代码实现

# -*- coding:utf-8 -*-
"""
@Author: Rainbowhhy
@Date: 2020-11-14 15:16:18
"""

import os, re

def is_public_ip(ip):
  # 判断ip是公网还是私网
  private = re.findall(
    r'^((192\.168)|(198\.18)|(198\.19)|(10\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d))|(172\.(1[6-9]|2[0-9]|3[0-1])))\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$',
    ip)
  if private:
    return 0
  else:
    return 1

def convert_unit(unit):
  # 统一转换成bit后计算
  if "Gb" in unit:
    flow = float(unit.strip("Gb")) * 1024 * 1024 * 1024
  elif "Mb" in unit:
    flow = float(unit.strip("Mb")) * 1024 * 1024
  elif "Kb" in unit:
    flow = float(unit.strip("Kb")) * 1024
  else:
    flow = float(unit.strip("b"))
  return flow

def get_traffic():
  # 调用iftop命名获取公网和私网流量
  iftop_info = os.popen("iftop -t -N -n -s 4 2>/dev/null | grep -A 1 -E '^  [0-9]'").read()
  iftop_list = iftop_info.split("\n")
  count = len(iftop_list) - 1
  public_traffic_send = 0
  public_traffic_recv = 0
  private_traffic_send = 0
  private_traffic_recv = 0
  public_ips = []
  private_ips = []
  for i in range(int(count / 2)):
    # 获取出向流量信息
    traffic_send = iftop_list[i * 2]
    traffic_send_lists = traffic_send.split(" ")
    while "" in traffic_send_lists:
      traffic_send_lists.remove("")
    traffic_send = traffic_send_lists[3]
    traffic_send_float = convert_unit(traffic_send)

    # 获取入向流量信息
    traffic_recv = iftop_list[i * 2 + 1]
    traffic_recv_lists = traffic_recv.split(" ")
    while "" in traffic_recv_lists:
      traffic_recv_lists.remove("")
    ip = traffic_recv_lists[0]
    traffic_recv = traffic_recv_lists[2]
    traffic_recv_float = convert_unit(traffic_recv)

    # 计算公网和私网的总流量
    if is_public_ip(ip):
      public_ips.append(ip)
      public_traffic_send += traffic_send_float
      public_traffic_recv += traffic_recv_float

    else:
      private_ips.append(ip)
      private_traffic_send += traffic_send_float
      private_traffic_recv += traffic_recv_float
  return public_traffic_send, public_traffic_recv, private_traffic_send, private_traffic_recv

if __name__ == '__main__':
  public_traffic_send, public_traffic_recv, private_traffic_send, private_traffic_recv = get_traffic()
  print("公网入向:%s" % public_traffic_recv)
  print("公网出向:%s" % public_traffic_send)
  print("私网入向:%s" % private_traffic_recv)
  print("私网出向:%s" % private_traffic_send)

5. 输出结果截图

如下图是输出结果展示

file:///home/rainbowhhy/%E6%A1%8C%E9%9D%A2/monitor.png

Python系统公网私网流量监控实现流程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取当前时间的方法
Jan 14 Python
python实现查询苹果手机维修进度
Mar 16 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Python OpenCV获取视频的方法
Feb 28 Python
python 定时修改数据库的示例代码
Apr 08 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
Django Rest framework之权限的实现示例
Dec 17 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
Python初识逻辑与if语句及用法大全
Aug 07 Python
python基础之错误和异常处理
Oct 24 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 #Python
10个示例带你掌握python中的元组
Nov 23 #Python
详解anaconda安装步骤
Nov 23 #Python
Python可以用来做什么
Nov 23 #Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 #Python
python里反向传播算法详解
Nov 22 #Python
python动态规划算法实例详解
Nov 22 #Python
You might like
PHP自定义函数收代码
2010/08/01 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python中的列表知识点汇总
2015/04/14 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
基于python实现高速视频传输程序
2019/05/05 Python
python 实现兔子生兔子示例
2019/11/21 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
自我鉴定的范文
2013/10/03 职场文书
岗位职责的含义
2013/11/17 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers