tcpdumpのようなローカルUNIXドメインソケットを監視できますか?


59

元の接続を乱すことなく、Unixソケットの応答を監視し、それらを処理のためにスクリプトにパイプしたいと思います。

tcp接続でtcpdumpを使用してこれを行う方法は知っていますが、ローカルUNIXソケットの解決策を見つけることができないようです。

これも可能ですか?


回答:


15

2つのソケット間のゲートウェイとして機能するアプリを作成し、流れるすべてのデータをログに記録することで、そうすることを主張する人がいます。したがって、ソケットをタップすることはできませんが、サービスを再起動し、このガイアプリを使用するように調整できる場合は、すべてのトラフィックを表示できます。

投稿へのリンクはこちら:Unix Socket Sniffer

ソケットに接続されているプロセスIDを見つけ、ソケットのファイル記述子をlsofで見つけ、straceを使用してファイル記述子をタップする必要がある別の方法があります。

ソケットを使用しているクライアント/サーバーを停止して再構成できる場合は、常に最初の方法をお勧めします。2番目の方法は注意が必要であり、一部のアプリではクラッシュする可能性がある現在のプロセスをタップする必要があります。

誰かが別の方法で私たちを啓発することを願っています:)

幸運を


ええ、socatでも仲買人の方法を使用できますが、既存の設定を他の場所で変更せずに、より直接的な方法を望んでいます。
ck_

1
それからlsofとstraceが私が知っている唯一の方法です。プロセスからstraceを切り離すときの生産に注意し、その後すべてが実行し続けることを確認します。
バロール

3
さらに掘り下げた後、stackoverflowでこれが直接可能ではない理由についていくつかの詳細を含む同様の質問を見つけましたstackoverflow.com/questions/8394613/…–
ck_

80

socatを使用できます。

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

上記で何が起こっているのか:最初に元のソケットをsock.originalに移動します。Socatは、元の場所に新しいソケット(「UNIX-LISTEN」)を作成し、すべてを元の場所(「UNIX-connect」)に転送します。-vは、出力をSTDERRに出力するようsocatに指示します。


3
もう少し説明を追加しますか?
カザーク

4
元のUNIXソケットにファイルシステム上のパスがある場合、これは簡単です。しかし、実際に移動できない抽象的な名前空間のUNIXソケットの場合はどうでしょうか。
ヴァレリオスキアヴォーニ

6

また、ソケットのいずれかの側のプロセスの1つでstraceを使用してみることもできます。これにより、書き込み/読み取りの内容を監視できるからです。私の実稼働環境では、socatはありませんが、straceはあります。

便利な目的のためには、-sを大きな値に設定する必要があります。


これは私にとってはうまくいき、簡単にできました。strace -p <pid>実行中のプロセスを監視するために使用します。
マットマンソン

クイックコマンド: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logそして、テストを実行します。ログが大きすぎるかどうかをゆっくり確認するための/tmp/php.logがあります。あなたはあまりにも多くのトラフィックを取得している場合は、ログでそれを検索することができますので、あなたの名前か何かでクエリ文字列とリクエストを行う
higuita

1
@higuita長い時間がかかったことは知っていますが、そのループの代わりにprintf繰り返しを処理することができます。printf " -p %s" $(pidof php5-fpm)各pid引数をプレフィックスとして使用し-p、より実用的です。
JOL

2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

その後:

sudo tcpdump -i lo -netvv port 8089

エル・マグニフェコ!ありがとう
typelogic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.