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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python3实现监控新型冠状病毒肺炎疫情的示例代码

    代码如下所示: import requests import json from pyecharts.charts import Map, Geo from pyecharts import options as opts from pyecharts.globals import GeoType, RenderType url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5' datas = json.loads(reque

  • python psutil监控进程实例

    我就废话不多说了,直接上代码吧! import psutil import subprocess import os from os.path import join,getsize import re import time from subprocess import PIPE counter=0 filesize_last=0 def restart_process(): haspro = 0 all_process_name = psutil.pids(); for pid in all

  • Python 实现网课实时监控自动签到、打卡功能

    响应国家停课不停学的号召,学生们都开始了网上授课,但由于课程繁多,消息繁杂,经常错过课堂签到,针对这一难题,博客主作为Python爱好者,完全使用Python语言写了本篇博客,希望能够帮助小伙伴们完成上课签到问题(注:只是帮你签到,而不是叫你代签,我的出发点是帮助记性不是很好的同学签到,防止漏签被老师点名),所以希望大家能理解博主的苦心. 话不多说,献上效果图两张 进入正式教程 ①Python环境 Python3.6及以上版本,需要配备的库requests,json,time 代码运行软件:Py

  • Python实时监控网站浏览记录实现过程详解

    需求: (1) 获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间,并存在一个txt文件中 (2)将这个txt文件发送给指定的邮箱地址(你的邮箱) (3)建立例行任务,每天定时自动完成这些操作,你就可以通过邮件查看你对象每天看啥了 准备 macOS Sierra Python3.6 Chrome 发送邮件的qq邮箱地址 qq邮箱授权码 SMTP服务器地址 : smtp.qq.com 接受邮件的邮箱地址 执行: (1) 首先我们用DB Browser for SQLite来看下

  • python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    python 利用pywifi模块实现连接网络破解wifi密码实时监控网络,具体内容如下: import pywifi from pywifi import * import time def CrackWifi(password): wifi = pywifi.PyWiFi() iface = wifi.interfaces()[0] # 取一个无限网卡 # 是否成功的标志 isok = True if(iface.status()!=const.IFACE_CONNECTED): profi

  • python装饰器实现对异常代码出现进行自动监控的实现方法

    异常,不应该存在,但是我们有时候会遇到这样的情况,比如我们监控服务器的时候,每一秒去采集一次信息,那么有一秒没有采集到我们想要的信息,但是下一秒采集到了, 而后每次的采集都能采集到,就那么一次采集不到,我们应该针对这一次采集不到进行分析吗,这种的情况可以说无法重复出现,我们也无法避免,因为外界的因素太多太多,我们无法去控制这些外面的因素,所以我们会有这样的需求,一段时间内出现频率多少次,我们才能显示一次报警,或者说,一段时间内出现的频率达到我们的异常许可范围我们认为这样的属于异常,我们可以发出报

  • Python脚本实现网卡流量监控

    #/usr/bin/env/python #coding=utf-8 import sys,re,time,os maxdata = 50000 #单位KB memfilename = '/tmp/newnetcardtransdata.txt' netcard = '/proc/net/dev' def checkfile(filename): if os.path.isfile(filename): pass else: f = open(filename, 'w') f.write('0'

  • python监控网卡流量并使用graphite绘图的示例

    复制代码 代码如下: #!/usr/bin/env pythonimport sys,timefrom socket import socketdef read_interface(in_file):    with file(in_file) as f:        return f.readlines()[2:]def set_interface(inter_msg):    dic={}    for i in xrange(len(inter_msg)):        dic[int

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

    目前很多公司业务已经上云,使用了大量的云主机.当前大多数云厂商的云主机公网都是采用的eip,也就是内网和外网使用的同一张网卡,所以流量全部经过的同一个网卡.然而这就面临一个问题,如何将公网和私网的流量分开统计呢?特别是当机器流量异常的时候,如何快速的判断流量是来自公网还是私网.当然云厂商一般也提供了eip的监控,然而很多公司也有一套自己的监控,对于自建监控如何实现,这就值得思考了. 本文将采用python实现云主机的公网和私网流量分开统计,可以将结果输入到自建监控中,当发生业务故障时,可以快速定

  • LINUX下的流量监控shell脚本

    最近比较忙,好久没更新博客了,今天刚好不忙写了一个流量监控脚本.测试在centos下已通过,有需要的朋友可以试试,有BUG或者需要添加其他功能话可以留言哦. 一.脚本源码# vi /etc/rc.d/traffic_monitor.sh---------------------------------------------- 复制代码 代码如下: #!/bin/bashPATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sb

  • Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】

    本文实例讲述了Python实现定制自动化业务流量报表周报功能.分享给大家供大家参考,具体如下: 一 点睛 本次实践通过定制网站5个频道的流量报表周报,通过XlsxWriter 模块将流量数据写入Excel文档,同时自动计算各频道周平均流量,再生成数据图表.具体是通过workbook.add_chart({'type':'column'})方 法指定图表类型为柱形,使用write_row.write_column方法分别以行. 列方式写入数据,使用add_format()方法定制表头.表体的显示风

  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化的方法. 关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据. 1.成品图 这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M.爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图. 可以

  • Python系统监控模块psutil功能与经典用法分析

    本文实例讲述了Python系统监控模块psutil功能与经典用法.分享给大家供大家参考,具体如下: 1.  psutil模块概述 psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控,分析和限制系统资源及进程的管理.它实现了同等命令行工具提供的功能,如ps.top.lsof.netstat.ifconfig.who.df.kill.free.nice.

  • python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警

       使用Windows的wmic命令,获取可执行文件的运行状况.文件路径.PID,如果可执行文件挂掉,就重启并邮件告警. 因为监控的可执行文件的文件名一样,不好区分,所以我使用文件的绝对路径为标准来判断是否正常运行,代码及详细解释如下: # -*- coding: utf-8 -*- import os import win32api import smtplib from email.mime.text import MIMEText def get_pidWay(file_name): e

  • python获取本机外网ip的方法

    本文实例讲述了python获取本机外网ip的方法.分享给大家供大家参考.具体如下: python从显示ip地址的网站获取本机外网ip,这段python代码抓取网站上的ip地址信息 import urllib import re print "we will try to open this url, in order to get IP Address" url = "http://checkip.dyndns.org" print url request = ur

  • Python脚本实现虾米网签到功能

    本文实例讲述了Python脚本实现虾米网签到功能的方法.分享给大家供大家参考,具体如下: 概述 这个脚本完成了自动登录虾米网.签到的功能. 大致要用到urllib.urllib2.cookielib这几个模块.其实就是用python实现向指定的url去post数据. 至于我怎么知道在浏览器里面登录和签到时浏览器都向服务器post了什么数据的问题,可以用强大的chrome:F12->Network里面可以看得到.有的服务器登录成功后会让客户端浏览器跳转或者立即刷新一次页面等等,会把登录时向服务器p

  • 利用python爬取散文网的文章实例教程

    本文主要给大家介绍的是关于python爬取散文网文章的相关内容,分享出来供大家参考学习,下面一起来看看详细的介绍: 效果图如下: 配置python 2.7 bs4 requests 安装 用pip进行安装 sudo pip install bs4 sudo pip install requests 简要说明一下bs4的使用因为是爬取网页 所以就介绍find 跟find_all find跟find_all的不同在于返回的东西不同 find返回的是匹配到的第一个标签及标签里的内容 find_all返

  • 华为3026交换机流量监控配置单

    注明:此交换机为华为3026系列交换机,做流量监控的必须配置要求 <Quidway>display current-configuration  [显示交换机配置信息]# sy sname Quidway#radius scheme system server-type huawei primary authentication 127.0.0.1 1645 primary accounting 127.0.0.1 1646 user-name-format without-domaindom

随机推荐