3cx hinter Reverse Proxy

antiager

Premier Customer
Mitglied seit
19. November 2020
Beiträge
59
Hallo Forum!

Eine 3cx Linux in einem lokalen Netz installiert läuft jetzt in ermangelung einer zweiten IP Adresse hinter einem Reverse Proxy.

Im Umgang mir Reverse Proxys unerfahren forsche ich jetzt nach der richtigen konfiguration.

Die 3cx muss sich den Port 443 mit einem Mailserver teilen.

Soweit ich das verstanden habe braucht die 3cx den 443 für Videokonferenzen und beim Betrieb eines SBC (was bei mir der Fall ist) ist das so korrekt und stimmt es dass somit die zwingende Notwendigkeit entsteht die 3cx über Port 443 erreichbair zu machen?

Ich hoffe die Frage ist klar genug formuliert!

Wie immer freue ich mich über eure hilfreichen Tipps!

Danke im voraus!
 
Hallo,
Soweit ich das verstanden habe braucht die 3cx den 443 für Videokonferenzen und beim Betrieb eines SBC (was bei mir der Fall ist) ist das so korrekt und stimmt es dass somit die zwingende Notwendigkeit entsteht die 3cx über Port 443 erreichbair zu machen?
Nicht ganz. Es ist günstig, wenn die Videokonferenzen mit Externen über Port 443 abgewickelt werden können und man daher den HTTPS Port der 3CX auf 443 gestellt hat. Dann wird der auch benutzt. Diesen Port benötigen auch div. andere Programme, z.B. auch für die Statusanzeige, Provisionierung usw..

Wir benutzen diese Ports daher seit geraumer Zeit ausschließlich per Reverse Proxy Nutzung. In unseren Fällen ist das haproxy auf pfSense. Das funktioniert problemlos per SNI. Mangels div. weitere Notwendigkeiten waren wir gezwungen bei Einigen auf SSL Offloading umzustellen und haben das auch getan. Wir haben allerdings noch nicht alle Kunden umgestellt. Aber die, welche das benutzen, tun das recht intensiv und problemlos, auch das geht.

Nachtrag: SSL Labs bescheinigt unseren haproxy A+
 
Zuletzt bearbeitet:
  • Like
Reaktionen: mbehrens
Hier mal ein (modifizerter) Export des haproxy einer pfSense:
Code:
# Automaticaly generated, dont edit manually.
# Generated on: 2022-03-20 01:20
global
        maxconn                 1000
        stats socket /tmp/haproxy.socket level admin  expose-fd listeners
        uid                     80
        gid                     80
        nbproc                  1
        nbthread                1
        hard-stop-after         15m
        chroot                  /tmp/haproxy_chroot
        daemon
        tune.ssl.default-dh-param       4096
        server-state-file /tmp/haproxy_server_state
        ssl-default-bind-options ssl-min-ver TLSv1.2
        tune.ssl.default-dh-param 4096
        ssl-default-bind-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

listen HAProxyLocalStats
        bind 127.0.0.1:2200 name localstats
        mode http
        stats enable
        stats admin if TRUE
        stats show-legends
        stats uri /haproxy/haproxy_stats.php?haproxystats=1
        timeout client 5000
        timeout connect 5000
        timeout server 5000

frontend frontend1-http
        bind                    80.153.1.1:80 name 80.153.1.1:80   
        mode                    http
        log                     global
        option                  http-keep-alive
        timeout client          30000
        acl                     http-pbx        var(txn.txnhost) -m str -i pbx.meine3cx.de
        ...
        http-request set-var(txn.txnhost) hdr(host)
        http-request  deny if { req.hdr_cnt(content-length) gt 1 }
        http-response deny if { res.hdr_cnt(content-length) gt 1 }
        use_backend http-pbx-backend_ipvANY  if  http-pbx
        ...

frontend frontend2-https
        bind                    80.153.1.1:443 name 80.153.1.1:443   ssl crt-list /var/etc/haproxy/frontend2-https.crt_list 
        mode                    http
        log                     global
        option                  http-keep-alive
        timeout client          30000
        acl                     https-pbx       var(txn.txnhost) -m str -i pbx.meine3cx.de
        ...
        acl                     aclcrt_frontend2-https  var(txn.txnhost) -m reg -i ^pbx\.meine3cx\.de(:([0-9]){1,5})?$
        ...
        http-request set-var(txn.txnhost) hdr(host)
        http-request  deny if { req.hdr_cnt(content-length) gt 1 }
        http-response deny if { res.hdr_cnt(content-length) gt 1 }
        use_backend https-pbx-backend_ipvANY  if  https-pbx aclcrt_frontend2-https
        ...


backend http-pbx-backend_ipvANY
        mode                    http
        id                      105
        log                     global
        timeout connect         60000
        timeout server          60000
        retries                 10000
        server                  http-pbx 10.11.12.13 id 101 
...

backend https-pbx-backend_ipvANY
        mode                    http
        id                      106
        log                     global
        timeout connect         60000
        timeout server          60000
        retries                 10000
        server                  https-pbx 10.11.12.13:443 id 101 ssl check inter 1000  verify none
...
 
  • Like
Reaktionen: mbehrens
Hallo @fxbastler ,

mich würde interessieren wie es mit den Zertifikaten funktioniert wenn man einen HA Proxy einsetzt . Kann man den HA Proxy nur nutzen wenn man einen eigenen fqdn hat?

Beste Grüße
 
Hallo,

jetzt kommt eine Textwand.

Die klare Antwort: nein. Man kann einen Reverse Proxy (haproxy oder wie Sophos es benennt: WAF) immer nutzen.

