Python系统公网私网流量监控实现流程

作者:Rainbowhhy 时间:2022-05-16 07:55:39 

目前很多公司业务已经上云,使用了大量的云主机。当前大多数云厂商的云主机公网都是采用的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系统公网私网流量监控实现流程

来源:https://blog.51cto.com/13053917/2550792

标签:Python,公网,私网,流量,监控
0
投稿

猜你喜欢

  • 在子页中隐藏模板页中的div示例代码

    2023-07-23 12:12:28
  • Python GUI自动化实现绕过验证码登录

    2023-06-25 05:18:25
  • python爬虫爬取微博评论案例详解

    2022-12-23 13:31:53
  • Python微服务开发之使用FastAPI构建高效API

    2022-04-20 21:51:13
  • python3.7添加dlib模块的方法

    2023-09-16 03:58:55
  • 各种语言、服务器301跳转代码全集

    2023-07-23 04:24:45
  • python实现自动化办公邮件合并功能

    2022-02-22 21:06:06
  • python实现的正则表达式功能入门教程【经典】

    2023-11-30 05:38:04
  • python实操练习案例(一)

    2022-01-18 12:10:41
  • 对PyQt5的输入对话框使用(QInputDialog)详解

    2021-12-24 19:52:27
  • mysql全文搜索 sql命令的写法

    2024-01-25 04:45:38
  • python实现图片批量剪切示例

    2021-11-18 13:04:38
  • Python使用try except处理程序异常的三种常用方法分析

    2021-12-25 22:51:24
  • docker下mysql 8.0.20 安装配置方法图文教程

    2024-01-19 05:02:39
  • MySQL中CURRENT_TIMESTAMP的使用方式

    2024-01-12 20:10:29
  • python机器学习实战之最近邻kNN分类器

    2021-11-11 14:55:52
  • Python3+selenium实现cookie免密登录的示例代码

    2023-01-31 15:43:09
  • Python yield 的使用浅析

    2022-09-30 13:47:01
  • Python shapefile转GeoJson的2种方式实例

    2023-02-20 01:07:52
  • Python实现Event回调机制的方法

    2021-04-10 12:33:29
  • asp之家 网络编程 m.aspxhome.com