Есть основной сайт и админка к нему. Вот конфиг сайта: Код (Text): # Для перенаправления с 80 порта на 443 (или с http на https) server { listen 80 default_server; server_name site.ru www.site.ru; return 301 https://site.ru$request_uri; } server { listen 443 ssl http2 default_server; root /var/www/site; index index.html index.php index.htm; server_name site.ru www.site.ru; # Картинки и прочее отдаёт Nginx location ~* ^(?!/phpmyadmin/).+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|b)$ { access_log off; expires 30d; } # запрет на доступ к .htaccess location ~ /\.ht { deny all; } # Если есть ошибка 404, то выводим свою страницу данной ошибки. error_page 404 /er_404.php; # передача запроса апачу location / { proxy_pass http://127.0.0.1:81/; # Порт на котором висит Apache proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_set_header Host $host; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_redirect off; proxy_set_header Connection close; proxy_pass_header Content-Type; proxy_pass_header Content-Disposition; proxy_pass_header Content-Length; } ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/site.ru/chain.pem; ssl_dhparam /etc/letsencrypt/live/site.ru/dhparams.pem; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 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'; } Вот конфиг админки: Код (Text): # Для перенаправления с 82 порта на 444 (или с http на https) server { #Доступ только локальный. listen 82; server_name adm.site.ru; return 301 https://adm.site.ru$request_uri; } server { listen 443 ssl http2; root /var/www/adm_site; index index.html index.php index.htm; server_name adm.site.ru; # запрет на доступ к .htaccess location ~ /\.ht { deny all; } # Если есть ошибка 404, то выводим свою страницу данной ошибки. error_page 404 /er_404.php; # передача запроса апачу location / { proxy_pass http://127.0.0.1:81/; # Порт на котором висит Apache proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_set_header Host $host; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_redirect off; proxy_set_header Connection close; proxy_pass_header Content-Type; proxy_pass_header Content-Disposition; proxy_pass_header Content-Length; } ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/site.ru/chain.pem; ssl_dhparam /etc/letsencrypt/live/site.ru/dhparams.pem; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 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'; } Доступ к админке открываю разрешенным IP-адресам с помощью iptables только по портам 82 и 444. В админку захожу след. образом: adm.site.ru:82 или adm.site.ru:444. Но если пройти по adm.site.ru, то админка открывается, т.е. вход выполняется по 80 и 443 портам (обходится ограничения по ip для 82 и 444 портов). Я пробовал уже и так - не помогает: Код (Text): server { ... server_name adm.site.ru:82; return 301 https://adm.site.ru:82$request_uri; } server { ... server_name adm.site.ru:444; Подскажите, пожалуйста, почему Nginx всетаки пропускает админку по стандартным портам (80 и 443), если в виртуальном сервере админки указаны явные порты 82 и 444?
Если пройти по adm.site.ru, то попадаешь с любого ip-адреса. А если с adm.site.ru:444, то только по разрешенным в iptables IP-адресам.
Пару десятков раз - точно)) А так же и apache2 до кучи) После каждого изменения в конфигах рестарт делаю.
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 бросает который у тебя используется
Предложенный Вами вариант я встречал, но считал, что он не поможет. Сейчас следующая ситуация: в старой вкладке (до внесения предложенного Вами варианта) открывает админку и в ней можно работать. А вот в новом браузере/вкладке перекидывает уже на сайт. Так же если пройти по adm.site.ru:444, стереть ":444", то опять попадаешь на adm.site.ru (т.е. на 443 порт). Хотя я сразу добавил еще и Код (Text): server { listen 443; server_name ""; return 444; }
Лучше как-то так вместо рестарта: nginx -t && service nginx reload Иначе фронт может внезапно отвалиться в неподходящее время.
Спс за совет. Я все манимупляции выполняю на тестовом сервере. Задачу решил частично. Т.е. сделал доступ к админке по разрешенным IP в конфигах серверов (Apache и Nginx) на стандартных портах 80 и 443. Но не смог понять как можно осуществлять доступ по доверенным MAC-адресам (что было реализовано у меня с помощью iptables). Так же возникла задача при входе в админку с неразрешенных IP замаскировать "403 Forbirdden" под "404 Not Found".
403 Forbirdden замаскировал костыльным методом под 404 в Apache: Код (Text): ErrorDocument 404 /er404.php ErrorDocument 403 /er404.php Теперь осталась одна задача - организовать доступ к админке не только по IP, но и по MAC-адресам.