カーネルソースをすぐに掘り下げることなく、できる限り多くの調査を行いました。この件に関しては大量の偽情報/不正確な情報があるようですので、これが私や他の人の質問に答えてくれることを願っています。
厳密に言えばIPv4と言えば、ポートの枯渇は実際に可能ですか?説明させてください:
そしてこれが問題です:これはどのように機能するのですか?
最後に、(発信)一時ポートと待機している着信ポートについて少し混乱しています。接続が確立されると、接続の両側がピアであり、同等であることがわかりますが、それが発生する前に:
たとえば、実際に(srcip、srcport、dstip、dstport)タプルが一意である必要がある場合、なぜ有効にすると次のようになります。
net.ipv4.ip_local_port_range = 1024 65535
これにより、1024〜65535のエフェメラルポートを使用できるようになります。ポート3306(mySQLなど)にバインドするサービスがある場合、ポートが使用中であるために、サービスの開始に失敗することがあります。
これは次の事実に関連していますか?(そしてこれは私が検証されることを求めている声明です):
上記の動作を確認できます。つまり、上記の正確なsysctl行を使用します。そのため、OSがそのポートを使用していると想定しているため、まれに再起動に失敗するため、mySQLを1024未満のポートに移動しました(3306)一時的なポートの場合。
ここで2つの主な質問があります。
厳密に言えばIPv4と言えば、ポートの枯渇は実際に可能ですか?
はい。たとえば、負荷分散ルーターがすべての接続をNAT IPアドレスに送信しているとします。これは、多数のSRC IP
s単一のボトルネックに接続DST IP
。
これは、Webサーバーが次のような接続を多数持つ可能性があることを意味します。
root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 173.200.1.18:80 10.100.1.100:49923 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.200.1.200:10155 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:14400 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:50652 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.20.1.20:57554 ESTABLISHED 13939/nginx: worker
そしてそれは完全に大丈夫です。ただし、すべての「外部アドレス」が同じである場合、これにより問題が発生する可能性があります(たとえば、「NAT <---> 1つのIPアドレスでサーバーを実行する大きなルーター)」。
一時的なポートの枯渇が一般的な問題ではない理由を仮定する必要がある場合は、すべてのポートが応答するためのリッスンサービスと十分なリソースを必要とするためだとお勧めします。通常、最初に別のリソース(メモリ、CPU)がボトルネックになります。
ただし、負荷分散会社で働いているときに、個人的にいくつかのポートの枯渇問題に遭遇しました。
「1024-65535のエフェメラルポートの使用を許可します。ポート3306(mySQLなど)にバインドするサービスがある場合、ポートが使用中であるために、サービスの開始に失敗することがあります。」
MySQLサーバーは、使用中の場合、そのポートにバインドできません。たとえば、localhost:3306またはすべてのインターフェースでバインドできます。たとえば、次のnetstat
出力の0.0.0.0:80行を参照してください。
root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 964/php-fpm.conf)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1660/mysqld
tcp 0 0 0.0.0.0:842 0.0.0.0:* LISTEN 1317/inetd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13938/nginx
つまり、ポート80はサーバーに対してローカルなallインターフェースで待機しています。 nginx
サーバーが起動する前に別のプロセスがポート80を保持している場合、nginx
はそのポートを制御できず、起動手順が失敗する可能性があります。
通常、ポート3306は問題ありません。これは、リスニングサービスに、ホストマシンから要求される事前定義されたポート(または範囲)があるためです。 Webサーバー用のポート80および443。
127.0.0.1:(x)から127.0.0.1:80への65k接続が可能127.0.0.1:(x)から127.0.0.1:555への65k接続が可能
a:はい、ローカルポートが1〜65535の場合、接続数は65k-1(1つのポートがリッスン)
基本的にもう一度、質問は(srcip、srcport、dstip、dstport)は一意である必要がありますか? a:はい
IP "A"からIP "B"、ポート "N"への65kを超える接続を開くことができませんでした。同様に、単一のIPでxxxx:80のWebサーバーへの65kを超える接続を開くことはできませんでしたが、さらに多くの接続をサポートできました。異なるソースIPからのものである限り、全体で65kよりも大きいですか?
a:srcip、srcport、dstip、dstportが一意であるため、単一のIPでx.x.x.x:80にある私のWebサーバーへの65kを超える接続を開くことができませんでした。はい、ソースIPが異なる場合、65k以上をサポートできます