nginx reverse-proxy per source IP

Es gibt Situationen da möchte man in einem nginx reverse-proxy die Requests je nach Client IP zu einem anderen Server umleiten. Nützlich ist das beispielsweise bei einer Server Migration, wo man nur eine handvoll interner IPs zuerst auf den neuen Server proxy-en kann und wenn alles läuft dann alle.

Die Option mit „if Statements“ sollte man dabei möglichst nicht verwenden. Und es gibt auch eine viel elegantere Option.

Mit dem nxing Modul http_geo_module, welches eigentlich für GeoIP Location Verteilung gedacht ist, kann man wunderbar IP Adressen- oder Netze gruppieren und an ein backend weiterleiten.

Dazu werden zuerst die upstream Server (backends) definiert und danach die Gruppierung mit dem dem geo gemacht:

/etc/nginx/conf.d/proxy-by-client.conf

# Upstream definitions
upstream server1 {
  server 192.168.1.10:8080;
}

upstream server2 {
  server 192.168.1.20:8080;
}


# Map IP to upstream
geo $remote_addr $backend {
  default          http://server1;
  192.168.100.0/24 http://server2;
  93.184.216.34    http://server2;
}

(falls das backend HTTPS (SSL) ist, ist anstelle von „http://“ entsprechend „https://“ zu verwenden)

Standardmässig (default) werden alle Clients zu http://server1 proxied.
Alle, welche vom IP Netz: 192.168.100.0/24 oder der IP: 93.184.216.34 kommen, gehen nach: http://server2.

In der location direktive des VirtualHosts kann man dann einfach auf die Variable $backend verweisen:

server {
 listen 80;
  server_name example.com;
  [...]

  location / {
    [...]
    proxy_pass $backend;
  }
}

Quelle: Different proxy_pass upstream depending on client ip address in Nginx

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert