4

特定のイベント (DSL 再接続による動的 IP 変更) に対応するために、2 つのクローズド ソース プロセス (ルーター ファームウェア) 間の IPC を監視する必要がある組み込みプラットフォーム (mipsel アーキテクチャ、Linux 2.6 カーネル) を使用しています。straceを介してこれまでにわかったことは、IP が変更されるたびに、DSL デーモンが特定のファイル名にバインドされた UNIX ドメイン ソケットに特別なメッセージを書き込むことです。メッセージは別のデーモンによって消費されます。

ここで私の要件は次のとおりです。特定の UNIX ドメイン ソケットを介したデータ フローを監視し、特定のメッセージが検出された場合にイベントをトリガーする (シェル スクリプトを呼び出す) 必要があります。ファイル名をinotifyで監視しようとしましたが、ソケットファイルでは動作しません。strace を常に実行し、その出力をフィルター処理して、フィルター処理されたログ ファイルの変更に対応できることはわかっていますが、strace はシステムの速度を実際に低下させるため、これは解決策としては重すぎます。また、cron を介して IP アドレスの変更をポーリングすることもできますが、ポーリング ソリューションではなくウォッチドッグが必要です。また、UNIX ドメイン ソケットを具体的に監視し、事前定義された方向に流れる特定のメッセージに反応できるツールがあるかどうかを調べることに興味があります。inotifywait に似たものを想像します。つまり、ツールは特定のイベントを待ってから終了し、

それを実行できる既存の Linux ツールはありますか? または、自分のプラットフォーム (glibc ではなく uClibc) でコンパイルできるスタンドアロン バイナリ用の単純な C コードはありますか? 私は C の専門家ではありませんが、makefile を実行することはできます。シェルからバイナリを使用することは問題ありません。私はシェル プログラミングについて十分に知っています。

4

2 に答える 2

5

このトピックを扱ってからしばらく経ちましたが、私の知人である Busybox のメンテナーであるDenys Vlasenkoが数か月前に私に解決策として提案したものを実際にテストすることはできませんでした。ここ StackOverflow で自分のアカウントを確認したところ、質問が再び表示されたので、彼の洞察を共有させてください。多分それは誰かに役立つでしょう:

私が提案できる比較的簡単なハックの 1 つは、次のことを行うことです。

Unix ドメイン リスニング ソケット (たとえば ) を開いた実行中のサーバー アプリがあり/tmp/some.socket、クライアント プログラムがそれに接続してサーバーと通信するとします。

  • 名前を変更/tmp/some.socket->/tmp/some.socket1
  • 新しいソケット /tmp/some.socket を作成します
  • 新しいクライアント接続をリッスンします
  • そのような接続ごとに/tmp/some.socket1、元のサーバープロセスへの別の接続を開きます
  • いずれかの側から EOF になるまで、結果として得られるソケットのペア (これを行うコードは telnetd サーバーが行うものと非常に似ています) にデータ (クライアント <-> サーバー) を送り込みます。

データをポンピングしている間、それを見て、保存し、必要に応じて変更することも簡単です。

欠点は、元のサーバー プログラムを再起動するたびに、このスニファ プログラムを再起動する必要があることです。

これはCeladaも答えたものと似ています。彼にも感謝!ただし、Denys の答えはもう少し具体的でした。

私は尋ね返しました:

はい、再起動が必要なため、これはハックに聞こえますが、実行可能です。私は C プログラマーではありませんが、パススルーとプロトコルまたはイベントベースのトリガーを実行できるコマンド ライン ツールを知っているかどうか疑問に思っています。私たちのプロジェクトには、そのためにちょっとした C バイナリをハッキングできる人が 1 人いますが、彼がそれをするのが好きかどうかはわかりません。プレハブのものがあれば、それを好むでしょう。BusyBoxアプレット(の組み合わせ)でそれを行うことさえできますか?

Denys は再び次のように答えました。

でbusyboxを構築する必要がありますCONFIG_FEATURE_UNIX_LOCAL=y

傍受サーバーとして次を実行します。

 busybox tcpsvd -vvvE local:/tmp/socket 0 ./script.sh

script.sh は、「元のサーバー」への単純なパススルー接続です。

 #!/bin/sh
 busybox nc -o /tmp/hexdump.$$ local:/tmp/socket1 0

例として、ファイルに 16 進ログを追加しました (-o FILEオプション)。

エミュレートされた「元のサーバー」を実行してテストします。

 busybox tcpsvd -vvvE local:/tmp/socket1 0 sh -c 'echo PID:$$'

「傍受サーバー」に接続することにより:

 echo Hello world | busybox nc local:/tmp/socket 0

「PID:19094」メッセージが表示/tmp/hexdump.19093され、ダンプされたデータを含む新しいファイルが作成されます。両方の tcpsvd プロセスもいくつかのログを出力する必要があります (これらは詳細に実行されます-vvv)。

より複雑な処理が必要な場合は、nc 呼び出しをscript.sh カスタム プログラムに置き換えます。

于 2012-06-12T11:45:49.833 に答える
0

UNIX ソケット トラフィックを完全に傍受できるものはないと思います。以下にいくつかのオプションを示します。

  • リッスンしいる別のソケットに送信側プロセスが接続するように手配します。また、クライアントとして元のソケットに接続します。データを受信したら、通知したいデータを通知し、すべてを元のソケットに渡します。
  • netlink ソケット ( 、 など...) を使用して、自分で IP アドレスの変更についてシステムを監視しRTM_NEWADDRますRTM_NEWLINK
  • 外部プロセスとして実行ip monitorし、追加および削除された IP アドレスに関するメッセージを標準出力に書き込むときにアクションを実行します。
于 2011-12-29T10:34:06.783 に答える