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中的urllib2模块
Nov 13 Python
python3处理含有中文的url方法
May 10 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
python3的数据类型及数据类型转换实例详解
Aug 20 Python
Python制作词云图代码实例
Sep 09 Python
python [:3] 实现提取数组中的数
Nov 27 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 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
写一个用户在线显示的程序
2006/10/09 PHP
Windows下的PHP5.0详解
2006/11/18 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python+selenium开发环境搭建图文教程
2017/08/11 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python实现录音小程序
2020/10/26 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
开工庆典邀请函范文
2014/01/16 职场文书
离婚协议书范本样本
2014/08/19 职场文书
优秀护士事迹材料
2014/12/25 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
论文答辩开场白大全
2015/05/27 职场文书
我的1919观后感
2015/06/03 职场文书
党员证明模板
2015/06/19 职场文书
信息简报范文
2015/07/21 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
新学期主题班会
2015/08/17 职场文书
2016入党心得体会范文
2016/01/06 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS