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 基础学习第二弹 类属性和实例属性
Aug 27 Python
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
python实现简易内存监控
Jun 21 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python日志logging模块使用方法分析
May 23 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
tensorflow多维张量计算实例
Feb 11 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
解决echarts中饼图标签重叠的问题
May 16 Python
Python中的xlrd模块使用原理解析
May 21 Python
深入理解Python变量的数据类型和存储
Feb 01 Python
matlab xlabel位置的设置方式
May 21 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
PHP中常用的转义函数
2014/02/28 PHP
php安装swoole扩展的方法
2015/03/19 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
PHP chr()函数讲解
2019/02/11 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
JS实现的视频弹幕效果示例
2018/08/17 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
python下MySQLdb用法实例分析
2015/06/08 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python tornado使用流生成图片的例子
2019/11/18 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Python之字典对象的几种创建方法
2020/09/30 Python
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
2014年关工委工作总结
2014/11/17 职场文书
学校国庆节活动总结
2015/03/23 职场文书