Nginx не соблюдает конфигурацию
У меня есть развертывание kubernetes, которое требует следующей конфигурации:
- POST должен быть разрешен из любого источника.
- GET, HEAD, LIST должен быть ограничен интранетом.
Я придумал:
include modules/*.conf;
worker_processes 1;
error_log /dev/stdout info;
events {
worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /dev/stdout main;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
port_in_redirect off;
location / {
root html;
index index.html;
}
error_page 403 /403.html;
error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 504 /504.html;
}
}
if ($request_method != POST) {
limit_except GET DELETE PUT{
allow 10.0.0.0/8;
deny all;
}
}
Но я все еще могу получить из внешней сети
2 ответа
Я бы не стал использовать "если" из-за производительности и других причин.
Примерно так может быть лучше, если вы можете разделить свои URL таким образом. Ключ является limit_except. Есть вероятность, что у меня есть параметры в обратном направлении (поменяйте местами GET с POST), и, возможно, потребуется пересмотреть "deny all", но эта общая идея должна помочь решить проблему. Я буду обновлять ответ на основе любых комментариев.
location /post/service {
root html;
index index.html;
// OR proxy_pass http://whatever;
// ALLOW POST
limit_except GET {
deny all;
}
}
location / {
root html;
index index.html;
// OR proxy_pass http://whatever;
// ALLOW GET
limit_except POST {
deny all;
}
}
Единственный действительный контекст для limit_except
директива - это местоположение, и смысл этой директивы - ограничить использование методов HTTP, которые явно не исключаются.
Вы хотите строфу, как это:
location / {
root /usr/share/nginx/html;
index index.html;
limit_except POST {
allow 10.0.0.0/8;
deny all;
}
}