Nginx default_server 不工作

Nginx default_server 不工作

我正在运行nginx1.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”来解决这个问题。

相关内容