Linuxでは、lsof -i
またはnetstatを使用してアクティブなネットワーク接続を一覧表示できることを知っています。ただし、私が知る限り、これは現在開いているである接続のみをリストします。
プロセスが短い接続を確立してから終了した場合(たとえば、プログラムが「ホームに電話をかける」など)、その瞬間にlsof
を実行しない限り、プロセスを見逃してしまいます。接続しているサーバーのリストを取得する方法はありますか?たとえば、システム全体で新しい接続が開かれるたびにファイルにIPアドレスを書き込むツール。
このタスクのためだけにwiresharkなどのネットワークスニファを永続的に開いたままにしておくのはやり過ぎのようです。
プロセスが短い接続を確立してから終了した場合(たとえば、プログラムが「ホームに電話をかける」など)
これらのプログラムのほとんどは、情報が「ホーム」に到着することを保証するためにTCP接続を作成します。この場合、netstat
コマンドが親友になります。すべて閉じたTCP接続はTIME_WAIT
状態で少しまたは少し長く保持され、netstat --inet -n
はこれらの接続(および現在開いている接続も)を一覧表示します。
運が悪く、その卑劣なプロセスがUDP接続を使用している場合、またはトラフィックを長期間監視したい場合は、TCPDumpやIPTrafなどのツールを使用してマシンの完全なネットワークトラフィックを監視する必要があります。 IPTrafは、IPアドレスとポートのみを記録するため、より単純です。TCPDumpは、より高度なツールであり(その名前にもかかわらず、UDPおよびICMPトラフィックも監視できます)、すべてのネットワークトラフィックを記録します。
試したことはありませんが、出力チェーンのLOG
ターゲットでiptablesを使用することを検討しましたか?
次のようなもの(テストされていませんが、要点がわかります)。
iptables -I OUTPUT ! -i lo -p tcp --syn -j LOG --log-prefix 'New TCP'
iptables -I OUTPUT ! -i lo -p udp -m state --state NEW -j LOG --log-prefix 'New UDP'
これは、TCP接続ごとに1回、新しいUDPセッションごとに1回ログを記録します。ただし、ループバックインターフェイスは除きます。これは、おおよそ要求しているようです。その後、grep
システムログを使用して、どの発信接続が確立されたかを確認します。
ただし、どのアプリケーションが接続を開始したかはわかりません(そして、プレーンなiptablesではわかりません)。これからログが取得されますtonsこれはほとんど役に立たない可能性があります(正当な接続の数は、電話をかけることを確実に小さくするからです)。