Im SNI Betrieb braucht der prinzipbedingt gar keine Zertifikate. Im Offload Betrieb gibt man dem halt die Zertifikate welche die 3CX schon hat (weil die Firma 3CX die bei LE holt und der 3CX Installation bereitstellt).

So ein LE Zertifikat besteht grundsätzlich aus zwei Dateien: dem Zertifikat und dem privaten Schlüssel dazu. Das Zertifikat selber nutzt einem wenig da die Kette der Zerfikataussteller / Zwischenzerfizierungsstellen zum Überprüfen für einen Client auch immer mit angegeben werden muss. Das kann eine dritte Datei sein, ist es meist nicht, das baut man i.d.R. immer mit in die Zertifikatdatei ein. Wenn Zertifikate von LE kommen nennt diese Datei sich fullchain.pem: die enthält alle Zwischenzertifizierungsstellen und auch das eigentliche Zertifikat.

In einer Debian 3CX liegen diese beiden Dateien unter /var/lib/3cxpbx/Bin/nginx/conf/Instance1/ (für den Webserver, die Website, die Provisionierung usw) und auch noch einal unter /var/lib/3cxpbx/Instance1/Bin/Cert/ (für die VOIP Verschlüsselung, SRTP). Die fullchain als <fqdn>-crt.pem bzw. domain_cert_<fqdn>.pem und der private Schlüssel als <fqdn>-key.pem bzw. domain_key_<fqdn>.pem.

Tauscht man die Dateien des Webservers einer 3CX aus so muss dieser neu geladen werden (/etc/init.d/nginx reload). Tauscht man die Dateien des 3CX System einer 3CX aus so muss der Dienst 3CXPhoneSystem01 neu gestartet werden und alle anderen davon abhängigen 3CX Dienst hinterher auch:
Bash:
systemctl stop 3CXPhoneSystem01
_services=$(systemctl list-unit-files --state=enabled |grep -i 3cx |awk '{printf "%s\n", $1}')
for _service in $_services; do systemctl is-active --quiet $_service || systemctl start $_service; done

Wie kommen nun diese fremd erstellten Zertifikate in eine pfSense? Wir lassen täglich einen cron Job laufen welcher die Zertifikate vergleicht, ggf. verlängert, was auch immer. Wenn sich da etwas ändert dann werden diese entweder mit einem wenig privilegierten Benutzeraccount auf die pfSense hochgeladen (Variante 1, per ssh, expect ist dein Freund) oder die pfSense holt die sich selber (Variante2, auch hier: ssh und expect) weil dort auch ein entspr. cron Job mit einem PHP Skript läuft. In der pfSense gibt es immer ein (Fremd)zertifikat welches der haproxy nutzt. Das hat den Namen des FQDN der 3CX. Das wird durch das cron PHP Skript auf der pfSense ersetzt wenn es sein muss, hier ein Beipiel für das PHP Skript einer pfSense für Variante 1:
PHP:
<?php
require_once("certs.inc");
require_once("pfsense-utils.inc");

$a_cert = &$config['cert'];

$fname=pathinfo(__FILE__, PATHINFO_FILENAME);

for ($ii=0; $ii < count($a_cert); $ii++) {
    if ($a_cert[$ii]['descr'] == $fname) {
        $fcinh=file_get_contents("/home/$_pfusername/$fname/$fname.pem");
        $fkinh=file_get_contents("/home/$_pfusername/$fname/$fname.key");
        $a_cert[$ii]['crt']=base64_encode($fcinh);
        $a_cert[$ii]['prv']=base64_encode($fkinh);
    }  
}
write_config("Zertifikat $fname wurde aktualisiert");
parse_config(true);
shell_exec("/usr/local/etc/rc.d/haproxy.sh restart");
?>

Das klingt alles kompliziert, liest sich chaotisch, ist es gar nicht. Das richtet man einmal ein und dann läuft das automatisch und perfekt. Wir haben selbst für die Einrichtung Skripte geschrieben welche das automatisch machen ;)
 
  • Like
Reaktionen: bitn2 und mbehrens
Verflixt, zwei Schreibfehler:
per ssh, expect ist dein Freund
Nicht expect sondern sshpass - dann funktioniert das auch. Expect brauchen wir für so automatisierte altertümliche Telnet Anbindungen u.ä..
 
@fxbastler danke für das ausführliche Feedback. Wir haben ausschließlich Sophos SGs im Einsatz. Die kann was ich so raus bekommen habe wohl kein SNI. Die XG Serie kann das wohl.
Hast Du Erfahrungen mit Sophos SGs ?
 
  • Like
Reaktionen: bitn2
Hast Du Erfahrungen mit Sophos SGs ?
Ja, aber nicht wirklich lange, nicht so viel wie anderswo, nicht die besten und das ist nun schon wieder eine kleine Weile her. Ich war mal eine Zeitlang scharf auf einige der Astaro Features die nach dem Kauf später in die Sophos aufgegangen sind (z.B. auch Thema WAF genannt) - haben wir mit squid gelöst. Wir hatten mal 2 Geräte bei Neukunden übernommen, eine ging kaputt - nur Probleme, auch mit dem Ersatz, die andere war dem dauerhaft zu teuer. Es wurden beide ersetzt und nachdem die eine Zeitlang dort gelegen haben wurden die wohl auch verschrottet. Wir hatten hin und wieder Ambitionen uns testweise damit zu beschäftigen aber niemand hat sich aus Zeitmangel / mangels Ambitionen ernsthaft mit den VM beschäftigt.
 

Statistik des Forums

Themen
44.414
Beiträge
232.721
Mitglieder
78.331
Neuestes Mitglied
b2daniel