web-dev-qa-db-ja.com

どのプロセスが特定のポートにデータを送信するかを見つけるにはどうすればよいですか?

特定のポートを開いたままにするサービスがあります。

私はそれにデータを取得していますが、期待も取得もしたくないので、このデータのソースを特定しようとしています。では、どのプロセスがリッスンしているのではなく、送信データを特定のポートにどのようにして見つけることができるでしょうか。

22
user50849

TCPの場合(同じアプローチがSCTPでも機能しますが1 または任意の接続指向のトランスポートプロトコル)、リスニングするものを探すのと同じです:

lsof -nPi tcp:the-port

TCPソケットがそのポートで開いているプロセスを報告します。ソースポートがわかっている場合(サーバーアプリケーションはそれを認識してログに記録できます)、代わりにそれを使用して、不正なクライアント。

UDPソケットまたはRAWソケットの場合、systemtapやdtraceなどが便利になると思うのですが、トリッキーになります。おそらく同様に監査。


1 SCTPサポート(Linuxのみ)がバージョン4.86のlsofに追加されましたが、-iを使用してSCTPソケットを明示的に要求することはできません。代わりにlsof -nP | grep -w 'SCTP.*:the-port'をヒューリスティックとして使用できます。

25

以下を試してください:

$Sudo ss -tp

または:

$Sudo netstat -A inet -p

Localhostの結果を回避するには:

$Sudo netstat -A inet -p | grep -v localhost

ESTABLISHED接続のみを一覧表示するには:

$Sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
3
Amol

データを送信するために確立する接続のタイプに応じて、これらのアプローチの1つがどこかに到達します。

  • このポートに送信されているデータを取得するには、tcpdump port 1234を使用します。 Wiresharkなどのプログラムを使用して、別のマシンでそれを分析できます(-wオプションを使用してファイルにキャプチャされます)。または、Wiresharkを直接使用します。

  • Tcp/udp接続を確立して開いたままにする場合は、netstatを使用して接続のリモートIPを見つけることができます。

  • @StephaneChazelasが提供する回答のように、プロセスの開いているソケットを一覧表示します。

2
gertvdijk

sockstatコマンドを使用して、ローカルホスト上のサービスへの接続を開始したプロセスを見つけることができます。

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

すべてのソース接続を宛先に一致させるだけです。これは、TCP/UDP/UNIXsocketsでは正常に機能します。

1

Solarisでは、すべてのプロセスでpfilesを実行すると、どのプロセスがどの接続を開いているかが表示されます。おそらくggrepの-A、-Bオプションを使用して、注意深いファイリングが必要です...

Linuxでは、netstat -anp --inetは、lsofがインストールされていなくても機能します。 (落とす --inet Unixドメインソケットも取得します)

0