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编程时利用wxPython来支持多线程的方法
Apr 07 Python
python动态网页批量爬取
Feb 14 Python
简单学习Python time模块
Apr 29 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python编写一个闹钟功能
Jul 11 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
pytorch 如何使用amp进行混合精度训练
May 24 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
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
java script编程起步(第三课)
2007/01/10 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python将图片转换为字符画的方法
2020/06/16 Python
分析经典Python开发工程师面试题
2019/04/08 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
店长助理岗位职责
2013/12/13 职场文书
函授自我鉴定范文
2014/02/06 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
黄金酒广告词
2014/03/21 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
初三化学教学反思
2016/02/22 职场文书