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 17 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
python目录与文件名操作例子
Aug 28 Python
分享几道你可能遇到的python面试题
Jul 24 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python单链表原理与实现方法详解
Feb 22 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
Python中Qslider控件实操详解
Feb 20 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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缓存技术的使用说明
2011/08/06 PHP
ini_set的用法介绍
2014/01/07 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
python链接Oracle数据库的方法
2015/06/28 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
外国人聘用意向书
2014/04/01 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
2015年环卫工作总结
2015/04/28 职场文书