Python系統(tǒng)公網(wǎng)私網(wǎng)流量監(jiān)控實現(xiàn)流程
目前很多公司業(yè)務(wù)已經(jīng)上云,使用了大量的云主機(jī)。當(dāng)前大多數(shù)云廠商的云主機(jī)公網(wǎng)都是采用的eip,也就是內(nèi)網(wǎng)和外網(wǎng)使用的同一張網(wǎng)卡,所以流量全部經(jīng)過的同一個網(wǎng)卡。然而這就面臨一個問題,如何將公網(wǎng)和私網(wǎng)的流量分開統(tǒng)計呢?特別是當(dāng)機(jī)器流量異常的時候,如何快速的判斷流量是來自公網(wǎng)還是私網(wǎng)。當(dāng)然云廠商一般也提供了eip的監(jiān)控,然而很多公司也有一套自己的監(jiān)控,對于自建監(jiān)控如何實現(xiàn),這就值得思考了。
本文將采用python實現(xiàn)云主機(jī)的公網(wǎng)和私網(wǎng)流量分開統(tǒng)計,可以將結(jié)果輸入到自建監(jiān)控中,當(dāng)發(fā)生業(yè)務(wù)故障時,可以快速定位問題。
1. iftop
iftop是linux系統(tǒng)下面一個監(jiān)控主機(jī)與外部通信的工具,它可以實時監(jiān)控本機(jī)與外部機(jī)器的流量大小,需要自行下載安裝包編譯安裝。iftop類似與linux系統(tǒng)自帶的top命令,在屏幕終端動態(tài)輸出監(jiān)控結(jié)果。同時,iftop支持很多參數(shù)可選項,其中-t 參數(shù)使用不帶ncurses的文本界面,可以實現(xiàn)將結(jié)果保存到文件。
2. os.popen函數(shù)
os是python的系統(tǒng)模塊,os.popen可以調(diào)用系統(tǒng)的shell命令,相當(dāng)于直接在shell終端執(zhí)行shell命令。
3. 實現(xiàn)思路
使用python的os.open來調(diào)用iftop命令獲取到和主機(jī)通信的所有ip的流量大小。然后分別分析公網(wǎng)和私網(wǎng)的流量,將各自的流量之和統(tǒng)計起來,從而實現(xiàn)分別監(jiān)控系統(tǒng)的公網(wǎng)和私網(wǎng)流量。
4. 代碼實現(xiàn)
# -*- coding:utf-8 -*-
"""
@Author: Rainbowhhy
@Date: 2020-11-14 15:16:18
"""
import os, re
def is_public_ip(ip):
# 判斷ip是公網(wǎng)還是私網(wǎng)
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):
# 統(tǒng)一轉(zhuǎn)換成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():
# 調(diào)用iftop命名獲取公網(wǎng)和私網(wǎng)流量
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)
# 計算公網(wǎng)和私網(wǎng)的總流量
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("公網(wǎng)入向:%s" % public_traffic_recv)
print("公網(wǎng)出向:%s" % public_traffic_send)
print("私網(wǎng)入向:%s" % private_traffic_recv)
print("私網(wǎng)出向:%s" % private_traffic_send)
5. 輸出結(jié)果截圖
如下圖是輸出結(jié)果展示
file:///home/rainbowhhy/%E6%A1%8C%E9%9D%A2/monitor.png

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python 用matplotlib畫以時間日期為x軸的圖像
這篇文章主要介紹了Python 用matplotlib畫以時間日期為x軸的圖像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python實現(xiàn)雙進(jìn)程防止單點故障實例深度探究
在分布式系統(tǒng)中,確保系統(tǒng)的高可用性是至關(guān)重要的,本文將深入探討如何使用Python實現(xiàn)雙進(jìn)程自我保護(hù)機(jī)制,以應(yīng)對單點故障,確保系統(tǒng)穩(wěn)定運行,將通過詳實的示例代碼,介紹雙進(jìn)程自我保護(hù)的原理、實現(xiàn)步驟以及可能遇到的挑戰(zhàn)2024-01-01
Python數(shù)據(jù)類型-序列sequence
這篇文章主要介紹了Python數(shù)據(jù)類型-序列sequence,在前面,我們已經(jīng)對Python學(xué)習(xí)做了系統(tǒng)的知識梳理(Python思維導(dǎo)圖),我們接下來把知識點分節(jié)進(jìn)行細(xì)講。這一節(jié),我們講解序列,需要的朋友可以參考下2022-01-01

