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つの原則

推薦する

jQueryは広告の表示と非表示のアニメーションを実装します

数秒後に広告が表示されて消えることがよくあります。この機能を実装するには、JQuery フレームワー...

Dockerを使用してgitlabコミュニティの中国語版を構築する詳細なプロセスを教えます

1. Docker Composeを使用して起動を構成するDocker Compose を知らない場...

MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...

mysql5.7.24 バージョンのインストール手順と解凍時に発生した問題の概要

1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...

Linuxのファイルとフォルダの権限を操作する方法

Linux のファイル権限まず、現在のディレクトリ内のファイルの内容を確認しましょう。 ls -l ...

DockerでVueプロジェクトをデプロイする方法を教えます

1.前面に書きます:軽量仮想化テクノロジーとして、Docker には継続的インテグレーション、バージ...

TomcatはXMLを解析し、リフレクションを通じてオブジェクトを作成します。

次のサンプル コードでは、Tomcat が XML を解析し、リフレクションを通じてオブジェクトを作...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

HTML ページ ソース コード レイアウトの概要_Powernode Java Academy

HTML ページ ソース コード レイアウトの概要この紹介では、Google のホームページのソー...

ルートパスワードを変更するための MySQL 設定、MySQL サーバー接続、MySQL 共通コマンド図

1. ルートパスワードの設定と変更mysql が起動しているかどうかを確認します。起動していない場合...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...

測定画像HTTPリクエスト

一般的なブラウザでテスト ページを開き、Fiddler で http リクエストを表示してください。...

HTML タイトル属性をラップする方法

数日前にプログラムを書いていたとき、プロンプト情報 (TITLE) を新しい行で囲みたいと思いました...

Tomcat を IDEA にダウンロード、インストール、デプロイするチュートリアル (IDEA の 2 つのホット デプロイ設定方法付き)

目次Tomcat ダウンロードチュートリアルTomcat インストールチュートリアルTomcat の...