Nginx
使用 Nginx 阻止未發送到我的域的連接
我在 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
屬性的主機。這意味著如果沒有找到匹配的虛擬主機,則使用該塊來服務請求。要正確處理您的案件,您需要:
server``default_server
在listen
指令中阻止。這個塊應該只有return 404;
orreturn 444;
。access_log
您可能也想在此塊中關閉。server
用server_name example.com *.example.com;
. 此虛擬主機應包含您的實際應用程序。請注意,這就是完全控制 nginx 配置時的配置方式。我不知道 Elastic Beanstalk 是否有一些功能可以以這種方式自動生成配置文件。