Webproxy mit nginx für HTTP und X.509 Zertifikate: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= Webproxy mit Nginx für HTTP und X.509-Zertifikate = == Einführung == * Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden. * X.509…“)
 
 
(21 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= Webproxy mit Nginx für HTTP und X.509-Zertifikate =
+
=== Das Template ===
 +
;Wir nehmen das rocky-template
 +
=== Netzkonfiguration Reverse Proxy-Server (DMZ) ===
 +
 
 +
{| class="wikitable" style="background-color: #f2f2f2;"
 +
! Parameter !! Wert !! Erläuterung
 +
|-
 +
| '''Netzwerk (NIC)''' || DMZ || Interface-Zuweisung in VirtualBox
 +
|-
 +
| '''IP''' || 10.88.2XX.41 || Statische IP
 +
|-
 +
| '''CIDR''' || 24 || Classless Inter-Domain Routing Präfixlänge
 +
|-
 +
| '''GW''' || 10.88.2XX.1 || GATEWAY
 +
|-
 +
| '''NS''' || 10.88.2XX.21 || Resolver
 +
|-
 +
| '''FQDN''' || revproxy.it2XX.int || Fully Qualified Domain Name
 +
|-
 +
| '''SHORT''' || revproxy || Short Name
 +
|-
 +
| '''DOM''' || it2XX.int|| Domain Name
 +
|}
 +
;Anpassen des Templates
 +
Mit '''debian-setup.sh''' oder mit '''rocky-setup.sh'''
 +
;Eintragen auf dem Host unter '''~/.ssh/config'''
  
 
== Einführung ==
 
== Einführung ==
 
* Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
 
* Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
 
* X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
 
* X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
* Der Proxy kann Anfragen an interne Webserver weiterleiten und dabei SSL/TLS offloaden.
+
* Der Proxy terminiert TLS zum Client und leitet Anfragen an interne Webserver weiter.
  
 
== Installation von Nginx ==
 
== Installation von Nginx ==
=== Debian/Ubuntu ===
+
;Nginx installieren
* Nginx-Server installieren:
+
* dnf install nginx
* sudo apt update
+
;Dienst starten und aktivieren
* sudo apt install nginx
+
* systemctl enable --now nginx
* Dienst starten und aktivieren:
+
 
* sudo systemctl start nginx
+
== Firewall konfigurieren ==
* sudo systemctl enable nginx
+
;HTTPS (Port 443) freigeben
 +
* firewall-cmd --permanent --add-service=https
 +
;HTTP (Port 80) freigeben – z. B. für Weiterleitungen
 +
* firewall-cmd --permanent --add-service=http
 +
;Firewall neu laden
 +
* firewall-cmd --reload
 +
;Aktive Regeln anzeigen
 +
* firewall-cmd --list-all
  
=== RHEL/CentOS ===
+
== Zertifikat erstellen ==
* Nginx-Repository hinzufügen und installieren:
+
*[[Zertifikat erstellen 5105|Zertifikat erstellen]]
* sudo yum install epel-release
+
;Ergebnis
* sudo yum install nginx
+
/etc/ssl/own.crt
* Dienst starten und aktivieren:
+
/etc/ssl/own.key
* sudo systemctl start nginx
 
* sudo systemctl enable nginx
 
  
== Grundlegende Proxy-Konfiguration ==
+
== Eine Webseite vorab um zu testen ob unser System soweit geht ==
* Beispielhafte Konfiguration für einen Reverse Proxy:
+
*cat /etc/nginx/conf.d/revproxy.int.conf
 
<pre>
 
<pre>
 
server {
 
server {
     listen 80;
+
     listen 443 ssl;
     server_name proxy.example.com;
+
    listen [::]:443 ssl;
 +
 
 +
     server_name revproxy.it2XX.int;
 +
 
 +
    root /usr/share/nginx/html;
 +
    index index.html index.htm;
 +
 
 +
    ssl_certificate /etc/ssl/own.crt;
 +
    ssl_certificate_key /etc/ssl/own.key;
  
 
     location / {
 
     location / {
         proxy_pass http://backend.local;
+
         try_files $uri $uri/ =404;
        proxy_set_header Host $host;
 
        proxy_set_header X-Real-IP $remote_addr;
 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>
* Datei speichern unter:
+
;Konfiguration prüfen
* sudo nano /etc/nginx/sites-available/proxy
+
* nginx -t
* Aktivieren der Konfiguration:
+
;Neu starten
* sudo ln -s /etc/nginx/sites-available/proxy /etc/nginx/sites-enabled/
+
* systemctl restart nginx
* Nginx neu laden:
+
;Testen
* sudo systemctl reload nginx
+
* curl -k https://revproxy.it2XX.int
 
 
== TLS/SSL mit X.509-Zertifikaten ==
 
* Selbstsigniertes Zertifikat erstellen:
 
* sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
 
  
* Beispielkonfiguration mit TLS:
+
== Proxy-Konfiguration mit TLS ==
 +
*cat /etc/nginx/conf.d/revproxy.int.conf
 
<pre>
 
<pre>
 
server {
 
server {
 
     listen 443 ssl;
 
     listen 443 ssl;
     server_name secure.example.com;
+
     listen [::]:443 ssl;
  
     ssl_certificate /etc/nginx/ssl/nginx.crt;
+
    server_name revproxy.it2XX.int;
     ssl_certificate_key /etc/nginx/ssl/nginx.key;
+
 
 +
     ssl_certificate /etc/ssl/own.crt;
 +
     ssl_certificate_key /etc/ssl/own.key;
  
 
     location / {
 
     location / {
         proxy_pass http://backend.local;
+
         proxy_pass http://mail-gw.it2XX.int:11334;
 +
        proxy_ssl_server_name on;
 
         proxy_set_header Host $host;
 
         proxy_set_header Host $host;
 
         proxy_set_header X-Real-IP $remote_addr;
 
         proxy_set_header X-Real-IP $remote_addr;
 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +
        proxy_set_header X-Forwarded-Proto $scheme;
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>
* Nginx neu laden:
+
;Nginx neu laden
* sudo systemctl reload nginx
+
* systemctl reload nginx
  
== Automatische SSL-Zertifikate mit Let's Encrypt ==
+
=== Bei Problemen ===
* Certbot installieren:
+
*ausearch -m avc -ts recent
* sudo apt install certbot python3-certbot-nginx
 
* Zertifikat ausstellen:
 
* sudo certbot --nginx -d example.com
 
* Automatische Erneuerung prüfen:
 
* sudo certbot renew --dry-run
 
 
 
== Zugriffsbeschränkung nach IP ==
 
* Nur bestimmten IPs Zugriff gewähren:
 
 
<pre>
 
<pre>
location / {
+
----
    allow 192.168.1.100;
+
time->Thu Mar 26 15:50:59 2026
    deny all;
+
type=PROCTITLE msg=audit(1774536659.561:435): proctitle=6E67696E783A20776F726B65722070726F63657373
    proxy_pass http://backend.local;
+
type=SYSCALL msg=audit(1774536659.561:435): arch=c000003e syscall=42 success=no exit=-13 a0=d a1=5578211d9fb8 a2=10 a3=7ffcb154f60c items=0 ppid=33457 pid=33458 auid=4294967295 uid=985 gid=984 euid=985 suid=985 fsuid=985 egid=984 sgid=984 fsgid=984 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
}
+
type=AVC msg=audit(1774536659.561:435): avc:  denied  { name_connect } for  pid=33458 comm="nginx" dest=443 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
 
</pre>
 
</pre>
 
+
;SELinux verbietet nginx ausgehende Verbindungen zum Backend
== Load Balancing mit Nginx ==
+
;Nginx Netzwerk-Zugriff dauerhaft freischalten
* Mehrere Backend-Server verteilen:
+
* setsebool -P httpd_can_network_connect 1
<pre>
+
;Prüfen
upstream backend_servers {
+
* getsebool httpd_can_network_connect
    server backend1.local;
 
    server backend2.local;
 
}
 
 
 
server {
 
    listen 80;
 
    server_name loadbalancer.example.com;
 
 
 
    location / {
 
        proxy_pass http://backend_servers;
 
        proxy_set_header Host $host;
 
        proxy_set_header X-Real-IP $remote_addr;
 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    }
 
}
 
</pre>
 
 
 
== Aufgaben ==
 
* Richte einen Reverse Proxy für einen internen Dienst ein.
 
* Konfiguriere TLS mit einem selbstsignierten Zertifikat.
 
* Implementiere eine Zugriffsbeschränkung nach IP-Adresse.
 
* Setze Load Balancing zwischen mehreren Backend-Servern um.
 
  
 
== Fazit ==
 
== Fazit ==
 
* Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
 
* Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
 
* TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
 
* TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
* Load Balancing und Zugriffsbeschränkungen erhöhen die Skalierbarkeit und Sicherheit.
+
* SELinux-Booleans steuern, ob der Proxy Verbindungen zum Backend aufbauen darf.

Aktuelle Version vom 12. Juni 2026, 07:10 Uhr

Das Template

Wir nehmen das rocky-template

Netzkonfiguration Reverse Proxy-Server (DMZ)

Parameter Wert Erläuterung
Netzwerk (NIC) DMZ Interface-Zuweisung in VirtualBox
IP 10.88.2XX.41 Statische IP
CIDR 24 Classless Inter-Domain Routing Präfixlänge
GW 10.88.2XX.1 GATEWAY
NS 10.88.2XX.21 Resolver
FQDN revproxy.it2XX.int Fully Qualified Domain Name
SHORT revproxy Short Name
DOM it2XX.int Domain Name
Anpassen des Templates

Mit debian-setup.sh oder mit rocky-setup.sh

Eintragen auf dem Host unter ~/.ssh/config

Einführung

  • Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
  • X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
  • Der Proxy terminiert TLS zum Client und leitet Anfragen an interne Webserver weiter.

Installation von Nginx

Nginx installieren
  • dnf install nginx
Dienst starten und aktivieren
  • systemctl enable --now nginx

Firewall konfigurieren

HTTPS (Port 443) freigeben
  • firewall-cmd --permanent --add-service=https
HTTP (Port 80) freigeben – z. B. für Weiterleitungen
  • firewall-cmd --permanent --add-service=http
Firewall neu laden
  • firewall-cmd --reload
Aktive Regeln anzeigen
  • firewall-cmd --list-all

Zertifikat erstellen

Ergebnis
/etc/ssl/own.crt
/etc/ssl/own.key

Eine Webseite vorab um zu testen ob unser System soweit geht

  • cat /etc/nginx/conf.d/revproxy.int.conf
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name revproxy.it2XX.int;

    root /usr/share/nginx/html;
    index index.html index.htm;

    ssl_certificate /etc/ssl/own.crt;
    ssl_certificate_key /etc/ssl/own.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
Konfiguration prüfen
  • nginx -t
Neu starten
  • systemctl restart nginx
Testen

Proxy-Konfiguration mit TLS

  • cat /etc/nginx/conf.d/revproxy.int.conf
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name revproxy.it2XX.int;

    ssl_certificate /etc/ssl/own.crt;
    ssl_certificate_key /etc/ssl/own.key;

    location / {
        proxy_pass http://mail-gw.it2XX.int:11334;
        proxy_ssl_server_name on;
        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;
    }
}
Nginx neu laden
  • systemctl reload nginx

Bei Problemen

  • ausearch -m avc -ts recent
----
time->Thu Mar 26 15:50:59 2026
type=PROCTITLE msg=audit(1774536659.561:435): proctitle=6E67696E783A20776F726B65722070726F63657373
type=SYSCALL msg=audit(1774536659.561:435): arch=c000003e syscall=42 success=no exit=-13 a0=d a1=5578211d9fb8 a2=10 a3=7ffcb154f60c items=0 ppid=33457 pid=33458 auid=4294967295 uid=985 gid=984 euid=985 suid=985 fsuid=985 egid=984 sgid=984 fsgid=984 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1774536659.561:435): avc:  denied  { name_connect } for  pid=33458 comm="nginx" dest=443 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
SELinux verbietet nginx ausgehende Verbindungen zum Backend
Nginx Netzwerk-Zugriff dauerhaft freischalten
  • setsebool -P httpd_can_network_connect 1
Prüfen
  • getsebool httpd_can_network_connect

Fazit

  • Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
  • TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
  • SELinux-Booleans steuern, ob der Proxy Verbindungen zum Backend aufbauen darf.