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实现求笛卡尔乘积的方法
Sep 16 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
Django实现组合搜索的方法示例
Jan 23 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
基于python实现学生管理系统
Oct 17 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
Flask框架模板继承实现方法分析
Jul 31 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
django form和field具体方法和属性说明
Jul 09 Python
Python 远程开关机的方法
Nov 18 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php实现中文转数字
2016/02/18 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
Python中return语句用法实例分析
2015/08/04 Python
python3.6实现学生信息管理系统
2019/02/21 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
给排水工程师岗位职责
2013/11/21 职场文书
借款协议书范本
2014/04/22 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
个人租房协议书
2014/11/28 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
实习计划书范文
2015/01/16 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android