Проверка на порт казва „отворен“? Защо играчите на Minecraft все още не могат да се присъединят
Успешната TCP връзка доказва, че един сокет е приет от едно място. Влизането, допускането в света и пътят отвътре навън са отделни тестове.
Някой пуска проверка на порт, вижда думата отворен и смята сървъра за решен. Какво всъщност означава този резултат е тясно: от мястото на проверяващия, в онзи момент, е била приета TCP връзка към този адрес и порт. Той не казва нищо за ръкостискането на протокола Minecraft, удостоверяването на акаунта или дали сървърът е допуснал играча в свят.
Това са четири различни слоя и провал във всеки от тях дава от играча същото изречение: не се получи.
Една проверка тества само това, което вижда
TCP връзка се осъществява, когато двете страни завършат тристранното ръкостискане, което стои под всичко, което играта знае. Проверката съобщава, че е съществувал слушател и е отговорил от своето мрежово местоположение. Тя не може да ви каже, че слушателят е играта, защото всеки процес може да заеме порт и да приема връзки.
Местоположението е също толкова важно, колкото резултатът. Проверяващият в публичния интернет тества един път от една мрежа. Проверяващият, който операторът пуска отвътре в същата мрежа, тества съвсем друг път и положителният резултат там не казва почти нищо за това, което преживява отдалечен играч. Два различни проверяващи при двама различни доставчици дори могат да се разминават по причини, които нямат нищо общо с вашия сървър.
Времето също е от значение. Резултатът от проверката описва момента, в който е била изпълнена, а домашна връзка с динамичен адрес или променено правило за препращане може да премести истинския отговор няколко минути по-късно. Запишете публичния адрес, порта, семейството адреси и времето заедно с присъдата, иначе наблюдението не е възпроизводимо. Повторете проверката от наистина различна мрежа, а не от телефон на същата връзка.
Четири слоя между сокета и играча
Представете си последователността, която един присъединяващ се клиент всъщност изпълнява. Първо той разрешава адреса, после отваря TCP връзка към публикувания порт, после говори собствения протокол на играта, за да преговаря и удостовери, и накрая сървърът решава дали тази идентичност се допуска в света. Всеки слой има свой подпис на провал и само първият е видим за проверката на порт.
Портът по подразбиране за Java Edition е 25565, но операторът може да публикува различен външен порт и да го препрати навътре, така че числото, което играчът въвежда, не е непременно числото, което сървърът вижда. Проверка, насочена към грешния външен порт, съобщава затворен, докато сървърът е напълно здрав, и това е най-честата фалшива тревога в цялата тази област.
Имената добавят още една стъпка над порта. Ако играчът въведе име на хост, разрешаването трябва да върне публикувания адрес, а на машина вътре в мрежата то може да върне вместо това частен. Това не е провал на защитната стена и никакво препращане на портове няма да го промени.
Защо играчът отвътре поема различен път
Играч в същата локална мрежа или във VPN, който достига до нея, се опитва да достигне публичния адрес отвътре. Заявката отива към външния адрес на рутера и рутерът трябва да я преведе обратно навътре — това е схемата, обикновено наричана hairpinning или NAT отражение. И преводът напред, и обратният път трябва да съвпаднат, за да работи, а много потребителски рутери изобщо не го реализират.
Ето защо външният гост се присъединява, а човекът до сървъра не може. Външният път наистина е наред; вътрешната обиколка е това, което се проваля, и то изглежда на екрана на играча като проблем на сървъра. Собственият дневник на сървъра решава кое от двете се е случило, защото връзка, която никога не е била преведена, никога не стига до него.
Има две честни поправки и един лош навик. Добрите варианти са да позволите на вътрешните играчи да използват частния адрес или име на split-DNS, което се разрешава вътрешно до частния адрес, или да включите отражение на рутера, ако функцията съществува и работи. Лошият навик е да отваряте повече портове или да изключвате защитната стена на хоста, което не може да повлияе на превод, който рутерът никога не е извършвал.
Документацията на Netgate за NAT отражението описва по-подробно разликата между външно и вътрешно и алтернативата split-DNS. Четете я като описание на механизма, а не като обещание, че конкретен доставчик на VPN или рутер поддържа всеки вариант на loopback.
Събирайте доказателства от всяка гледна точка
За всеки тест запишете кой го е пуснал, откъде, по кое време, срещу кой адрес и порт и какво е записал сървърът. Отхвърляне от играта с ясна причина в конзолата на сървъра е различно откритие от връзка, която така и не е пристигнала, и двете водят в противоположни посоки.
Ако разрешени отдалечени играчи се присъединяват, а един местен играч не може, местният път е оставащият въпрос и заслужава собствено разследване: кой адрес е използвал клиентът, какво е направил рутерът с превода и дали сървърът е записал изобщо някакъв опит за връзка. Предайте тези три факта на този, който притежава мрежата, вместо да отваряте портове наслуки.