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