Linux вичерпання мережевих портів


10

Я зробив стільки досліджень, наскільки я міг цього, не копаючи прямо у джерелі ядра. Здається, існує велика кількість дезінформації / неправильної інформації з цього питання, тому я сподіваюся, що це відповість на це питання для мене та інших раз і назавжди.

Строго кажучи, IPv4, чи реально можливе виснаження портів? Дозволь пояснити:

  • Здається, для використання доступні 65535 портів. 0 недоступний.
  • Я читав, що виснаження портів вимагає, щоб кортеж (src ip, src port, dst ip, dst port) кортеж був унікальним.
  • Щоб бути зрозумілим і припустити, що я можу використовувати 100% ефемерних портів через налаштування sysctl net.ipv4.ip_local_port_range

І це питання: чи так це працює?

  • Я міг би мати 65k з'єднань від 127.0.0.1:(x) до 127.0.0.1:80
  • Я міг би мати 65k підключень від 127.0.0.1:(x) до 127.0.0.1.1
  • В основному ще раз, питання (srcip, srcport, dstip, dstport) має бути унікальним, правильним?
  • Я не міг відкрити більше 65 к з’єднань від ip "A" до IP "B", порту "N"
  • Крім того, один IP не міг відкрити більше 65k підключень до мого веб-сервера на xxxx: 80, однак я міг би підтримувати набагато більше 65 кб, якщо вони з різних джерел IP-адрес ?

Нарешті, я трохи розгублений щодо (вихідних) ефемерних портів та вхідних портів, які слухають. Я розумію, як тільки з'єднання встановлено, кожна сторона з'єднання є рівною і рівною, але до цього трапляється:

Наприклад, якщо дійсно (srcip, srcport, dstip, dstport) кортеж повинен бути унікальним, чому це, якщо я вмикаю, наприклад

net.ipv4.ip_local_port_range = 1024 65535

Що дозволяє використовувати ефемерні порти 1024-65535, що якщо у мене є сервіси, що пов'язують порт 3306 (наприклад, mySQL), вони інколи не запускатимуться, оскільки порт використовується.

Чи пов’язано це з тим, що: (І це прохання я прошу підтвердити):

  • (srcip, srcport, dstip, dstport) необхідні, щоб бути унікальним для кожного з'єднання з діапазоном портів 1-65535 (не звертаючи уваги на використання ОС ефемерними портами)
  • Однак, щоб сокет прив’язувався, він може розглядатися як (srcip, srcport, *, *). Або інший спосіб сказати це: чи IP-адреса не повинна використовувати цей порт з будь-якої причини для прив’язки?

Я можу перевірити вищезгадану поведінку, тобто я використовую точну лінію sysctl вище, і через це я перемістив mySQL на порт нижче 1024, тому що час від часу і дуже випадково не вдасться перезапустити, якщо припустити, що ОС використовує цей порт (3306) для ефемерного порту.


Я оновив свою відповідь додатковою інформацією. Не соромтеся відповісти на будь-яке запитання.
89c3b1b8-b1ae-11e6-b842-48d705

Відповіді:


8

Тут у вас є два основних питання:

1.

Строго кажучи, IPv4, чи реально можливе виснаження портів?

Так. Візьмемо, наприклад, маршрутизатор балансування навантаження, що надсилає всі з'єднання на NAT IP-адресу. Це, ймовірно, станеться, коли у вас є багато SRC IPпідключень до вузького місця DST IP.

Це означає, що ваш веб-сервер може мати купу з’єднань, таких як:

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 <---> з однією IP-адресою").

Якби мені довелося постулювати, чому вичерпання ефемерних портів не є поширеною проблемою, я б припустив, що тому, що кожен порт вимагає послуги прослуховування і достатньо ресурсів для відповіді - інший ресурс (пам'ять, процесор) зазвичай є першим вузьким місцем.

Однак я особисто стикався з декількома проблемами, пов'язаними з виснаженням порту, працюючи в компанії з балансування навантажень.

2. Чому використаний порт може поставити проблему для служби прослуховування?

"Що дозволяє використовувати ефемерні порти від 1024-65535, що якщо у мене є сервіси, що пов'язують порт 3306 (наприклад, mySQL), вони іноді не вдасться запуститись, оскільки порт використовується."

Сервер mySQL не може прив'язуватися до цього порту, якщо він використовується - скажімо localhost: 3306 або на всіх інтерфейсах. Наприклад, див. Рядок 0,0.0.0:80 у наступному netstatвисновку?

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 прослуховує всі інтерфейси, локальні для сервера. Якщо інший процес містить порт 80 до nginxзапуску мого сервера, nginxвін не зможе взяти під контроль цей порт і, ймовірно, не вдасться до його процедури запуску.

Зазвичай порт 3306 добре, оскільки служби прослуховування мають заздалегідь визначені порти (або діапазони), які запитуються від хост-машини - наприклад, порт 80 та 443 для веб-серверів.


0

Я міг би мати 65k з'єднань від 127.0.0.1:(x) до 127.0.0.1:80 Я міг би мати 65k з'єднань від 127.0.0.1:(x) до 127.0.0.1.158

a: так, якщо ваш локальний порт становить 1-65535, кількість з'єднань становить 65k-1 (один порт прослуховується)

В основному ще раз, питання (srcip, srcport, dstip, dstport) має бути унікальним, правильним? а: так

Я не міг відкрити більше 65k з'єднань від ip "A" до IP "B", порту "N" Так само, один IP не міг відкрити більше 65k підключень до мого веб-сервера на xxxx: 80, проте я міг би підтримати набагато більше ніж 65 к. в цілому, якщо вони з різних джерел IP?

a: Один IP не міг відкрити більше 65 к підключень до мого веб-сервера на xxxx: 80, тому що srcip, srcport, dstip, dstport є унікальним. так, ви могли б підтримати набагато більше, ніж 65 к, якщо сорб ip відрізняється

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.