
Ich habe Nginx auf einem Ubuntu-Server installiert und WordPress darauf blog.example.com
.
Ich habe auf WordPress eine Seite für die Galerie erstellt, auf die von aus zugegriffen werden kann blog.example.com/gallery
.
Wenn jetzt jemand darauf zugreift, gallery.example.com
sollte der Inhalt von angezeigt werden blog.example.com/gallery
. Wie kann ich dies in Nginx erreichen?
Folgendes habe ich in der Nginx-Serverkonfiguration versucht blog.example.com.config
:
location /gallery {
proxy_pass http://gallery.example.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Antwort1
Richtige Konfiguration
Ihr Proxy ist falsch herum! Es handelt sich um einen Proxy von einem Pfad zu einer Subdomäne; höchstwahrscheinlich zum gleichen Hostnamen, auf dem sich der Pfad befindet. Wenn es mit ist server_name gallery.example.com
, wird derzeit ein Proxy von http://gallery.example.com/gallery
zu gesendet http://gallery.example.com/
.
So machen Sie es zum Proxy von http://gallery.example.com
nach http://blog.example.com/gallery
:
server {
server_name gallery.example.com;
location / {
proxy_pass http://blog.example.com/gallery;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Denial-of-Service-Angriffe mit der aktuellen Proxy-Konfiguration
Die komplette Fehlkonfiguration:
server {
server_name gallery.example.com;
location /gallery {
proxy_pass http://gallery.example.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Das Detail, dass sich diese Fehlkonfiguration auf derselben Subdomäne befindet, zu der auch der Proxy führt, macht die Sache interessant, da jemand diese Art von Setup tatsächlich für einen Denial-of-Service-Angriff missbrauchen könnte, indem er auf eine URL zugreift, die so viele interne Proxy-Verbindungen verursachen würde, wie /gallery
URL-Teile aufeinander folgen.
http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/.../gallery
=> . . .
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery
=> http://gallery.example.com/gallery
=> http://gallery.example.com/
Das Aufrufen vieler solcher Anfragen führt zu einer hohen Belastung des Servers, die noch lange nach dem Stoppen des Angriffs anhalten kann, da Nginx immer noch versucht, alle diese verschachtelten Proxy-Verbindungen zu bedienen. Nginx könnte auch beginnen, 502 Bad Gateway
& 500 Internal Server Error
für legitime Benutzer anzuzeigen.
Sogar das Protokollieren all dieser Anfragen könnte zum Problem werden:[alert] 1620#1620: *2748894 write() to "/var/log/nginx/access.log" was incomplete: 3421 of 4566 while logging request
Wenn dies ein https://
Server gewesen wäre, hätten all diese TLS-Handshakes zu noch höheren Belastungen geführt.
Wie viele Proxy-Verbindungen können durch eine einzelne HTTP-Anfrage verursacht werden?
Derlarge_client_header_buffers
steuert die maximale Länge der Anfragezeile, standardmäßig 4 8k
also 8096 ASCII-Zeichen. Obwohlhttp2_max_field_size
ist veraltet, ein kurzer Test curl
zeigt, dass Nginx standardmäßig URLs mit bis zu 11157 Zeichen über HTTP/2 bereitstellen kann. Was auch immer die Grenze ist, Ihr Proxy würde 1011 bis 1394 Zeichen /gallery
in der URL zulassen, bevor der 414 Request-URI Too Large
Fehler ausgegeben wird.
Eine Grenze vonworker_connections
wird wahrscheinlich zuerst getroffen, wenn der Standardwert nicht erhöht wird 512
. Dies würde zu einer 500 Internal Server Error
Fehlermeldung und zu Fehlerprotokollzeilen führen, die Folgendes enthalten:
512 worker_connections are not enough while connecting to upstream