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


10

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

厳密に言えば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)は一意である必要がありますか?
  • 私は以上の65000個の接続開くことができませんでしたから IPへのIP「A」「B」、ポート「N」を
  • 同様に、単一のIPはxxxx:80で私のWebサーバーへの65kを超える接続を開くことができませんでしたが、異なるソースIPからのものである限り、全体で65kを超える接続をサポートできますか?

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

たとえば、実際に(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)一時的なポートの場合。


回答を詳細に更新しました。どんな質問ででも答えてください。
89c3b1b8-b1ae-11e6-b842-48d705 2013

回答:


8

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

1。

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

はい。たとえば、負荷分散ルーターがすべての接続をNAT IPアドレスに送信しているとします。これはSRC IP、1つののボトルネックに多数のが接続している場合に発生する可能性があります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 

そしてそれは完全に大丈夫です。ただし、すべての「外部アドレス」が同じである場合、これにより問題が発生する可能性があります(たとえば、「1つのIPアドレスでNAT <--->サーバーを実行する大きなルーター」)。

一時的なポートの枯渇が一般的な問題ではない理由を仮定する必要がある場合は、すべてのポートが応答するためのリッスンサービスと十分なリソースを必要とするためだとお勧めします。通常、最初に別のリソース(メモリ、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はサーバーに対してローカルなすべてのインターフェースをリッスンしています。nginxサーバーが起動する前に別のプロセスがポート80を保持している場合nginx、そのポートを制御できず、起動手順が失敗する可能性があります。

通常、ポート3306は問題ありません。これは、リスニングサービスが、ホストマシンから要求される定義済みのポート(または範囲)を持っているためです(Webサーバーの場合はポート80と443など)。


0

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でxxxx:80のWebサーバーへの接続を65k以上開くことができませんでした。はい、ソースIPが異なる場合、65kよりはるかに多くサポートできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.