Я зробив стільки досліджень, наскільки я міг цього, не копаючи прямо у джерелі ядра. Здається, існує велика кількість дезінформації / неправильної інформації з цього питання, тому я сподіваюся, що це відповість на це питання для мене та інших раз і назавжди.
Строго кажучи, 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) для ефемерного порту.