Linux で ss コマンドと zabbix を組み合わせてソケットを監視する方法の詳細な説明

Linux で ss コマンドと zabbix を組み合わせてソケットを監視する方法の詳細な説明

序文

ここでは、zabbix を使用して監視します。netstat コマンドではなく ss コマンドを使用します。ss の方がはるかに高速だからです。信じられない場合は、テストしてみてください。マシンのソケットの数が多いほど、コントラストは顕著になります。 ss コマンドはさらに多くのコンテンツを表示できます。実際、私はこの 2 つのコマンドにあまり詳しくありません。man ss を使用すると、次のことがわかります。

1. ssコマンド

ss コマンドは、ソケットの状態を表示するために使用されます。PACKET ソケット、TCP ソケット、UDP ソケット、DCCP ソケット、RAW ソケット、Unix ドメイン ソケットなどの統計情報を表示できます。他のツールよりも多くの TCP および状態情報を表示します。これは、IP 接続とソケットを追跡するための非常に実用的で高速かつ効果的な新しいツールです。SS コマンドは、次の情報を提供できます。

  • すべてのTCPソケット
  • すべてのUDPソケット
  • すべてのssh/ftp/ttp/httpsの永続接続
  • Xサーバーに接続されたすべてのローカルプロセス
  • 使用状態(接続、同期、SYN-RECV、SYN-SENT、TIME-WAIT など)、アドレス、ポート フィルタリング
  • すべての状態 FIN-WAIT-1 tcpsocket 接続など

多くの一般的な Linux ディストリビューションは ss をサポートしており、多くの監視ツールは ss コマンドを使用します。このツールに精通していると、システム パフォーマンスの問題をより適切に検出して解決するのに役立ちます。netsat -ant/lnt などの一部の netstat コマンドの代わりに ss コマンドを使用することを強くお勧めします。

直接SSコマンド

上記を説明します。

Netid #ソケットの種類。上記の例では、TCP、u_str(unixストリーム)などのソケットがあります。 State #ソケットはどのような状態ですか?以下は、TCPソケットのすべての状態と説明です。これらは実際にはTCPの3ウェイハンドシェイクと4ウェイハンドシェイクのすべての状態です。 Recv-Q #ESTAB状態では、カーネル内のデータの何バイトが上位層アプリケーションによって読み取られていないかを示します。ここでの値が大きい場合、アプリケーションがブロックされている可能性があります。 Send-Q #ESTAB状態では、カーネル送信キュー内のデータの何バイトが確認ACKを受信して​​いないかを示します。この値が大きい場合、受信側の受信と処理を強化する必要があることを示しています。 Local Address:Port #ローカルアドレスとポート Peer Address:Port #リモートアドレスとポート

それでは、上記の状態を見てみましょう。ネットワークに精通している方であれば、非常によく理解できるはずです。少なくとも私は今はあまり詳しくありません。3 つのハンドシェイクと 4 つのウェーブの状態は次のとおりです。

: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

では、これらのステータス ss コマンドはどのように対応しているのでしょうか? (以下はssコマンドで表示されるステータス情報です)

[TCP_ESTABLISHED] = "確立済み"、
[TCP_SYN_SENT] = "SYN-SENT"、
[TCP_SYN_RECV] = "SYN-RECV"、
[TCP_FIN_WAIT1] = "FIN-WAIT-1"、
[TCP_FIN_WAIT2] = "FIN-WAIT-2"、
[TCP_TIME_WAIT] = "TIME-WAIT"、
[TCP_CLOSE] = "未接続"、
[TCP_CLOSE_WAIT] = "CLOSE-WAIT"、
[TCP_LAST_ACK] = "LAST-ACK"、
[TCP_LISTEN] = "LISTEN"、
[TCP_CLOSING] = "終了中"、

これで、次の監視を行うことができます。 ss コマンドの使用方法を読み続けてください。

使用法: ss [ オプション ]

ss [ オプション ] [ フィルター ]

-h, --help ヘルプ情報 -V, --version プログラムのバージョン情報 -n, --numeric サービス名を解決しない -r, --resolve ホスト名を解決 -a, --all すべてのソケットを表示する
-l, --listening リスニングソケットを表示する
-o, --options タイマー情報を表示 -e, --extended 詳細なソケット情報を表示 -m, --memory ソケットのメモリ使用量を表示 -p, --processes ソケットを使用しているプロセスを表示 -i, --info TCP 内部情報を表示 -s, --summary ソケットの使用状況の概要を表示 -4, --ipv4 IPv4 ソケットのみを表示
-6, --ipv6 IPv6ソケットのみ表示
-0, --packet PACKETソケットを表示
-t, --tcp TCPソケットのみ表示
-u, --udp UCPソケットのみ表示
-d, --dccp DCCPソケットのみ表示
-w, --raw RAWソケットのみ表示
-x, --unix Unixソケットのみ表示
-f, --family=FAMILY はタイプ FAMILY のソケットを表示します。FAMILY はオプションで、unix、inet、inet6、link、netlink をサポートします。
-A、--query=クエリ、--socket=クエリ
クエリ := {all|inet|tcp|udp|raw|unix|packet|netlink}[,クエリ]
-D, --diag=FILE 生のTCPソケット情報をファイルにダンプします -F, --filter=FILE ファイルからフィルター情報を削除します FILTER := [ state TCP-STATE ] [ EXPRESSION ]

