TCP接続を開始したローカルプロセスを見つける

TCP接続を開始したローカルプロセスを見つける

tcpdump を使用すると、多くの SYN パケットが表示され、送信元 IP は localhost です。

どのプロセスが接続しようとしているのかを探したいです。

接続は ESTABLISHED 状態に達せず、ランダムポートスキャンとして表示されます。

答え1

最近Linuxで同じ状況が発生しました(犯人はadb)。私のアプローチは、監査システムを使用してconnect()システムコールを記録することです。

sudo auditctl -a exit,always  -F arch=b64  -S connect -k who-connects

すべてのシステムコールを記録するように監査システムに指示しますconnect()(ここには64ビットバリアントがあります。32ビットアプリケーションと64ビットアプリケーションの両方を含むマルチアーキテクチャシステムを使用している場合は、32ビットバリアントに別のシステムコールを追加できます。あります)

後で実行:

sudo ausearch -i -k who-connects

何が接続されているかを確認してください。

ソケットAPIを使用せずにTCP接続を確立できます。たとえば、ユーザー空間でTCPスタックを実装し、低レベルのAPIを使用してパケットを送信すると、これは一般的ではありません(特にループバックインターフェイスで)。

答え2

SystemTapがインストールされていると仮定

probe begin {
    printf("ok\n");
}
probe syscall.connect {
    # connect however may fail or flail around in a EINPROGRESS state;
    # this log only indicates that a connect was attempted
    if (uaddr_af == "AF_INET" || uaddr_af == "AF_INET6")
        printf("%s[%d]: %s\n", execname(), pid(), argstr);
}
probe syscall.connect.return {
    printf(" -> %s[%d]: %s\n", execname(), pid(), retstr);
}

名前を付けて保存すると、次のように実行したときの呼び出しwhomakeconnect.stpが表示されます。connectstaproot

# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp

答え3

netstat コマンドを使用できます。パケットの状態を表示します。ただし、出力は送信時にのみ表示されるため、キャプチャする必要があります。 TCPリスニングソケットとは異なります。そのため、watchコマンドを使用してこれをキャッチできます。接続はipv4を介して行われたようです。

watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'

ネスタの国旗

pフラグ:プロセスID /名前

nフラグ:数値出力(DNS確認なし)

4フラグ:ipv4ソケットマーク

watchコマンドを使用すると、netstatコマンドは0.1秒間隔で繰り返し実行されます。

関連情報