@Aleha29
Программист

Как запретить доступ в NGINX ко всем несуществующим доменам третьего уровня у сайта по SSL (443 порт)?

Приветствую всех.
Вначале скажу, что мануал почитал, в поисковиках решение искал, на рабочем проекте наэкспериментировался, но сделать что требовалось не смог, поэтому прошу помощи у сообщества.

Итак, задача вроде как банальная, запретить доступ в NGINX ко всем несуществующим доменам третьего уровня у сайта site2.ru по SSL (по 80 порту запрет есть в данный момент). Т.е. сейчас браузер по несуществующему имени, например, t.site2.ru ничего не показывает, т.к. ssl-сертификат действителен только для основного домена, но поисковик при этом получает содержание site2.ru, а должен получать 403-код ответа.

В Итернет абсолютное большинство решений для 80 порта, но вроде как с 443 тоже самое, в итоге решение сводится к следующему, необходимо в конфигурационный файл NGINX добавить запись:

server {
listen 443 default_server;
server_name _;
access_log /dev/null;
error_log /dev/null;
return 403;
}


Но если таковую добавить у меня перестает открываться и основной домен (в примере ниже это site2.ru)!

В итоге мой файл выглядит в сокращенном виде следующим образом:

http {

server {
listen 80 default;
server_name site1.ru www.site1.ru;
error_log /dev/null;
access_log /dev/null;
return 444;
}

server {
listen 80;
server_name site2.ru www.site2.ru;
return 301 https://$host$request_uri;
}

############## если добавить, что советуют в Интернет ##############

server {
listen 443 default_server;
server_name _;
access_log /dev/null;
error_log /dev/null;
return 403;
}

########################################################

server {
listen 443 ssl http2;
server_name site2.ru www.site2.ru;
...
}

}


Как же решить задачу и запретить доступ в NGINX ко всем несуществующим доменам третьего уровня у сайта site2.ru по SSL (443 порт)?
  • Вопрос задан
  • 3074 просмотра
Решения вопроса 1
castomi
@castomi
Серверный администратор - tickets.settin.ru
Всё достаточно банально.
https://nginx.ru/ru/docs/http/request_processing.html
Вот тут расписано как Nginx обрабатывает запросы. Теперь тут сразу понятно на чём Вы встряли, ведь если не сконфигурированный поддомен обращается по порту 80, тут достаточно просто, можно сконфигурировать дефолтный виртуальный хост и в нём к примеру редиректить на основной или запрещать доступ, да вообщем-то как угодно. Но если обращение идёт по 443 по ssl, значит чтобы соединение состоялось нужен сертификат, которого для каждого не существующего поддомена у Вас нет. Выходов из положения несколько.
1. Вот в эту конфигурацию добавить настройку с с самоподписным сертификатом, минусом будет то что если перейдёт человек он увидит что сайт не безопасен и бог знает что может подумать про основной домен) Вдруг он не достаточно образован чтобы понимать почему ему показывается это сообщение и примет Вас за мошенника.
server {
listen 443 default_server;
server_name _;
access_log /dev/null;
error_log /dev/null;
return 403;
}

Вопрос, на кой отправлять логи в нули??? Не проще их выключить, что за дикость)

2. Купить сертификат который сразу защищает и сам домен и все его поддомены и прикрутить его туда, в этом случае всё будет так же гладко как и в случае с портом 80, если конечно кто-то не надумает ломиться на домены третьего уровня)))

3. В DNS направить на сервер только те домены и поддомены которые реально есть, в этом случае всем остальным будет показываться вот это.59d221dc7703c988268112.png

Читайте больше документации)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
Если https-запрос уже пришел на сервер, то сервер должен иметь валидный сертификат, иначе в браузере будет выведено предупреждение о невалидном сертификате.

Вариант 1: забить на невалидность сертификата, все равно отдавать 403.

Вариант 2: получить wildcard-сертификат *.site2.ru

Вариант 3: в NS-записях домена явно прописать все поддомены. На несуществующий поддомен браузер даже не будет отправлять запрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы