Доброго времени суток, уважаемые читатели. Сегодня тема статьи: "Доступ к сайту на NGINX только по доменному имени". Не для кого не секрет, что по умолчанию любой сайт в интернете, доступен по своему доменному имени, или по ip-адресу.

Возможные проблемы при открытом доступе к сайту по ip-адресу

Обычные пользователи для доступа к сайту используют доменное имя, а ip-адреса сайтов, зачастую используется злоумышленниками, при сканировании сетей на предмет открытых портов, и уязвимостей. Поэтому полезно настраивать доступ к сайту, только по доменному имени.

  • Из личного опыта могу привести пример того, как ip-адрес моего сайта был указан на постороннем DNS-сервере.
  • С какой целью и кем, мне не известно. Но в итоге, при вводе адреса постороннего сайта, браузер открывал главную страницу моего сайта, а в адресной строке было постороннее доменное имя. А при вводе адреса постороннего сайта с приставкой https, появлялось сообщение с предупреждением.
предупреждение о недопустимом имени сертификата
  • При просмотре сертификата выяснялось, что это сертификат моего сайта.
сведения о сертификате
  • Если проигнорировать сообщение и перейти на сайт, то также открывалась главная страница моего сайта, и в адресной строке указывалось постороннее доменное имя.

Это не была копия моего сайта, так как все ссылки в итоге вели на мой сайт, просто сайт стал доступен по постороннему доменному имени.

  • Какие в такой ситуации могут возникнуть проблемы, спросите Вы…
  • Давайте рассуждать логично. Если подобное сделано не по причине ошибки, то возможно есть злой умысел.
  • Например у постороннего доменного имени, может быть плохая репутация, и так как Ваш сайт будет каким-то образом позиционироваться с этим доменным именем, плохая репутация может отразиться и на Вашем сайте. А представьте ситуацию, что будет несколько подобных доменных имён с плохой репутацией, и все будут позиционироваться с Вашим сайтом…
  • И ещё момент... Как на подобную ситуацию отреагируют поисковики? Получаются какие-то непонятные редиректы…
  • Делайте выводы сами!

Запрет доступа к сайту по ip-адресу

  • Как можно запретить доступ к сайту по ip-адресу? Есть несколько способов, в частности создание сайта-заглушки…
  • Но я расскажу, о наипростейшем способе. Вам достаточно добавить несколько строчек в конфигурационный файл /etc/nginx/nginx.conf, либо в файл конфигурации самого сайта.
  • Если Вы будете добавлять код в файл /etc/nginx/nginx.conf, то нужно произвести добавление кода в секцию http, до строчки подключения файлов конфигураций сайтов.
  • В случае, если Вы будете добавлять код непосредственно в файл конфигурации сайта, то необходимо произвести добавление кода, выше всех других секций конфигурации.

Код должен быть добавлен таким образом, чтобы считывался сервером самым первым, из секций server { … }.

  • Принцип конфигурации заключается в том, что мы создаём настройку сервера по умолчанию, из которой будет следовать, что получая запросы не подходящие под имеющиеся настройки сайтов (в частности доменные имена), он будет реагировать соответствующим образом.
  • В моем примере NGINX будет сбрасывать соединения (ответ 444), Вы можете использовать другой ответ сервера, на своё усмотрение. Например 403, или 404

Запрет доступа по 80 порту

  • Если на сайте Вы не используете SSL сертификатов, и Ваш сайт доступен только по 80 порту, то достаточно добавить одну секцию.
server {    
listen 80 default_server;
server_name _;
return 444;
}
  • Не забудьте проверить конфигурацию, и перезапустить NGINX.
# nginx -t
# nginx -s reload
  • Если всё сделано правильно, то при попытке доступа к Вашему сайту по ip-адресу, в моём примере, ответ будет таким.
соединение сбрасывается сервером

Запрет доступа по 443 порту

  • Если Вы используете SSL сертификаты, и Ваш сайт доступен также по 443 порту, то нужно добавить секцию представленную выше, и вторую секцию специально для 443 порта.

Обратите внимание, я не стал указывать всех настроек SSL, на разных сайтах они могут отличаться. Вам нужно найти в своей конфигурации всё что связанно с SSL, то есть все строчки начинающиеся с ssl_ и вставить их после server_name _;


server {
    listen 443 ssl http2 default_server;
    server_name _;

    ssl_certificate		************************
    ssl_certificate_key		********************
    ssl ********************
    ssl ********************
    ssl ********************
	
    add_header Strict-Transport-Security 'max-age=31536000';
    return 444;
}

  • Коме того, обратите внимание на строчку:
add_header Strict-Transport-Security 'max-age=31536000';
  • У Вас может быть по другому, сделайте так, как настроено у Вас.
  • В итоге, нужно обязательно проверить конфигурацию.
# nginx -t

Если есть ошибки, нужно их найти и исправить, а если всё в порядке, то можно перезапустить сервер.

# nginx -s reload
  • Если всё сделано правильно, то при попытке доступа к Вашему сайту по ip-адресу, с использованием HTTPS, откроется окно с предупреждением как на первой картинке этой статьи, но при переходе, в моём примере, соединение будет сброшено сервером.
ошибка при установлении защищённого соединения

Как видите, ничего сложного, и времени потрачено всего ничего.

Сегодня мы рассмотрели тему: "Доступ к сайту на NGINX только по доменному имени". Научились закрывать доступ к сайту по ip-адресу. Смотрите также видео по теме.

Надеюсь статья была вам полезна. До встречи в новых статьях.

С уважением, Андрей Бондаренко.


Видео на тему "Доступ к сайту на NGINX только по доменному имени":