F5記錄鏈接表腳本

    今天羣里正好有人問一個狀況,用戶的業務併發鏈接忽然飆升,做爲部署在敏感位置的F5設備,並無自動記錄鏈接請求日誌的現成功能,若發生這種狀況,用戶須要知道當時的鏈接表狀況,起碼要知道是哪一個IP地址發出的大量請求。
bash

    F5面對這種狀況,基本有2個選擇:
服務器

一、在VS中關聯iRule,記錄每次的tcp請求狀況,包括請求原地址、源端口、net成內部地址、net成內部端口、分發到哪臺服務器等信息。可是記錄這些日誌很是消耗設備性能,我記的有一個用戶就非要作這個,怎麼勸都不聽,他的設備併發峯值是1200萬/s,也就是有可能一瞬間要寫入上百萬條日誌,非要作就作吧,郵件裏把事情的狀況寫明,致使的後果寫明,iRule給他,要作就本身作吧。果不其然,真是立竿見影,放上去點了一下「update」,設備宕機了。併發

二、每隔一段時間去檢查一下鏈接表條目數,若是超過閥值就記錄當前的鏈接表狀況,而且根據原地址進行過濾排序。我認爲這種方式要好一些,就算你的併發有1200萬,我顯示鏈接表,對鏈接表信息過濾等等操做,也只是相對速度慢了一些,對設備不會形成太大影響。tcp


#!/bin/bash

function define()
{
    threshold=20000
    log_path=/tmp/f5_conn_log/
    user=`whoami`
}

function check()
{
    if [ $user != root ];then
        echo "Please use root user."
        exit 1
    fi
    
    if [ ! -d $log_path ];then
        mkdir $log_path
    fi
}

function gather()
{
    while true
    do
        timestamp=`date +%Y%m%d_%H%M%S`
        num_conn=`tmsh show sys connection | wc -l`
        
        if [ $num_conn -gt $threshold ];then
            tmsh show sys connection>${log_path}${timestamp}.log
            awk -F ':' '{print $1}' ${log_path}${timestamp}.log | sort -nr | uniq -c | sort -nr | head -20 >> ${log_path}${timestamp}_top.log
        fi
        
        sleep 300
    done
}

function main()
{
    define
    check
    gather
}

main


腳本是個while死循環,使用的時候加上&放到後臺,能夠設置爲開機啓動。ide

每次取到的信息是2個文本文件,一個是完整的鏈接表,另外一個是對鏈接表進行過濾排序的top20。性能

[root@F5:Active] f5_conn_log # cat 20160114_164101_top.log 
   5841 192.168.1.7
   1674 192.168.1.104
   1462 164.115.20.151
    317 192.168.4.110
    274 192.168.4.84
    258 192.168.1.248
    257 192.168.4.13
    246 192.168.1.76
    214 192.168.1.85
    199 192.168.1.146
    183 192.168.1.120
    169 192.168.1.166
    165 192.168.1.134
    163 172.18.0.131
    161 192.168.1.115
    155 100.90.90.150
    153 192.168.1.6
    148 192.168.100.76
    142 172.18.0.107
    137 192.168.1.150
相關文章
相關標籤/搜索