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简单网络编程示例【客户端与服务端】
May 26 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
python实现自动化上线脚本的示例
Jul 01 Python
python networkx 根据图的权重画图实现
Jul 10 Python
如何通过python的fabric包完成代码上传部署
Jul 29 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
Python中关于浮点数的冷知识
Sep 22 Python
Python有参函数使用代码实例
Jan 06 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python如何建立全零数组
Jul 19 Python
用Python写一个简易版弹球游戏
Apr 13 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
Python中实现对list做减法操作介绍
2015/01/09 Python
Python pass详细介绍及实例代码
2016/11/24 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
质检部职责
2013/12/28 职场文书
学习十八大报告感言
2014/02/04 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
夏季药店促销方案
2014/08/22 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技