Collabora hinter der (Sophos) Firewall mit Websocket Error

Hallo zusammen,

ich versuche gerade den Collabora Docker Container zum laufen zu bringen und von unserem moodle aus zu erreichen. Das moodle liegt extern bei einem Provider. Wir haben eine Sophos Firewall im Einsatz.

Der Dockerhost und Collabora sind von extern erreichbar, es wird mir die Adminseite und auch https://office.hans-baldung-gymnasium.de/hosting/discovery wird richtig angezeigt. Also scheint alles soweit zu laufen. Wenn ich in moodle ein kollaboratives Dokument erstelle, so startet das laden des Dokuments und es wird eine weiße Zeile und ein grauer Bereich angezeigt. Nach kurzer Zeit erscheint die Meldung „Die Verbindung zu Server wurde unterbrochen“.

In der Netzwerkanalyse des Firefox finde ich den folgenden Fehler: NS_ERROR_WEBSOCKET_CONNECTION_REFUSED

Auf der Sophos Firewall habe ich beim „Site Path Routing“ „Websocket passthrough“ eingeschaltet.

Woran kann das noch liegen?

Das moodle ist in derselben Domain, aber nicht im gleichen Netz. Collabora und nginx habe ich auf dem Docker. Ich habe es auch schon versucht Collabora in der DMZ laufen zu lassen, dabei hatte ich dasselbe Problem. Dem ReverseProxy sollte es doch eigentlich egal sein von woher die Anfragen kommen, solange der Rechner zu der entsprechenden Domäne gehört, oder? Irgendwo habe ich gelesen, es könnte an den Zertifikaten liegen, da die Firewall nach intern mit einem anderen Zertifikat arbeitet und dann die Zertifikatsprüfung nicht funktioniert. Ich habe auf dem Virtuellen Webserver der Sophos dasselbe Zertifikat liegen wie in dem nginx.

hier meine docker-compose.yml

version: '2.2'                                                                                                                                                          
                                                                                                                                                                        
services:                                                                                                                                                               
  collabora:                                                                                                                                                            
    image: collabora/code                                                                                                                                               
    restart: always                                                                                                                                                     
    ports:                                                                                                                                                              
      - 127.0.0.1:9980:9980                                                                                                                                             
    cap_add:                                                                                                                                                            
      - MKNOD                                                                                                                                                           
    environment:                                                                                                                                                        
      - domain=[a-z]*+.hans-baldung-gymnasium.de                                                                                                                        
      - username=admin                                                                                                                                                  
      - password=****                                                                                                                                               
      - VIRTUAL_HOST=office.hans-baldung-gymnasium.de                                                                                                                   
      - VIRTUAL_NETWORK=proxy-ssl                                                                                                                                       
      - VIRTUAL_PORT=9980                                                                                                                                               
      - VIRTUAL_PROTO=https                                                                                                                                             
      - ssl.enable=false                                                                                                                                                
      - ssl.termination=true

und meine nginx.conf

server {                                                                                                                                                               
   listen 80;                                                                                                                                                           
   listen [::]:80;                                                                                                                                                      
   server_name office.hans-baldung-gymnasium.de;                                                                                                                        
   location ^~ /.well-known/acme-challenge {                                                                                                                            
   alias /var/www/dehydrated;                                                                                                                                           
     }                                                                                                                                                                  
   }                                                                                                                                                                    
 server {                                                                                                                                                               
   listen 443 ssl;                                                                                                                                                      
   server_name office.hans-baldung-gymnasium.de;                                                                                                                        
#   add_header X-XSS-Protection "1; mode=block"; #Wenn es nicht geht, notfalls deaktivieren                                                                             
   ssl_certificate /srv/docker/collabora/office.pem;                                                                                                                    
   ssl_certificate_key /srv/docker/collabora/privkey.pem;                                                                                                               
# static files                                                                                                                                                          
 location ^~ /browser {                                                                                                                                                 
   proxy_pass https://127.0.0.1:9980;                                                                                                                                   
   proxy_set_header Host $http_host;                                                                                                                                    
 }                                                                                                                                                                      
# WOPI discovery URL                                                                                                                                                    
 location ^~ /hosting/discovery {                                                                                                                                       
   proxy_pass https://127.0.0.1:9980;                                                                                                                                   
   proxy_set_header Host $http_host;                                                                                                                                    
 }                                                                                                                                                                      
# Capabilities                                                                                                                                                          
 location ^~ /hosting/capabilities {                                                                                                                                    
   proxy_pass https://127.0.0.1:9980;                                                                                                                                   
   proxy_set_header Host $http_host;                                                                                                                                    
 }                                                                                                                                                                      
# main websocket                                                                                                                                                        
 location ~ ^/cool/(.*)/ws$ {                                                                                                                                           
   proxy_pass https://127.0.0.1:9980;                                                                                                                                   
   proxy_set_header Upgrade $http_upgrade;                                                                                                                              
   proxy_set_header Connection "Upgrade";                                                                                                                               
   proxy_set_header Host $http_host;                                                                                                                                    
   proxy_read_timeout 36000s;                                                                                                                                           
 }                                                                                                                                                                      
# download, presentation and image upload                                                                                                                               
 location ~ ^/(c|l)ool {                                                                                                                                                
   proxy_pass https://127.0.0.1:9980; 
   proxy_set_header Host $http_host;
 }                                                                                                                                                                      
# Admin Console websocket                                                                                                                                               
 location ^~ /cool/adminws {                                                                                                                                            
   proxy_pass https://127.0.0.1:9980;                                                                                                                                   
   proxy_set_header Upgrade $http_upgrade;                                                                                                                              
   proxy_set_header Connection "Upgrade";                                                                                                                               
   proxy_set_header Host $http_host;                                                                                                                                    
   proxy_read_timeout 36000s;                                                                                                                                           
 }                                                                                                                                                                      
}

