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
が表示されます。connect
stap
root
# 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秒間隔で繰り返し実行されます。