За последние 24 часа нас посетили 16866 программистов и 1292 робота. Сейчас ищут 1424 программиста ...

Nginx пропускает на неуказанный порт в виртуальном сервере

Тема в разделе "Настройка веб-сервера", создана пользователем eldor, 8 апр 2018.

  1. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Есть основной сайт и админка к нему.
    Вот конфиг сайта:
    Код (Text):
    1.  
    2. # Для перенаправления с 80 порта на 443 (или с http на https)
    3. server {
    4.         listen 80 default_server;
    5.         server_name site.ru www.site.ru;
    6.         return 301 https://site.ru$request_uri;
    7. }
    8.  
    9. server {
    10.         listen 443 ssl http2 default_server;
    11.         root /var/www/site;
    12.         index index.html index.php index.htm;
    13.         server_name site.ru www.site.ru;
    14.  
    15.         # Картинки и прочее отдаёт Nginx
    16.         location ~* ^(?!/phpmyadmin/).+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|b)$ {
    17.                 access_log off;
    18.                 expires 30d;
    19.         }
    20.  
    21.         # запрет на доступ к .htaccess
    22.         location ~ /\.ht {
    23.                 deny all;
    24.         }
    25.  
    26.         # Если есть ошибка 404, то выводим свою страницу данной ошибки.
    27.         error_page 404 /er_404.php;
    28.  
    29.         # передача запроса апачу
    30.         location / {
    31.                 proxy_pass http://127.0.0.1:81/; # Порт на котором висит Apache
    32.                 proxy_set_header X-Real-IP $remote_addr;
    33.                 proxy_set_header X-Forwarded-for $remote_addr;
    34.                 proxy_set_header Host $host;
    35.                 proxy_connect_timeout 300;
    36.                 proxy_send_timeout 300;
    37.                 proxy_read_timeout 300;
    38.                 proxy_redirect off;
    39.                 proxy_set_header Connection close;
    40.                 proxy_pass_header Content-Type;
    41.                 proxy_pass_header Content-Disposition;
    42.                 proxy_pass_header Content-Length;
    43.         }
    44.  
    45.         ssl_certificate                 /etc/letsencrypt/live/site.ru/fullchain.pem;
    46.         ssl_certificate_key             /etc/letsencrypt/live/site.ru/privkey.pem;
    47.         ssl_stapling                    on;
    48.         ssl_stapling_verify             on;
    49.         ssl_trusted_certificate /etc/letsencrypt/live/site.ru/chain.pem;
    50.         ssl_dhparam                     /etc/letsencrypt/live/site.ru/dhparams.pem;
    51.         ssl_session_cache   shared:SSL:10m;
    52.         ssl_session_timeout 10m;
    53.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    54.         ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDH';
    55. }
    Вот конфиг админки:
    Код (Text):
    1.  
    2. # Для перенаправления с 82 порта на 444 (или с http на https)
    3. server {
    4.         #Доступ только локальный.
    5.         listen 82;
    6.         server_name adm.site.ru;
    7.         return 301 https://adm.site.ru$request_uri;
    8. }
    9.  
    10. server {
    11.         listen 443 ssl http2;
    12.         root /var/www/adm_site;
    13.         index index.html index.php index.htm;
    14.         server_name adm.site.ru;
    15.  
    16.         # запрет на доступ к .htaccess
    17.         location ~ /\.ht {
    18.                 deny all;
    19.         }
    20.  
    21.         # Если есть ошибка 404, то выводим свою страницу данной ошибки.
    22.         error_page 404 /er_404.php;
    23.  
    24.         # передача запроса апачу
    25.         location / {
    26.                 proxy_pass http://127.0.0.1:81/; # Порт на котором висит Apache
    27.                 proxy_set_header X-Real-IP $remote_addr;
    28.                 proxy_set_header X-Forwarded-for $remote_addr;
    29.                 proxy_set_header Host $host;
    30.                 proxy_connect_timeout 300;
    31.                 proxy_send_timeout 300;
    32.                 proxy_read_timeout 300;
    33.                 proxy_redirect off;
    34.                 proxy_set_header Connection close;
    35.                 proxy_pass_header Content-Type;
    36.                 proxy_pass_header Content-Disposition;
    37.                 proxy_pass_header Content-Length;
    38.         }
    39.  
    40.         ssl_certificate                 /etc/letsencrypt/live/site.ru/fullchain.pem;
    41.         ssl_certificate_key             /etc/letsencrypt/live/site.ru/privkey.pem;
    42.         ssl_stapling                    on;
    43.         ssl_stapling_verify             on;
    44.         ssl_trusted_certificate /etc/letsencrypt/live/site.ru/chain.pem;
    45.         ssl_dhparam                     /etc/letsencrypt/live/site.ru/dhparams.pem;
    46.  
    47.         ssl_session_cache   shared:SSL:10m;
    48.         ssl_session_timeout 10m;
    49.  
    50.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    51.         ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDH';
    52. }
    Доступ к админке открываю разрешенным IP-адресам с помощью iptables только по портам 82 и 444.
    В админку захожу след. образом: adm.site.ru:82 или adm.site.ru:444.
    Но если пройти по adm.site.ru, то админка открывается, т.е. вход выполняется по 80 и 443 портам (обходится ограничения по ip для 82 и 444 портов).
    Я пробовал уже и так - не помогает:

    Код (Text):
    1.  
    2. server {
    3.        ...
    4.         server_name adm.site.ru:82;
    5.         return 301 https://adm.site.ru:82$request_uri;
    6. }
    7. server {
    8. ...
    9.         server_name adm.site.ru:444;
    Подскажите, пожалуйста, почему Nginx всетаки пропускает админку по стандартным портам (80 и 443), если в виртуальном сервере админки указаны явные порты 82 и 444?
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Может он ее просто не трогает? Apache?
     
  3. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Если пройти по adm.site.ru, то попадаешь с любого ip-адреса. А если с adm.site.ru:444, то только по разрешенным в iptables IP-адресам.
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    service nginx restart?
     
  5. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Пару десятков раз - точно)) А так же и apache2 до кучи) После каждого изменения в конфигах рестарт делаю.
     
  6. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    How to prevent processing requests with undefined server names

    If requests without the “Host” header field should not be allowed, a server that just drops the requests can be defined:

    server {
    listen 80;
    server_name "";
    return 444;
    }

    Может он вообще по умолчанию на 444 бросает который у тебя используется
     
  7. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Предложенный Вами вариант я встречал, но считал, что он не поможет. Сейчас следующая ситуация: в старой вкладке (до внесения предложенного Вами варианта) открывает админку и в ней можно работать. А вот в новом браузере/вкладке перекидывает уже на сайт. Так же если пройти по adm.site.ru:444, стереть ":444", то опять попадаешь на adm.site.ru (т.е. на 443 порт). Хотя я сразу добавил еще и
    Код (Text):
    1. server {
    2. listen 443;
    3. server_name "";
    4. return 444;
    5. }
     
  8. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Спасибо за наводку - буду утром пробовать.
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Лучше как-то так вместо рестарта: nginx -t && service nginx reload Иначе фронт может внезапно отвалиться в неподходящее время.
     
    eldor нравится это.
  10. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Спс за совет. Я все манимупляции выполняю на тестовом сервере.

    Задачу решил частично. Т.е. сделал доступ к админке по разрешенным IP в конфигах серверов (Apache и Nginx) на стандартных портах 80 и 443. Но не смог понять как можно осуществлять доступ по доверенным MAC-адресам (что было реализовано у меня с помощью iptables). Так же возникла задача при входе в админку с неразрешенных IP замаскировать "403 Forbirdden" под "404 Not Found".
     
  11. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    403 Forbirdden замаскировал костыльным методом под 404 в Apache:
    Код (Text):
    1.         ErrorDocument 404 /er404.php
    2.         ErrorDocument 403 /er404.php
    Теперь осталась одна задача - организовать доступ к админке не только по IP, но и по MAC-адресам.