web-dev-qa-db-ja.com

DebianStretchソースのtcpポートは*常に*偶数です

Azureロードバランサーで奇妙な動作をデバッグしているときに、ローカルのDebian Stretch TCPスタックが偶数番号のポートとのTCP接続を確立するだけでした。奇数の送信元ポートで単一のTCPハンドシェイクを開始しません。それは意図されていますか?

9
Olivier Dauby

connect()bind()の間の競合を減らすためです(Linux 4.2で表示され、Jessieには3.16、Stretchには4.9があります)。

コミット 7f4c90062f8fc7c8c26f8f95324cbe8fa3145a5  
著者:エリックドゥマゼット
日付:日5月24日14:49:35 2015 -0700 
 
 tcp/dccp:connect()
 
でip_local_port_rangeを使い切らないようにしてください。使用中のサーバーでの長期にわたる問題は、使用可能な小さなTCPポート
範囲(/ proc/sys/net/ipv4/ip_local_port_range)およびデフォルト
 connect()システム呼び出しでの送信元ポートの順次割り当て。
 
ホストに多数のアクティブなTCPセッション、可能性が非常に高い
すべてのポートが少なくとも1つのフローで使用されている
とその後のbind(0)試行が失敗する、または[の大部分をスキャンする必要がある____。]スペースを見つけてスロットを見つけます。
 
このパッチでは、__ inet_hash_connect()
の開始点を変更して、[1]ポートでさえ優先して、 bind()
ユーザー用の奇数ポート。
 
引き続き順次検索を実行するため、保証はありません。しかし
 connect()ターゲットが大きく異なる場合、最終的には、bind()に使用できるポートを
より多く残し、それらを範囲全体に分散させます。
スロットを見つけるためにconnect()とbind()の両方。
 
この戦略は、/ proc/sys/net/ipv4/ip_local_port_range 
が偶数の場合、つまりstart/end値のパリティが異なります。
 
したがって、デフォルトの/ proc/sys/net/ipv4/ip_local_port_rangeは
 32768-60999(32768-61000ではなく)[に変更されました。 ____。] 
ここではセキュリティの側面に変更はありません。この変更によって最終的に影響を受ける可能性があるのは、一部の不十分なハッシュ
スキームのみです。
 
 [1]:奇数/偶数プロパティは、ip_local_port_rangeの値に依存します。パリティ

フォローアップ commit 1580ab63fc9a03593072cc5656167a75c4f1d17 もご覧ください。

12
Ferenc Wágner