Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: nginx запрет доступа по ip через https  (Прочитано 2062 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн eNdiD

  • Автор темы
  • Участник
  • *
  • Сообщений: 188
    • Просмотр профиля
nginx запрет доступа по ip через https
« : 10 Октябрь 2016, 13:26:02 »
Н.У.:
VPS с Ubuntu 14.04. На нем крутится несколько сайтов. В качестве фронт-сервера выступает nginx.
Задача: запретить обработку запросов по IP, без имени домена. Чтобы сервер обрабатывал только домены. Т.е. чтобы при в вбивании в адресной строке браузера IP сервера ничего не происходило.
Для обычного http я сделал пустышку
server {
    listen      80 default_server;
    server_name "";
    return      444;
}
И все было хорошо, если вбить IP - запрос отклоняется. Но потом я начал переводить сайты на https. И тут возникла проблема. Если запрос http://xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx - IP сервера) отклоняется, как и положено, то запрос вида https://xxx.xxx.xxx.xxx ведет на первый подходящий сайт с https в конфигах nginx. Я пробовал добавить еще такой конфиг:
server {
    listen      443 default_server;
    server_name "";
    return      444;
}
Чтобы блокировать запрос к IP и по https, но в итоге это блокирует работу всех сайтов с https. То есть, nginx почему-то вместо нужного конфига сайта, берет во всех случаях конфиг пустышки.
Есть идеи, что я делаю не так?
Вот типичный конфиг сайтов:
server {
        listen                          443 ssl;
        ssl_certificate                 /etc/letsencrypt/live/site.domain/fullchain.pem;
        ssl_certificate_key             /etc/letsencrypt/live/site.domain/privkey.pem;
        server_name                     site.domain;

        client_max_body_size            50m;

        access_log                      /var/log/nginx/site.domain_access.log;
        error_log                       /var/log/nginx/site.domain_error.log;

        gzip                            on;
        gzip_comp_level                 5;
        gzip_disable                    "msie6";
        gzip_proxied                    any;
        gzip_types                      text/plain text/css text/javascript application/x-javascript text/xml application/xml application/json;

        location /static/ {
                root                    /home/username/www/mysite/src/mysite;
                expires                 1d;
                access_log              off;
        }

        location /media/ {
                root                    /home/username/www/mysite/src/mysite;
                expires                 1d;
                access_log              off;
        }

        location / {
                include                 uwsgi_params;
                uwsgi_pass              unix:/home/username/www/mysite/src/mysite/mysite.sock;
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Host $server_name;
                uwsgi_cache             uwsgi;
                uwsgi_cache_valid       200 1h;
        }

        location /.well-known/ {
                alias /opt/certbot/site.domain/.well-known/;
        }
}

server {
        listen                          80;
        server_name                     site.domain;
        return                          301 https://site.domain$request_uri;
}

server {
        listen                          80;
        server_name                     www.site.domain;
        return                          301 https://site.domain$request_uri;
}

server {
        listen                          443;
        server_name                     www.site.domain;
        return                          301 https://site.domain$request_uri;
}
« Последнее редактирование: 10 Октябрь 2016, 13:36:02 от eNdiD »

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #1 : 10 Октябрь 2016, 17:50:41 »
eNdiD, в сертификате указан IP?

Оффлайн eNdiD

  • Автор темы
  • Участник
  • *
  • Сообщений: 188
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #2 : 10 Октябрь 2016, 17:54:05 »
unimix, нет, не указан. сертификат выдавался на домен, а не ip адрес.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #3 : 10 Октябрь 2016, 18:18:10 »
http://nginx.org/ru/docs/http/configuring_https_servers.html#name_based_https_servers

Первый сервер (по умолчанию)
server {
        listen                          443 ssl default_server;
        server_name                     _;
        ssl_certificate                 /etc/letsencrypt/live/site.domain/fullchain.pem;
        ssl_certificate_key             /etc/letsencrypt/live/site.domain/privkey.pem;

        return                          301 https://site.domain$request_uri;
}

Хотя, вместо указания сертификата напрямую, есть такая строка:
include snippets/snakeoil.conf;
« Последнее редактирование: 10 Октябрь 2016, 18:22:23 от unimix »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26086
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #4 : 10 Октябрь 2016, 18:57:34 »
робовал добавить еще такой конфиг:
server {
    listen      443 default_server;
А ssl где?

Цитировать
    server_name "";
Примерно так же бесполезна, как "server_name _".
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн eNdiD

  • Автор темы
  • Участник
  • *
  • Сообщений: 188
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #5 : 10 Октябрь 2016, 21:46:24 »
unimix,
Спасибо, указал самоподписный сертификат сервера и перестали ломаться остальные сайты. Но все равно продолжает пускать по айпишнику на первый попавшийся сайт с https.
А ssl где?
Мне нужно просто обрубать соединение на порту 443, а не общаться с клиентом по ssl. В любом случае, наличие, или отсутствие указания протокола ssl на 443 никак не влияет на получившийся результат.
Примерно так же бесполезна, как "server_name _".
да, я знаю, что по-дефолту имя сервера пустое и так. вставил лишь для полноты конфига.

Дефолтный конфиг на текущий момент:
server {
        listen 80 default_server;
        server_name "";
        return 444;
}

server {
        listen 443 ssl default_server;
        server_name                     "";
        ssl_certificate                 /etc/ssl/certs/ssl-cert-snakeoil.pem;
        ssl_certificate_key             /etc/ssl/private/ssl-cert-snakeoil.key;

        return                          444;
}
Собственно, смысл всего этого в том, чтобы обрубать такие запросы на стороне фронт-сервера и не пускать в бэк. Потому что бэк работает только при правильном домене в запросе, и на проходящие запросы по IP возвращает 400, с полным логом на email почту. Что засоряет эфир и усложняет отсеивание реальных багов. А боты стучатся по несколько раз в день.
« Последнее редактирование: 10 Октябрь 2016, 22:00:12 от eNdiD »

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #6 : 11 Октябрь 2016, 10:36:50 »
unimix,
Но все равно продолжает пускать по айпишнику на первый попавшийся сайт с https.

Так если хост не указан или не найден, то должен выбираться виртуальный сервер по умолчанию.

Мне нужно просто обрубать соединение на порту 443, а не общаться с клиентом по ssl.

Для этого есть iptables, где блокируются все пакеты на 443 порт.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26086
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #7 : 11 Октябрь 2016, 12:27:01 »
На какой именно "первый попавшийся" пускает? Показывайте nginx -T
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн eNdiD

  • Автор темы
  • Участник
  • *
  • Сообщений: 188
    • Просмотр профиля
Re: nginx запрет доступа по ip через https
« Ответ #8 : 11 Октябрь 2016, 16:22:52 »
На какой именно "первый попавшийся" пускает?
На первый сайт в алфавитном порядке с https в списке конфигов. nginx -t:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Для этого есть iptables, где блокируются все пакеты на 443 порт.
Так мне не нужно полностью блокировать 443. Мне нужно заблокировать только запросы без указанного хоста

Так если хост не указан или не найден, то должен выбираться виртуальный сервер по умолчанию.
Вот и я так думал. Для http так и происходит. Выбирается дефолтный конфиг, который посылает пустой ответ и закрывает соединение. Для https это почему-то не работает. То-ли я дурак, то-ли лыжи не то (скорее первое)

UPD. Отбой, все-таки я дурак. Все работает. Дело было в только отсутствии сертификатов в дефолтном конфиге. После добавления самоподписанных проблема исчезла. А я что-то намудрил. Спасибо за помощь!
« Последнее редактирование: 11 Октябрь 2016, 16:40:32 от eNdiD »

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26086
    • Просмотр профиля
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.058 секунд. Запросов: 25.