web-dev-qa-db-ja.com

Linuxネットワークポートの枯渇

カーネルソースをすぐに掘り下げることなく、できる限り多くの調査を行いました。この件に関しては大量の偽情報/不正確な情報があるようですので、これが私や他の人の質問に答えてくれることを願っています。

厳密に言えばIPv4と言えば、ポートの枯渇は実際に可能ですか?説明させてください:

  • 使用可能な65535のポートがあるようです。 0は使用できません。
  • ポートの枯渇には(src ip、src port、dst ip、dst port)タプルが一意である必要があることを読みました。
  • 明確にするために、sysctl net.ipv4.ip_local_port_range設定を介してエフェメラルポートを100%使用できると仮定します。

そしてこれが問題です:これはどのように機能するのですか?

  • 127.0.0.1:(x)から127.0.0.1:80まで65kの接続が可能
  • 127.0.0.1:(x)から127.0.0.1:555への65k接続が可能です
  • 基本的にもう一度、質問は(srcip、srcport、dstip、dstport)は一意である必要がありますか?
  • 65k以上の接続を開くことができませんでしたfromip "A"からIP "B"、ポート "N"
  • 同様に、単一のIPは、xxxx:80で私のWebサーバーへの65kを超える接続を開くことができませんでしたが、異なるソースIP

最後に、(発信)一時ポートと待機している着信ポートについて少し混乱しています。接続が確立されると、接続の両側がピアであり、同等であることがわかりますが、それが発生する前に:

たとえば、実際に(srcip、srcport、dstip、dstport)タプルが一意である必要がある場合、なぜ有効にすると次のようになります。

net.ipv4.ip_local_port_range = 1024 65535

これにより、1024〜65535のエフェメラルポートを使用できるようになります。ポート3306(mySQLなど)にバインドするサービスがある場合、ポートが使用中であるために、サービスの開始に失敗することがあります。

これは次の事実に関連していますか?(そしてこれは私が検証されることを求めている声明です):

  • (srcip、srcport、dstip、dstport)は、ポート範囲が1〜65535の接続ごとに一意である必要があります(OSの一時ポートの使用に注意を払っていません)
  • ただし、バインドするソケットの場合、(srcip、srcport、*、*)と見なすことができます。または、これを別の言い方をすると、バインドするために、何らかの理由でIPがそのポートを使用してはなりませんか?

上記の動作を確認できます。つまり、上記の正確なsysctl行を使用します。そのため、OSがそのポートを使用していると想定しているため、まれに再起動に失敗するため、mySQLを1024未満のポートに移動しました(3306)一時的なポートの場合。

10
A.B. Carroll

ここで2つの主な質問があります。

1。

厳密に言えばIPv4と言えば、ポートの枯渇は実際に可能ですか?

はい。たとえば、負荷分散ルーターがすべての接続をNAT IPアドレスに送信しているとします。これは、多数のSRC IPs単一のボトルネックに接続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)がボトルネックになります。

ただし、負荷分散会社で働いているときに、個人的にいくつかのポートの枯渇問題に遭遇しました。

2.使用されているポートがリスニングサービスに問題を引き起こすのはなぜですか?

「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以上を​​サポートできます

0
wow qing