ubuntuusers.de

Apache/nginx Weiterleitung

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

VolkerRaschek

Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Hallo zusammen, ich habe folgendes Problem und weiß nicht wirklich, ob es für mein Problem eine Lösung gibt, da ich bisher nichts in den Dokumentationen dazu gefunden habe.

Meine Umgebung sieht so aus, dass ich einen Apache2 Webserver am Internet hängen habe. Dieser leitet meine Anfragen an einzelne Docker Container weiter. Als beispiel https://nextcloud.example.com an den Docker Container nextcloud.

Jetzt habe ich allerdings in KVM eine Ubuntu Installation für einen Freund hoch gefahren und möchte gerne realisieren, dass mein Apache an die IP-Adresse des KVM-Gastes (192.168.122.44) alle Anfragen der Domain freund.example.com weiterleitet. Innerhalb der KVM lauscht ein nginx Webserver der wiederum an die Docker Container meines Kumpels weiterleitet. So müsste folgendes weitergeleitet werden nextcloud.freund.example.com an den Docker Container nextcloud meines Kumpels.

Ich suche jetzt nach einer Möglichkeit, dass ich irgendwie *.freund.example.com mit Apache an die VM meines Kumpels weiterleite. Interessant wäre auch, wie ich das unter nginx realisieren kann.

Also eine Möglichkeit *.freund.example.com an eine spezielle Adresse oder IP weiter zu leiten.

Viele Grüße
Volker

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5576

Nur HTTP oder alle Protokolle?

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Vorerst nur HTTP und HTTPS.
Interessiert wäre ich aber auch an SMTP, IMAP und POP3, sofern dovecot und postfix irgendwann offiziell als docker container bereit gestellt werden.

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5576

Die Container/VMs haben keine public IP sondern nur eine interne? D.h. der Host muss jedenfalls alle Verbindungen aufmachen und nachsehen, fuer welchen Host die Verbindung ist?

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Ja, das sollte so funktionieren:

<VirtualHost *:80>
   ServerName freund.example.org
   ServerAlias *.freund.example.org

   ProxyPass ...
   ProxyPreserverHost On
   ProxyAddHeaders On
   ...
</VirtualHost>

Die erste markierte Zeile sorgt dafür, dass der Host-Header mit durchgereicht wird. Die zweite Zeile sorgt dafür, dass Proxy-Header mit an das entsprechende Backend gesendet werden, welche sind:

  • X-Forwarded-For: IP des ursprünglichen Clients

  • X-Forwarded-Host: Ursprünglicher Host-Header

  • X-Forwarded-Server: Hostname des Proxy-Servers

Wichtig ist dabei hauptsächlich X-Forwarded-For, damit dein Freund die IP des ursprünglichen Clients kennt, um beispielsweise IP-basierte Zugriffsbeschränkungen realisieren zu können.

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

sebix schrieb:

Die Container/VMs haben keine public IP sondern nur eine interne? D.h. der Host muss jedenfalls alle Verbindungen aufmachen und nachsehen, fuer welchen Host die Verbindung ist?

Ja, die Container haben alle eine interne Docker IP.

misterunknown schrieb:

Ja, das sollte so funktionieren:

<VirtualHost *:80>
   ServerName freund.example.org
   ServerAlias *.freund.example.org

   ProxyPass ...
   ProxyPreserverHost On
   ProxyAddHeaders On
   ...
</VirtualHost>

Die erste markierte Zeile sorgt dafür, dass der Host-Header mit durchgereicht wird. Die zweite Zeile sorgt dafür, dass Proxy-Header mit an das entsprechende Backend gesendet werden, welche sind:

  • X-Forwarded-For: IP des ursprünglichen Clients

  • X-Forwarded-Host: Ursprünglicher Host-Header

  • X-Forwarded-Server: Hostname des Proxy-Servers

Wichtig ist dabei hauptsächlich X-Forwarded-For, damit dein Freund die IP des ursprünglichen Clients kennt, um beispielsweise IP-basierte Zugriffsbeschränkungen realisieren zu können.

Vielen Dank für den Hinweis, das werde ich gleich ausprobieren.

Viele Grüße

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Hallo zusammen, es hat funktioniert! Er leitet mir alle Anfragen durch.

Ich möchte allerdings, dass mein Apache das Verzeichnis example.com/.well-known nicht auf SSL Umschreibt sondern lokal auf /var/www/letsencrypt routet.

Wie macht man das mit directories und locations in Apache? Ich habe das mit nginx mal ausprobiert, da habe ich das schnell hinbekommen doch mein Apache stellt sich immer quer.

Hier mal meine Bisherige config ohne versuchte umleitungen von .well-known.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<VirtualHost *:80>
  # Server Details
  ServerName      example.com
  ServerAlias     example.com
  ServerAdmin     webmaster@example.com

  # Logs
  ErrorLog ${APACHE_LOG_DIR}/example.com/error.log
  CustomLog ${APACHE_LOG_DIR}/example.com/access.log combined

  # Umleiten auf HTTPS
  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Du nutzt ja bereits mod_rewrite zum Umleiten auf HTTPS, von daher kannst du einfach noch eine Ausnahme hinzufügen:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well-known
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Damit es funktioniert müsstest du natürlich auch noch dafür sorgen, dass unter .well-known etwas erreicht wird, beispielsweise über einen globalen Alias oder so.

Antworten |