アプリケーションがバインドするポートを見つけるときに/etc/services
競合が発生しないことを確認するために積極的に検索しますか?つまり、 にポートが登録されていれば実際に使用するかどうか/etc/services
に関係なく予約されているのでしょうか?
答え1
各 TCP 接続には 1 つは含まれませんが、二つポート番号:ローカルポートとリモートポート。発信接続では、ローカルポート番号は重要ではなく、ほとんどのプログラムではオペレーティングシステムにそれを選択させます。 binstaが指摘したように、オペレーティングシステムは一時ポート範囲から最初の利用可能なポートを自動的に選択します。
ただし、アプリケーション(またはアプリケーションを実行しているユーザー)は、接続するリモートポート番号を指定する必要があります。そうしないと、リモートホストから正しいサービスに接続できません。
着信接続の場合、状況はミラーリングされます。サーバーアプリケーションは通常、オペレーティングシステムに着信接続をリスンするローカルポート番号を選択させることはできません。そうしないと、クライアントは接続するポートを知ることができません。ただし、着信接続をリッスンするアプリケーションは、しばしばリモートポート番号を無視し、リモートホストにそれを決定させます。
(一部のサービスは完全動的ポート番号を使用し、多くの場合、サポート検索プロトコルを使用してサーバーがリッスンしているポートを識別します。NFSv3はrpc.statd
おそらくrpc.mountd
現代のLinuxユーザーにとって最も使いやすい例です。リモートホストに接続するにはまず、111のRPC portmapperポートからそのホストにアクセスし、サービスがどのポートにあるかを尋ねます。
一部のサーバーアプリケーション(主にクラシックUnixサーバーアプリケーションinetd
)は、使用するローカルポートを名前で見つけることができ、通常はインポートgetportbyname()
されます/etc/services
。
ただし、アプリケーションはこのステップをスキップし、目的のポートを数値で直接指定できます。ほとんどの最新アプリケーションはこれを行う傾向があります。番号で受信ポートを設定する必要があるすべてのサーバープログラムがこれを行います。
今日より一般的に使用されるアプリケーションは、出力のポート番号をより人間に優しい名前に置き換えることができる、またはなどのアプリケーション/etc/services
です。ただし、名前検索のためのこのポート番号は説明にのみ依存できることに注意してください。lsof
netstat
tcpdump
/etc/services
一般的な用途:ポートの正確な説明でもそうでない場合もあります。実際の使用特定のシステムで。
/etc/services
したがって、「ポートが に登録されていれば予約されていますか?」という質問に対する答えは次のとおりです。いいえ、そうではありません。。
一部/etc/services
ポート番号がアプリケーション設定で直接指定されている場合、またはユーザーが指定しない限り、アプリケーションはそれを使用して使用するポート番号を決定できます。
「衝突」に対する保護はオペレーティングシステムレベルで発生し、次の状況にはまったく関係ありません/etc/services
。アプリケーションがbind(2)
特定のポート番号を使用しようとしていることを指定するためにシステムコールを実行し、そのポートがすでに別のプログラムで使用されている場合、システムコールは失敗します。EADDRINUSE
これは、他がすでにそれを使用していることを示します。
答え2
いいえ、アプリケーションはポートバインディングを要求しますが、実際にアプリケーションにポートを割り当てるかどうかを決定するのはオペレーティングシステムです。
root
したがって、たとえば、1024未満のポートは、有能なユーザーのみが使用できますCAP_NET_BIND_SERVICE
。
proc/sys/net/ipv4/ip_local_port_range
一時ポート範囲と呼ばれるローカルポートを選択するためにTCPおよびUDPトラフィックが使用するローカルポート範囲を定義します(変更可能)。
cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
または
sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
/proc/sys/net/ipv4/ip_local_reserved_ports
また、一部のポートは管理者が設定またはカーネルパラメータを介して予約できるため、net.ipv4.ip_local_reserved_ports
これらのポートは自動ポート割り当てには使用されません。
目的は、プログラムが使用する必要があるポートを取得するためにコードでソケット呼び出しを実行できる/etc/services
ようにすることです。getportbyname()
答え3
多くのアプリケーションではよく知られているポート番号。彼らは通常それに縛られているでしょう。
他のアプリケーションはポート0にバインドされ、システムは利用可能なポートを選択します。次に、よく知られているポート番号に加えて、別の方法を使用してポート番号をエンドクライアントに転送します。たとえば、ネットワークに可用性をブロードキャストします。
答え4
消化するのが多すぎます。必要な答えを得たと思います。 /etc/servicesはよく知られたサービスと公式名の登録です。 getportbyname() を使用して直接参照できますが、必須ではありません。動的ポートが要求されると、発信ポートが要求される可能性があります。 ip_local_port_range は、許可されるポート範囲への参照です。管理者は、特定のポートを/proc/sys/net/ipv4/ip_local_reserved_portsまたはカーネルパラメータrnet.ipv4.ip_local_reserved_portsに追加することで予約できます。自動ポート割り当てでは、これらのポートは使用されません。私が正しい場合、私がこの質問をするのは、AIXの安全なオンプレミスの世界でAzure CloudとSUSEに切り替えたからです。クラウドクラスタの場合、ロードバランサ機能を使用して、クラスタノード間で移動するサービスIPアドレスなどを定義します。使用する特定のポート(62500など)を割り当てる必要があります。最近、Commvaultというバックアップソフトウェアをテストしていますが、クラスタが起動する前に同じポートを占有することがあり、これを回避する方法を見つけました。デフォルトのローカルポート範囲を変更して高い表示が62499になるようにするか、ポートをip_local_reserved_portsに特別に追加する必要があるようです。すべての内容が正しい場合は、迅速な支援をいただきありがとうございます。