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


21

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

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

回答:


23

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

lsof -nPi tcp:the-port

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

UDPまたはRAWソケットの場合、systemtapやdtraceのようなものが役に立つ可能性があると思いますが、それはより複雑です。おそらく同様に監査されます。


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


これは私にとってSCTPでは機能しません。
sudo

1
@sudo、編集を参照
ステファンChazelas

3

以下を試してください:

$sudo ss -tp

または:

$sudo netstat -A inet -p

ローカルホストの結果を回避するには:

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

ESTABLISHED接続のみをリストするには:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED

2

データを送信するために確立する接続のタイプに応じて、これらのアプローチのいずれかを使用すると、どこかにアクセスできます。

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

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

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


1

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

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

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


0

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

Linuxでは、netstat -anp --inetlsofがインストールされていなくても機能します。(--inetUnixドメインソケットも取得するにはドロップします)

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