Nginx

使用 Nginx 阻止未發送到我的域的連接

  • August 23, 2022

我在 AWS 彈性 beantalk 上執行一個 django 應用程序,我收到了試圖掃描漏洞的機器人的垃圾郵件。它會導致大量錯誤,例如:

(其中 xx.xxx.xx.xx 是我的 ec2 實例的 IP 地址。)

DisallowedHost at //www/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
Invalid HTTP_HOST header: 'xx.xxx.xx.xx'. You may need to add 'xx.xxx.xxx.xx' to ALLOWED_HOSTS.

我的合法使用者只使用域名訪問該站點。我一直在試圖弄清楚如何修改我的 nginx 配置以阻止所有未定址到 *.mydomain.com 或 mydomain.com 的連接。

我根據需要動態添加和刪除子域,因此我為子域使用萬用字元。

AWS Elastic beanstalk 為我生成以下預設配置文件:

/etc/nginx/nginx.conf

#Elastic Beanstalk Nginx Configuration File

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32788;

events {
   worker_connections  1024;
}

http {
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   include       conf.d/*.conf;

   map $http_upgrade $connection_upgrade {
       default     "upgrade";
   }

   server {
       listen        80 default_server;
       access_log    /var/log/nginx/access.log main;

       client_header_timeout 60;
       client_body_timeout   60;
       keepalive_timeout     60;
       gzip                  off;
       gzip_comp_level       4;
       gzip_types text/plain text/css application/json application/javascript $

       # Include the Elastic Beanstalk generated locations
       include conf.d/elasticbeanstalk/*.conf;
   }
}

然後我用這個文件擴展它:

.platform\nginx\conf.d\elasticbeanstalk\00_application.conf

location / {
   set $redirect 0;
   if ($http_x_forwarded_proto != "https") {
       set $redirect 1;
   }
   if ($redirect = 1) {
       return 301 https://$host$request_uri;
   }   

   proxy_pass        http://127.0.0.1:8000;
   proxy_http_version  1.1;

   proxy_set_header    Connection         $connection_upgrade;
   proxy_set_header    Upgrade            $http_upgrade;
   proxy_set_header    Host               $host;
   proxy_set_header    X-Real-IP          $remote_addr;
   proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
   
   gzip on;
   gzip_comp_level 4;
   gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
   client_max_body_size 2000M;
}

location = /health-check.html {
   set $redirect 0;
   if ($http_x_forwarded_proto != "https") {
       set $redirect 1;
   }
   if ($http_user_agent ~* "ELB-HealthChecker") {
       set $redirect 0;
       return 204;
   }
   if ($redirect = 1) {
       return 301 https://$host$request_uri;
   }   

   proxy_pass        http://127.0.0.1:8000;
   proxy_http_version  1.1;

   proxy_set_header    Connection         $connection_upgrade;
   proxy_set_header    Upgrade            $http_upgrade;
   proxy_set_header    Host               $host;
   proxy_set_header    X-Real-IP          $remote_addr;
   proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

該覆蓋文件的目的是讓 nginx 將 http 重定向到 https 並響應 ELB 健康檢查。

我對 nginx 或彈性 beanstalk 並不太熟悉,但是從研究這個問題時我可以收集到的是,我需要讓我的預設伺服器連接返回 444,然後有一個單獨的伺服器塊,並將 server_name 設置為我的域。

這是處理此問題的正確方法嗎?它是否適用於萬用字元子域?

謝謝

似乎您唯一的虛擬主機是具有default_server屬性的主機。這意味著如果沒有找到匹配的虛擬主機,則使用該塊來服務請求。

要正確處理您的案件,您需要:

  1. server``default_serverlisten指令中阻止。這個塊應該只有return 404;or return 444;access_log您可能也想在此塊中關閉。
  2. serverserver_name example.com *.example.com;. 此虛擬主機應包含您的實際應用程序。

請注意,這就是完全控制 nginx 配置時的配置方式。我不知道 Elastic Beanstalk 是否有一些功能可以以這種方式自動生成配置文件。

引用自:https://serverfault.com/questions/1108830