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 秒間隔で繰り返し実行します。

関連情報