焦点は次の監視です

2. Zabbix監視マシンの全体的なソケットステータス

この監視を行う前に、awkコマンドに慣れておくとよいでしょう。

ここで使用する監視システムは zabbix です。監視には、zabbix テンプレート (ここでは後で拡張できるようにテンプレートを選択) とカスタム スクリプトを組み合わせて使用​​します。

2.1. スクリプトを書く

では、早速スクリプトをご紹介します。

vim tcp_status.sh
##################スクリプトの内容#################
#!/bin/bash
[ $# -ne 1 ]の場合;
    echo "スクリプト名の後に引数を続けてください"
フィ

ケース$1

    聞く)
        結果 = `ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/LISTEN/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    設立
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/ESTAB/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;


    クローズ-待機
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/CLOSE-WAIT/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    時間待ち)
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/TIME-WAIT/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    SYN-SENT)
        結果 = `ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/SYN-SENT/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    SYN-RECV)
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/SYN-RECV/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    フィンウェイト1)
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/FIN-WAIT-1/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    フィンウェイト2)
        結果 = `ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/FIN-WAIT-2/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    アンコネン
        結果 = `ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/UNCONN/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    最終確認
        結果=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/LAST-ACK/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;

    閉会
        結果 = `ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/CLOSING/{print $2}'`
        [ "$result" == "" ] の場合;
               エコー0
        それ以外
           $結果をエコーする
        フィ
        ;;
 エサック

2.2. Zabbixエージェントの設定ファイルを設定する

zabbix_agent.conf を vim で開きます。
###############次のコンテンツを追加します#################
UnsafeUserParameters=1 #このパラメータはカスタムスクリプトに必要です UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh $1 #これは、記述したスクリプトを指定してパラメータを渡すために使用されます

設定後は必ずZabbixエージェントを再起動してください。

2.3. Zabbixテンプレートの設定

アイテム、トリガー、グラフを追加する

次の図に示すように、新しいテンプレートを追加し、それにアイテムを追加します。

上図のキーのtcp.statusは、ステップ2の設定を参照します。UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh \$1

そして括弧内の内容は\$1で渡されるパラメータです。具体的なパラメータは[UNCONN]のUNCONNです。これらの値は、第1ステップの監視スクリプトの場合、それぞれの場合に対応しています。基本的にはここで完了です。では、次の図に示すように、グラフを描画してテンプレートにグラフを追加してみましょう。

最も重要なステップは、監視スクリプトが設定されたホスト(最初のステップ)をテンプレートに追加することです。ここまでで監視は完了です。結果のグラフを見てみましょう。

3. 各マシンからZabbix監視マシンへのリクエスト数

この監視の目的は、どのマシンがターゲット マシンに頻繁にアクセスするかを確認することです。

この監視はセルフディスカバリー監視を使用しますが、これは上記の監視よりも少し難しいです。なぜセルフディスカバリー監視を選択するのでしょうか?項目が確実ではないからです。ここでは、元のアドレス IP と宛先 IP アドレスを項目として選択します。宛先 IP アドレスは変更されないため、元のアドレス IP の値は変化します。したがって、ここでの監視には項目の自動生成が使用されます。項目を自動的に追加および削除します。実際には非常に使いやすいです。一度学べば、とても簡単です。

これも3つのステップに分かれています: スクリプトの作成、zabbix_agent.confファイルの設定、検出の設定

3.1. スクリプトの作成

ここでは 2 つのスクリプトが必要です。1 つは自己検出用 (json 形式で出力する必要がある)、もう 1 つはアイテム用です。

vim tcp_monitory.sh
###################tcp_monitor.sh####################
#!/bin/bash
#データを取得してdata.txtファイルに出力します。形式は次のとおりです: 元のアドレス ip: count: ターゲットアドレス ip
#そして、カウントが 200 未満のデータをフィルターします。ここではソケット ステータスがありません。これは複雑すぎます。個々のニーズに応じて改善できます。ip_addr=`ip addr | grep -w inet | grep -v "127.0.0.1" | awk '{print $2}'| awk -F "/" '{print $1}'`
ss -ant | awk '{ print $5}'|grep -Ev '127.0.0.1' | cut -d ':' -f4 | awk -v ip_addr=$ip_addr 'NR>1 {++s[$1]} END {for(k in s)if(s[k]>=200){print k,s[k],ip_addr}}' | grep -E "^([0-9]{1,3}\.){3}[0-9]" > /home/zabbix/data.txt

#Python スクリプトを実行して json 形式を出力します。
python /home/zabbix/get_json.py

#####################################
#以下はget_json.pyの内容です###############get_json.py##################
#!/usr/bin/env python
#コーディング=utf-8
jsonをインポート