Gruß
Veit

Hallo Veit,

den Port 9980 leitest Du auch auf der Firewall nach innen weiter?

Beste Grüße

Jörg

hast du die Konfigurationsdatei coolwsd.xml konfiguriert und da die moodledomain eingetragen?
in Moodle muss man nach Änderung der Einstellung auch dann noch den cache löschen.
die hosting/discovery ist ja erreichbar… von dem her glaub ich nicht dass es an Sophos Einstellungen liegt…

ausserdem irritierend, aber ich bin jetzt auch nicht der nginx Experte ist die Zeile in der nginx config
location ~ ^/cool/(.*)/ws$ {

ich werde mal vermuten, das müsste wie bei den anderen Zeilen in der Datei so sein:
location ^~ /cool/(.*)/ws$ {

Der Port 9980 ist auf der Firewall offen und wird weitergeleitet.

Der moodle-rechner steht zwar extern hat aber die selbe Domain. Sollte also in der docker-compose.yml unter domain dabei sein, hab aber jetzt mal folgendes in die docker compose reingeschrieben:

      - domain=([a-z]*.hans-baldung-gymnasium.de|moodle-neu.hans-baldung-gymnasium.de)                                                                                                     

Hat aber auch nichts gebracht. Kann es sein, dass die Bindestriche in der Domainadresse Schwierigkeiten machen?

In der Nginx conf habe ich ~^ mal getauscht, hatte aber keinen Erfolg damit.

Bin also immer noch auf der Suche nach dem Fehler.

die Bindestriche sind wahrscheinlich weniger das Problem. vielleicht die Punkte.
ich wuerde mal in der domain die zusätzlichen backslashes setzen:
moodle-neu\\.hans-baldung-gymnasium\\.de
probieren. zumindest gemäß der offiziellen Collabora-docker-Anleitung muss dies so gemacht sein:
docker run -e "domain=your\\.wopihost\\.com"

Die zwei Backslashs vor dem Punkt haben leider auch nichts gebracht.

Hi,

wenn das Backslash zum maskieren von Sonderzeichen eines regulären Ausdrucks (z. B. der Punkt und das Backslash) dient, dann sollte man „sub\.example\.com“ probieren und nicht „sub\\.example\\.com“, weil letzteres entspräche ja demaskiert dem Wert „sub\.example\.com“ und \ darf in Domains nicht vorkommen.

MfG Buster

Hatte bisher in der Firewall nur einen virtuellen Webserver in WAF definiert gehabt. Da kamen keine Anfragen auf dem Dockerhost unter Port 9980 an. Hab dann eine NAT Regel definiert und jetzt kommen Anfragen auf dem Port an. Allerdings bekomme ich jetzt einen Zertifikatsfehler. Es wird ein localhost Zertifikat ausgeliefert und ich weiß nicht wo das herkommt. Auf dem NGinx Server und dem virtuellen Webserver habe ich ein letsencrypt Zertifikat installiert, aber woher das Zertifikat über den Port 9980 kommt ist mir nicht klar.

Gruß Veit

Hallo Veit,

wenn ich Deine Beschreibung richtig verstehe, dann müsste das Zertifikat vom Dockerhost kommen (auf Port 9980)?

Vielleict kannst Du ja dort noch das Let’s-Encrypt-Zertifikat hinterlegen.

Beste Grüße

Jörg

also ich hatte das in meiner installation zwar nicht über docker am Laufen sondern direkt build from source und hatte als webproxy apache2 genutzt.
aber ich habe im webproxy auch https://meinedomain:9980 drin.
als mögliche Ursache könnt ich mir vorstellen dass da die option ssl.enable=true eingestellt werden sollte wenn man per https von nginx auf den docker leitet und wie Jörg dann sagt, da auch ein Zertifikat hinterlegt sein sollte. nach aussen hin gibt es aber keine zertifkatsfehler. die Verbindung von aussen zu nginx passt.
ich hatte damals auf dem internen collabora server ein Zertifikat einer eigener ca genommen. die standard Einstellung in collabora docker ist dass ein selbsigniertes Zertifikat auf localhost ausgestellt wird. mit dem sollte es aber auch gehen, wenn nginx ein letsencrypt zertifkt nach aussen hat und nginx die Verbindung mit selbsignierten Zertifikat akzeptiert ( ```
proxy_ssl_verify off;