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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
python解析xml文件实例分析
May 27 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
python3 实现调用串口功能
Dec 26 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
python爬虫请求头设置代码
Jul 28 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 Python
Python descriptor(描述符)的实现
Nov 15 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
php 表单验证实现代码
2009/03/10 PHP
php不写闭合标签的好处
2014/03/04 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
Angular2整合其他插件的方法
2018/01/20 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
python中sets模块的用法实例
2014/09/30 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
transform python环境快速配置方法
2018/09/27 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
2014年团工作总结
2014/11/27 职场文书
学子宴致辞大全
2015/07/27 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle
详解PyTorch模型保存与加载
2022/04/28 Python