def create_json(パス):
    json_list = []
    open(path) を f として:
        f.readlines() の行に対して:
            辞書 = {}
            分割 = 行.分割(" ")
            dict["{#DES_IP}"] = 分割[0]
            //dict["{#LINK_COUNT}"] = split[1] //これはオプションです dict["{#SOU_IP}"] = split[2][:-1]
            json_list.append(辞書)
    合計 = {}
    合計["データ"] = json_list
    合計 = json.dumps(合計)
    合計を印刷する


__name__ == '__main__' の場合:
    パス = "/home/zabbix/data.txt"
    create_json(パス)

################区切り線: 上記は自分で発見したスクリプトです###############
################区切り線: 以下はアイテム関連のスクリプトです###############
vim tcp_item.sh
###################tcp_item.sh#######################
#!/bin/bash
エクスポートLANG="en_US.UTF-8"
パス=/home/zabbix/data.txt
count=`cat $path | grep $1 | grep $2 | awk '{print $2}'`
[ 1 "$count" -eq 1 ] && echo 0 || echo $count

両方のスクリプトが完了したので、zabbix_agent.confを設定できます。

3.2. zabbix_agent.conf ファイルの設定

構成ファイルに次の内容を追加します。

UnsafeUserParameters=1 #すでに設定されている場合は、設定する必要はありません UserParameter=discovery.tcp_monitor[*],sh /home/zabbix/tcp_monitor.sh #自己検出 UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh $1 $2 #item、$1と$2は、異なるアイテムを区別するためのアイテム内の転送パラメータです

3.3. 検出、アイテム、トリガー、グラフを構成する

ここでは、Zabbixテンプレートで設定することを選択し、Discoveryを追加します。

次に、Discoveryでアイテム、トリガー、グラフを設定します。

構成項目:

上記の DES_IP と SOU_IP は、自己検出スクリプト内の Python スクリプトから派生し、出力形式に使用されます。 alter.tcp_count は UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh \$1 \$2 であ​​り、後続の \$1、\$2 は DES_IP、SOU_IP に対応し、一意のアイテムを生成します。

アイテムを設定したら、トリガーを設定できます。

次にグラフの設定を続けます

最後に、テンプレートをマシンに追加して結果を確認します

上記は、Linux ss コマンドを zabbix と組み合わせてソケットを監視する方法についての詳細な説明です。Linux ss コマンド zabbix ソケット監視の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Linux の運用と保守で netstat の代わりに ss コマンドを使用する方法
  • Linux ssコマンドの詳しい説明
  • Linux プロセス間通信方式ソケットの使用例
  • Linux UDPソケットの非ブロッキングモードとブロッキングモードの違い
  • Linux ネットワーク プログラミング UDP ソケット プログラム例
  • Linux ネットワーク プログラミング ソケット ファイル転送の例
  • ZabbixはSNMPに基づいてLinuxホストを監視します
  • ZabbixはLinuxシステムサービスのプロセスを監視
  • Linuxホストを監視するためのZabbixの設定方法
  • Linuxの重要プロセス監視の実装方法の詳細説明

<<:  MySQL PXC クラスターの構築方法

>>:  クリーンで美しいウェブデザインのための4つの原則

推薦する

CSS3 テキストシャドウ text-shadow プロパティの詳細な説明

テキストシャドウ text-shadow プロパティの効果: 1. 右下隅の影、左下隅の影、左上隅の...

ノードイベントループとメッセージキューの分析

目次非同期とは何ですか?なぜ非同期性が必要なのでしょうか?非同期IOとは何ですか?イベントループとは...

WINDOWS での MYSQL のインストールに関する詳細なチュートリアル

1. インストールパッケージをダウンロードする- お使いのコンピュータシステムに応じて適切なバージョ...

JS と Nodejs におけるイベント駆動型開発についての簡単な説明

目次イベント駆動型とパブリッシュ・サブスクライブ型ブラウザの JavaScript ではイベント駆動...

計算機機能を実装するミニプログラム

この記事の例では、計算機機能を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

CSSの使用に関する深い理解 clear:both

clear:both清除浮動これは私が常に持っていた印象ですが、私はこれをめったに使用せず、私の理...

MySQL 8.0.24 リリースノートのいくつかの改善点

目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...

Java を Mysql バージョン 8.0.18 に接続する方法の詳細な説明

JavaとMysql 8.0.18バージョンの接続方法については、参考までに具体的な内容は以下のとお...

3分でUbuntu 16.04を初期化し、Java、Maven、Docker環境をデプロイする

Fast-Linux プロジェクト アドレス: https://gitee.com/uitc/Fas...

jQuery キャンバスで画像検証コード例を描画する

この記事では、jQuery Canvasの描画画像検証コードの具体的なコードを例として紹介します。具...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

Vueプロジェクトでよく使われる実践的なスキルのまとめ

目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...

MySQL での重複キー更新時の replace into と insert into の使用法と相違点の分析

この記事では、MySQL での重複キー更新時の replace into と insert into...

js の関数の長さはどれくらいですか?

目次序文なぜいくらですか?パラメータの数デフォルトパラメータ残りのパラメータ要約する序文今日は関数の...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...