безопасно ли мне предположить, что если я посещу http://www.example.com https://www.example.com http://www.example.com:8080 веб-сервер ответит?
Нет, вы ничего не можете предположить.
Хотя 80 и 443 зарезервированы IANA для HTTP и HTTPS, ничто не запрещает никому запускать что-то еще на этих портах.
Также порты могут рассматриваться как открытые, но действующие как приманка на уровне ядра.
Или может быть процесс, действительно привязанный к нему, но по какой-то причине он не работает должным образом и, следовательно, вообще не отвечает.
Но даже если у вас есть полностью работающий веб-сервер, вы можете не получить ответы или не получить ожидаемый ответ.
Если вы получите www.example.com
решение 192.0.2.42
, веб-сервер на этом IP-адресе все еще должен быть специально настроен, чтобы знать об имени www.example.com
(или быть настроенным каким-либо подстановочным знаком, чтобы принимать любое имя). Если он не настроен, он не будет знать, какой контент отправлять обратно (может быть несколько веб-сайтов, размещенных на одном и том же IP-адресе), и может либо отправить контент одного из веб-сайтов, которыми он управляет (например, в Apache, первый объявленный в файлах конфигурации) или вернуть ошибку, например HTTP 400 или 500, чтобы сообщить клиенту, что имя неверно.
Это может легко произойти, потому что вы можете взять любой существующий веб-сайт, найти его IP-адрес, а затем в ЛЮБЫЕ зону, добавьте запись для ЛЮБЫЕ имя, указывающее на этот IP-адрес (или аналогично в системах Unix, поработайте с /и т.д./хосты
).
Конечно, веб-сервер с этим IP-адресом не сможет узнать, что означает это новое имя, и, следовательно, не ответит, как ожидалось.
например, может ли IP-адрес иметь открытый порт X, но для того, чтобы я мог получить к нему доступ через имя хоста, мне нужно перейти в домен: Y (где Y — это другой порт, чем X)
Эта часть не ясна. IP-адреса не имеют «портов». Возможно, вам потребуется задокументировать свою модель сети OSI 7 уровней или модель Интернета. Короче говоря, в основе у вас есть IPv4 и IPv6, а портов там нет, такого понятия просто не существует. Кроме того, у вас есть такие протоколы, как TCP и UDP, которые определяют порты. TCP-соединение представляет собой кортеж из 4 элементов: IP-адрес источника, порт источника, IP-адрес назначения, порт назначения.
Типа поверх TCP у вас есть TLS. Рукопожатие TLS обычно начинается с расширения «Индикация имени сервера» в сообщении ClientHello. Это расширение позволяет клиенту указать имя хоста хоста, к которому он пытается подключиться на этом уровне IP. Поскольку через DNS клиент сопоставляет имя хоста (например, извлеченное из URL-адреса в случае HTTPS) с IP-адресом, но затем, как объяснялось выше, этот IP-адрес может выполнять массовый виртуальный хостинг с несколькими именами, поэтому даже до отправки первого HTTP-сообщение, сервер TLS должен знать, для какого имени хоста он запрашивается (чтобы иметь возможность немедленно вернуть правильный сертификат, поскольку это происходит в начале рукопожатия TLS и, очевидно, до любого обмена HTTP), и это то, что клиент делает с помощью расширения SNI.
Но то, что вы описываете, может произойти в некоторых случаях проксирования и/или маскировки домена.