返されたTCP接続に関する情報を確認するとsock_diag(7)
(または/proc/net/tcp
)、与えられた接続が接続を所有するローカル側で発生したことを確認する方法受動的、リスニングソケットまたはアクティブ接続ソケット?
修正する私はAPIレベルでこれを行うことに興味があります。つまり、ss
コマンドを開始したり待つことなく実行することですnetstat
。
答え1
同じローカルIP +ローカルポート組み合わせを使用して複数の接続を検出した場合、これらの接続が形成されるとシステムは手動エンドポイントです。発信接続にローカルポート+ローカルIPの組み合わせが使用される場合、通常、異なるプロセスは同じローカルIPと同じローカルポートを異なる目的に使用することはできません。
一度確立すると、TCP接続は完全に対称的である必要があるため、接続がインバウンド方向またはアウトバウンド方向に設定されているかどうかを示す接続自体に関連する属性がない可能性があります。同じローカルIPを使用するリスニングソケットまたは他の接続を検出する場合は、+ポートペアを使用すると、これらすべての接続が着信接続であることを確認できます。
しかし、接続が1つだけ表示され、一致するリスニングソケットがない場合は、確かにわかりません。発信接続でも、現在閉じていて新しい接続の受信を停止したサービスへの最後の残りの受信接続でもあります。
一部のポート番号ベースのヒューリスティックが適用される場合があります。ローカルポート番号が指定された範囲内にある場合は発信接続である/proc/sys/net/ipv4/ip_local_port_range
可能性が高く、以前のサービスを使用しない限り1024未満の場合は着信ポートである可能性が高くなります。 、このサービスは、発信接続をルートポートでのみ開始する必要があります(一部のNISサービスまたは同様のサービスにはこの要件があると思います)。