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实现递归遍历文件夹并删除文件
Apr 18 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
使用Python实现跳帧截取视频帧
May 31 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
python开发前景如何
Jun 11 Python
python让函数不返回结果的方法
Jun 22 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
python 实现体质指数BMI计算
May 26 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php用header函数实现301跳转代码实例
2013/11/25 PHP
php通过session防url攻击方法
2014/12/10 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
python通过post提交数据的方法
2015/05/06 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
Python数据可视化之画图
2019/01/15 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
如何利用find命令查找文件
2015/02/07 面试题
业务部主管岗位职责
2014/01/29 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
防灾减灾标语
2014/10/07 职场文书
校运动会广播稿300字
2014/10/07 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
python实现A*寻路算法
2021/06/13 Python
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
浅谈Java父子类加载顺序
2021/08/04 Java/Android