#nginx #kubernetes #openshift #kubernetes-ingress #okd
Вопрос:
Я развернул модуль nginx в OKD 4.8. Проблема в том, что IP-адрес, отображаемый в журналах, соответствует виртуальной машине, на которой запущен входной контроллер.
Это конфигурация для моего сквозного маршрута OKD:
- kind: Route
apiVersion: route.openshift.io/v1
metadata:
name: app-cname
labels:
app: app
spec:
host: "app.dev.com"
to:
kind: Service
name: app
weight: 100
port:
targetPort: 8080-tcp
tls:
termination: passthrough
insecureEdgeTerminationPolicy: Redirect
Это мой текущий конфигурационный файл /etc/nginx/nginx.conf
:
error_log /dev/stderr;
pid /run/nginx.pid;
worker_processes auto;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set_real_ip_from 0.0.0.0/0;
log_format main '$remote_addr forwarded for $http_x_real_ip - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
map $http_user_agent $logme {
default 1;
~^kube-probe* 0; # do not log user-agent for ocp readiness probe
}
access_log /dev/stdout main if=$logme;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Allow up to 10 MiB payload, app defaults to 10 MiB.
client_max_body_size 10M;
include /etc/nginx/conf.d/*.conf;
server {
listen 8080 ssl;
listen [::]:8080 ssl;
root /var/www/html;
index index.php index.html index.htm;
ssl_certificate /etc/nginx/ssl/app.crt;
ssl_certificate_key /etc/nginx/ssl/app.key;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # check with igor
resolver_timeout 5s; # check with igor
add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ecdh_curve secp384r1;
add_header Cross-Origin-Embedder-Policy require-corp;
add_header Cross-Origin-Resource-Policy same-origin;
add_header Cross-Origin-Opener-Policy same-origin;
add_header Referrer-Policy no-referrer;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options deny;
add_header X-XSS-Protection "1; mode=block";
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ .(php|phar)(/.*)?$ {
fastcgi_split_path_info ^(. .(?:php|phar))(/.*)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php-fpm;
fastcgi_hide_header Cross-Origin-Embedder-Policy;
fastcgi_hide_header Cross-Origin-Resource-Policy;
fastcgi_hide_header Cross-Origin-Opener-Policy;
fastcgi_hide_header Referrer-Policy;
fastcgi_hide_header X-Content-Type-Options;
fastcgi_hide_header X-Frame-Options;
fastcgi_hide_header X-XSS-Protection;
# Prevent exposing nginx version to $_SERVER
fastcgi_param SERVER_SOFTWARE "";
}
}
}
Есть ли что-нибудь, что не имеет смысла?
Это моя установка:
sh-4.4$ nginx -V
nginx version: nginx/1.14.1
built by gcc 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC)
built with OpenSSL 1.1.1 FIPS 11 Sep 2018 (running with OpenSSL 1.1.1g FIPS 21 Apr 2020)
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --with-ld-opt='-Wl,-z,relro -Wl,-z,-Wl,-E'
Как я могу отобразить реальный исходный IP-адрес в журналах nginx?
Заранее спасибо,
Ответ №1:
Я новичок в OKD4, но при использовании сквозной передачи поток tcp будет передаваться без изменения, а исходный ip — адрес является одним из маршрутизаторов OpenShift.
Если вы хотите, чтобы x-перенаправлялся, вам придется вместо этого изменить его на «повторное шифрование», но тогда, конечно, SSL будет прерван на маршрутизаторах и будет открыт новый сеанс https-если вам не нужно сквозное шифрование, это нормально (но, конечно, добавит нагрузку на кластер).
Комментарии:
1. сквозное шифрование является для меня обязательным требованием: (То, что вы говорите, верно, попробовал использовать «край», и появился заголовок X-Forwarded-For. Но при использовании «сквозной» заголовок X-Forwarded-For не установлен.
2. То, что при использовании «сквозного» заголовка X-Forwarded-For отсутствует, — это то, что вам нужно при определении «сквозного». При определении прохождения вы, как правило, говорите системе, чтобы она ничего не меняла, но принимала пакет TCP и отправляла его как есть на серверную часть. Но, конечно, исходный ip-адрес будет принадлежать новому отправителю (вашему haproxy). Там нечего было делать …