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命令行交互提示符的方法
Jan 14 Python
python matplotlib画图实例代码分享
Dec 27 Python
用python实现对比两张图片的不同
Feb 05 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 Python
如何用Python搭建gRPC服务
Jun 30 Python
Python学习之os包使用教程详解
Mar 21 Python
python区块链实现简版工作量证明
May 25 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
使用php4加速网络传输
2006/10/09 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
python 数据的清理行为实例详解
2017/07/12 Python
pandas 将索引值相加的方法
2018/11/15 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
房地产管理毕业生自荐信
2013/11/04 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
我的梦想演讲稿
2014/04/30 职场文书
十佳护士先进事迹
2014/05/08 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
高中英语教学反思范文
2016/03/02 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL