短命のTCP接続所有者プロセスを見つける


15

tcpdumpApacheサーバーへのローカル接続で実行すると、TCP接続が確立され、2秒ごとにすぐに閉じられることがわかりました。これらの原因となっているプロセスを見つけるにはどうすればよいですか?netstat -ctp助けにはならなかった、接続が速すぎ、TIME_WAITのプロセス識別子が表示されない。

それらはhaproxyプローブであることが判明しましたが、これはで確認できstraceましたが、そもそもhaproxyを特定する方法はまだわかりません。

回答:


20

このようなことにはauditdフレームワークを使用できます。それらは「ユーザーフレンドリー」でも直感的でもないため、少し掘り下げる必要があります。

最初に、auditdがインストールされ、実行中であり、カーネルがそれをサポートしていることを確認してください。
Ubuntuの場合、たとえば、インストールできますapt-get install auditd

次に、監査用のポリシーを追加して、次のconnectようなすべてのsyscall を監視します。

auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT

Linuxの32ビットインストールを使用している場合、b64をb32に変更する必要があります。

このコマンドは、監査フレームワークにポリシーを挿入し、connect()syscallsが監査ログファイル(通常/var/log/audit/audit.log)に記録されるようになりました。

たとえば、netcatを使用してnews.ycombinator.comポート80に接続すると、次のような結果になります。

type=SYSCALL msg=audit(1326872512.453:12752): arch=c000003e syscall=42 success=no exit=-115 a0=3 a1=24e8fa0 a2=10 a3=7fff07a44cd0 items=0 ppid=5675 pid=7270 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="MYCONNECT"
type=SOCKADDR msg=audit(1326872512.453:12752): saddr=02000050AE84E16A0000000000000000

ここでは、/ bin / nc.openbsdアプリケーションがconnect()呼び出しを開始したことがわかります。多くの接続呼び出しを取得し、特定のIPまたはポートのみをgrepで出力する場合は、変換が必要です。SOCKADDR行にはsaddr引数が含まれ、0200で始まり、その後に80を意味する16進数のポート番号(0050)が続き、その後に16進数のIP(AE84E16A)が続きます。

監査フレームワークは大量のログを生成する可能性があるため、ミッションを達成したら必ず忘れて無効にしてください。上記のポリシーを無効にするには、-aを-dに置き換えます。

auditctl -d exit,always -F arch=b64 -S connect -k MYCONNECT

監査フレームワークに関する優れたドキュメント:http :
//doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

http://www.kloth.net/services/iplocate.phpで、IPアドレスを16進数、12進数、バイナリなどに変換します

一般的なhex / decコンバーター:http :
//www.statman.info/conversions/hexadecimal.html

IT Security Stack Exchangeのauditdの簡単な紹介。 http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

編集1
別のクイックアンドダーティ(スウェーデン語:フルハック)の方法は、次のように接続データをダンプする高速ループを作成することです。

while true;do
  ss -ntap -o state established '( dport = :80 )'
  sleep 1
done

このコマンドは、ssコマンド(ソケット統計)を使用して、ポート80への現在確立されている接続を、それを開始したプロセスを含めてダンプします。大量のデータを追加した| tee /tmp/output後、画面に出力を表示するだけでなく、後で処理/掘り出すために/ tmp / outputに書き込むこともできます。迅速なhaproxy接続がキャッチされない場合は、削除してみてください。sleep 1ただし、マシンの使用率が高い場合は、広範囲のロギングに注意してください。必要に応じて変更してください!


詳細な対応ありがとうございます。ホストカーネルではサポートされていないため、監査済みのソリューションについてお話しします。実験に適したソリューションを見つける時間はありませんが、そのことを心に留めておきます。ポーリングソリューションについては、lsofで似たようなことを始めましたが、満足のいくものではなかったため、すぐに停止しました。
pmezard

2
ausearch -iこれらのsaddr16進文字列を自動的にデコードするために使用することもできます。
sch 14

ssはlsofよりも満足のいくものです。なぜなら、それはより高速で、優れたフィルタリングルールを持っているからです。grepは不要です。サポートに関する問題を理解できます。Systemtapは優れたツールですが、実稼働サーバーで実行できるようにすることは満足のいくものではありません。
マックスマーフィー

1

「ausearch -i」から取得した巨大なログをgrepして、インターネット上の別のホストに正常に接続されたソケットのみを表示することもできます。インターネット上のホストに接続するソケットを作成する各プロセスとコマンドを取得する単純なスクリプトを作成し、そのターゲットホストの接続アドレスと、ソケットが「作成」された現在の時刻を取得しました。ここにあります:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then

    echo "You must run this script as root boy!"
    exit 1  

fi

> proccessConnections.dat

connections=`ausearch -i | grep host: | awk -F "msg=audit" '{print $2}' | awk -F ": saddr" '{print $1}'`

connectionsNumber=`echo "$connections" | wc -l`

echo "Number of connections: $connectionsNumber"

echo "$connections" > conTemp.dat

let counter=1
while read connectInfo; do

    success=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | grep success=yes`    
    addressInfo=`ausearch -i | grep "$connectInfo" | grep type=SOCKADDR | awk -F ': ' '{print $2}'`
    processInfo=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | awk -F 'comm=' '{print $2}' | awk -F 'key' '{print $1}'` 

    if [[ $success != "" ]]
    then    
        echo "[$counter - $connectionsNumber] (success)     comm=$processInfo - $addressInfo - $connectInfo"
        echo "[$counter - $connectionsNumber] (success)     comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
    else
        echo "[$counter - $connectionsNumber] (no success)  comm=$processInfo - $addressInfo - $connectInfo"
        echo "[$counter - $connectionsNumber] (no success)  comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
    fi

    let counter++


done < conTemp.dat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.