Підключення до IP 0.0.0.0 успішно. Як? Чому?


41

Ми обслуговуємо порт на localhost і хочемо перевірити, чи інший порт доступний. Через помилку в нашому коді, він насправді намагається підключитися до IP 0.0.0.0:<port>, і чомусь це вдається - як доводить strace:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

Що це означає? Чому це працює?


Відповіді:


68

0.0.0.0 як цільова адреса по-різному відноситься до хоста, який не перекладається, або до цього хоста . На практиці підключення до 0,0.0,0 еквівалентно підключенню до localhost. (Строго кажучи, він недійсний як адреса призначення, лише як адреса джерела, але практика не відповідає теорії.)

Під час прив'язки "цей хост" розширюється до "будь-якої адреси на цьому хості" - тому програми зазвичай приймають з'єднання шляхом прив'язки до 0,0.0,0, що означає, що вони отримуватимуть пакети, адресовані до будь-якої IPv4 адреси в системі.


7
Щоб трохи розширити цю відповідь - це означає "будь-яку IP-адресу в цій системі, включаючи IP-адреси, додані після початку прослуховування"
Criggie

5
localhost - це одна адреса, в основному 127.0.0.1, тоді як 0.0.0.0 означає всі адреси цього хоста.
rexkogitans

@rexkogitans localhost - це не одна адреса, а будь-яка адреса в діапазоні 127.0.0.0/8 - тобто будь-яка адреса від 127.0.0.0 до 127.255.255.255
Dezza

6
@Dezza Ні, localhost - 127.0.0.1. 127.0.0.0/8 (як ви кажете, він же 127.0.0.0 до 127.255.255.255) є зворотним зв'язком з більшістю обладнання, наприклад, задокументованим RFC 5735, сторінка 4 . (Цікаво, що деяке обладнання Cisco може призначити зворотний зв'язок будь-якій адресі, але за замовчуванням взагалі не підтримує зворотний зв'язок. Не те, що це може вплинути на інше обладнання в мережі.) Однак localhost - це ім'я, як правило, вказує лише на одну адреса, що становить 127.0.0.1, і зазвичай реалізується за допомогою файлу "хостів". Тож я не згоден з вашою спробою виправлення.
TOOGAM

Чи можете ви уточнити, що ви маєте на увазі під "недійсним як адресою призначення, лише як адресою джерела"? Коли сервер mysql прослуховує номер 0.0.0.0, це адреса призначення чи джерело? Чи це не адресат запиту, надісланого від клієнта mysql?
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.