Python系統公網私網流量監控實現流程

2022-09-27 01:06:16 字數 3475 閱讀 7654

目前很多公司業務已經上雲,使用了大量的雲主機。當前大多數雲廠商的雲主機公網都是採用的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是公網還是私網

privwww.cppcns.comate = re.findall(

r'^((192\.168)|(198\.18)|(198\.19)|(10\.(1\d|2[0-4]\d|25[0-5]|[1-9]\d|\d))|(172\.(1[6-9]|2[0-9]|3[0-1])))\.(1\d|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d|2[0-4]\d|25[0-5]|[1k**prlka-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)

publwww.cppcns.comic_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系統公網私網流量監控實現流程

本文位址: /jiaoben/python/365965.html

公網ip和私網ip

以前還很奇怪,怎麼ip位址都 是192.168開頭的,但ping很多 發現不是192.168開頭的。原來是公網ip和私有ip的區別,192.168開頭的一般是私網ip 後經過查詢,一般私網的ip都為以下字段 100.0.0.0 10.0.0.0 172.16.0.0 192.168.0.0 什麼是公...

公網IP與私網IP區別

公網ip 用郵寄系統作比喻。有公網ip,相當於說你有乙個詳細的位址,你可以寫信寄給別 人,別人也可以用這個位址和你進行各種通訊。現在來看看沒有公網ip是一種什麼局面。這就像是住在乙個大院裡,所有進出郵件 都由傳達室轉交。如果是普通的郵件,可以放在傳達室,傳達室的大爺大媽看到你了就 會轉交給你,或者你...

公網和私網 配置內外網通用

ipv4公網 a類ip位址1.0.0.0 126.0.0.0 b類ip位址128.0.0.0 191.255.255.255 c類ip位址192.0.0.0 223.255.255.255 私網 a類 10.0.0.0 10.255.255.255 b類 172.16.0.0 172.31.255....