特定のポートを開いたままにするサービスがあります。
私はそれにデータを取得していますが、期待も取得もしたくないので、このデータのソースを特定しようとしています。では、どのプロセスがリッスンしているのではなく、送信データを特定のポートにどのようにして見つけることができるでしょうか。
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'
をヒューリスティックとして使用できます。
以下を試してください:
$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
データを送信するために確立する接続のタイプに応じて、これらのアプローチの1つがどこかに到達します。
このポートに送信されているデータを取得するには、tcpdump port 1234
を使用します。 Wiresharkなどのプログラムを使用して、別のマシンでそれを分析できます(-w
オプションを使用してファイルにキャプチャされます)。または、Wiresharkを直接使用します。
Tcp/udp接続を確立して開いたままにする場合は、netstat
を使用して接続のリモートIPを見つけることができます。
@StephaneChazelasが提供する回答のように、プロセスの開いているソケットを一覧表示します。
sockstat
コマンドを使用して、ローカルホスト上のサービスへの接続を開始したプロセスを見つけることができます。
DESCRIPTION
The sockstat command lists open Internet or UNIX domain sockets.
すべてのソース接続を宛先に一致させるだけです。これは、TCP/UDP/UNIXsocketsでは正常に機能します。
Solarisでは、すべてのプロセスでpfilesを実行すると、どのプロセスがどの接続を開いているかが表示されます。おそらくggrepの-A、-Bオプションを使用して、注意深いファイリングが必要です...
Linuxでは、netstat -anp --inet
は、lsofがインストールされていなくても機能します。 (落とす --inet
Unixドメインソケットも取得します)