web-dev-qa-db-ja.com

lsofを使用して着信TCP接続を識別する方法は?

サーバーがリモートサーバーへの接続を確立したかどうか、またはリモートサーバーがサーバーにアクセスしようとしたかどうかを知りたい。 lsofの出力を読み取ってこの情報を取得しようとしました:

lsof -i TCP:25 
 USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
master   2657    root   12u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   12950 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   12950 postfix    9u  IPv4 35762406      0t0  TCP hostname:smtp->spe.cif.ic.IP:55277 (ESTABLISHED)
smtp    13007 postfix   13u  IPv4 35762309      0t0  TCP hostname:34434->fake.VVVVV.fr:smtp (ESTABLISHED)
smtpd   14188 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)
smtpd   14188 postfix    9u  IPv4 35748921      0t0  TCP hostname:smtp->XX.XX.XX.XX:55912 (ESTABLISHED)
smtpd   14897 postfix    6u  IPv4     8086      0t0  TCP *:smtp (LISTEN)

この情報が、サーバーがspe.cif.ic.IPに接続しようとしていることを意味するのか、それともその逆であるのかを知りたいのですが。
記号は->に関連していますか、それとも別のコマンドを使用する必要がありますか?

4
Kiwy

手がかりはポート番号にあると思います、これらの2つのエントリを取ります

smtpd   12950 postfix    9u  IPv4 35762406      0t0  TCP hostname:smtp->spe.cif.ic.IP:55277 (ESTABLISHED)
smtp    13007 postfix   13u  IPv4 35762309      0t0  TCP hostname:34434->fake.VVVVV.fr:smtp (ESTABLISHED)

smtpdは高いポート番号からポートsmtp(25)で接続を受信しましたが、smtpはリモートポートsmtp(25)に接続し、ローカルの高いポート番号を持っています。

そう ->接続されているを意味します

8
X Tian

少なくともLinuxでは、lsofは、情報が利用できない/proc/net/tcpからリストを取得するため、接続を開始した側を特定できません。最初のアドレスは常にlocalエンドポイントを参照します。

最近のバージョンのssユーティリティ(接続情報を取得するために別のカーネルAPIを使用)は-eを使用して方向を示しますが、残念ながらTCP接続の場合は使用できません。

@ XTianが言った のように、TCP/SCTP/UDPの場合、接続イニシエーターは通常ハイポートを使用し、宛先は通常よく知られているローポートであるため、通常はどちらであるかを推測できます。ただし、保証はありません。マシンが同じポートにlisteningソケットを持っているか持っていないかを確認することも、それがどちらの方向であるかを理解するのに役立ちます。たとえば、あなたのケースでは、おそらくポートsmtp/25でリッスンしているプロセスがありますが、ポートunknown/34434のいずれもリッスンしていません。 fake.VVVVV.frが、特にソースポート25/smtpを使用して、マシンのポート34434への接続を開始することはほとんどありません(可能性は低いですが、完全に可能です)。

より信頼性の高いものについては、接続トラッカーに問い合わせることができます。

システムのファイアウォール接続トラッカーは、接続を開始した(またはUDPなどのコネクションレス型トランスポートプロトコルの最初のパケットを送信した)端を追跡します。 conntrackコマンドラインユーティリティまたはiptstate top-likeコマンドを使用して、接続追跡テーブルをクエリできます。

ここで、各行の最初のアドレスは、接続を開始したアドレスになります。

追跡されたすべての接続が含まれるため、ルーターのようにシステムを介して転送される接続も含まれる可能性があることに注意してください。

7