我正在运行nginx
1.2.1 版本,其中包含一些服务。它们都使用自己的域,并且只监听 443。
我想锁定那些扫描我的服务器 IP 并且不知道域名的人。如果没有域名,则任何网站都不应回复。我不确定这是否可行,因为域名只是一个人类可读的 IP?
我尝试了很多次但都没有成功。
# Default server
server {
listen [::]:443 ssl default_server;
server_name _; # also tried to leave this out
return 404;
}
如果我启用此功能,我的其他服务都不会回复。无论这是第一个还是最后一个站点(按字母顺序排列)。它们不会通过 IP 或域名回复。
实现这一目标的正确方法是什么?
编辑:更多信息
我定义了六个站点,其中包括不起作用的默认全部捕获站点:
etherpad, nagios, openmediavault-nginx, openmediavault-webgui, owncloud9, zzz-default.
openmediavault-nginx
仅包含站点上的 Piwik 实例。
每个站点都有server_name
分配。两个站点(nagios 和 webgui)共享一个内部服务器名称,但具有不同的端口号。从外部站点可以访问的所有站点都具有相同的端口 (443),但域名不同。
我使用 dynDNS 和 CNAME 来使我的域名正常运行。
当我输入时https://<my ip>
,我得到了我的 owncloud 实例。有一个警告,说这个域不受信任,但它是 owncloud。
这是我的 owncloud 监听线路
listen [::]:443 ssl ipv6only=off deferred;
其余配置主要是默认的,如评论中所链接的。
问题是:为什么即使配置中没有默认或 default_site 选项,owncloud 也会响应?
我已经禁用除 default-catch-all-site 和 owncloud 之外的所有内容。 行为是相同的,如果启用了 ddefault 站点,ownclud 将无法工作。
默认站点配置上面列出,我添加了 ssl 选项。
Owncloud 配置是:
upstream php-handler {
# server 127.0.0.1:9000;
server unix:/var/run/php5-fpm-owncloud.sock;
}
server {
listen [::]:443 ssl;
server_name owncloud.mydomain.com
ssl_certificate /etc/ssl/certs/openmediavault-7e8ef610-4ac4-4e47-9774-453fee8878bf.crt;
ssl_certificate_key /etc/ssl/private/openmediavault-7e8ef610-4ac4-4e47-9774-453fee8878bf.key;
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
root /var/www/owncloud9/;
# set max upload size
client_max_body_size 10G;
fastcgi_buffers 64 4K;
# Disable gzip to avoid the removal of the ETag header
gzip off;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
# security settings to reach A+
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_dhparam /etc/ssl/private/dhparams.pem;
server_tokens off;
index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
rewrite ^/.well-known/carddav /remote.php/dav/ permanent;
rewrite ^/.well-known/caldav /remote.php/dav/ permanent;
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
# Logging - important for fail2ban
error_log /var/log/nginx/owncloud_error.log error;
access_log /var/log/nginx/owncloud_access.log combined;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location / {
rewrite ^/remote/(.*) /remote.php last;
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
try_files $uri $uri/ =404;
}
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the location ~ \.php(?:$|/) { block
location ~* \.(?:css|js)$ {
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
答案1
我使用这个,它似乎对我有用。它看起来和你的非常相似,我想知道你的配置中是否有其他东西导致了问题。请发布另一台服务器的配置。
# This just prevents Nginx picking a random default server if it doesn't know which
# server block to send a request to
server {
listen 80 default_server; # add 443 / SSL if you like
server_name _;
return 444; # This means "go away", effectively
access_log off; log_not_found off; # Optional
}
答案2
您向我们展示的默认服务器配置正在尝试使用 SSL,但您没有提供 SSL 证书。这本身就是一个巨大的危险信号。
我个人的经验是,在某些情况下,默认服务器在按字母顺序排列的域名搜索列表中排名较低(或更具体地说是配置文件 - 我将其命名为与域名匹配)。我能够通过将文件重命名为“_default”来解决这个问题。