Kein Bilderversand im Gastnetzwerk

1
8335
Monfocus / Pixabay

Vielleicht kennt jemand die Situation, dass in WLAN-Gastnetzwerken so gut wie alle Ports gesperrt sind. Dank der Aktivierung von XEP-0368 auf dem Prosody XMPP-Server konnte ich bisher Nachrichten über den offenen Port 443 versenden. Was aber bisher nicht gelang, war der Versand von Bildern.

Die Lösung hierzu bringt das Modul mod_http_upload_external für Prosody im Zusammenspiel mit dem Prosody Filer von Thomas Leister

Installation

Zuerst legt man einen User namens prosody-filer an

# adduser --disabled-login --disabled-password prosody-filer

und wechselt in dessen Home-Verzeichnis.

# su - prosody-filer

Hier lädt man den prosody-filer und die config.example.toml hinein.

wget https://github.com/ThomasLeister/prosody-filer/releases/download/v1.0.0/prosody-filer
wget https://github.com/ThomasLeister/prosody-filer/blob/master/config.example.toml

Die config.example.toml wird nun in config.toml umbenannt.

mv config.example.toml config.toml

Weiterhin muss das Binary prosody-filer ausführbar gemacht werden.

chmod u+x prosody-filer

Konfiguration Prosody

Das Modul http_upload_external wird wie folgt in die /etc/prosody/prosody.cfg.lua eingetragen:

modules_enabled = {
       ...
       "http_upload_external";
       ...

Weiterhin müssen weitere Zeilen in die Config eingefügt werden (http_uplod ist zu deaktivieren).

http_upload_external_base_url = "https://uploads.myserver.tld/upload/" 
http_upload_external_secret = "mysecret" 
http_upload_external_file_size_limit = 10000000

Passwort und Uploadgröße sind nach Belieben anzupassen. Weiterhin ist die richtige Position dieser drei Zeilen in der Config wichtig, damit das Ganze auch funktioniert. Bei mir sieht das in der prosody.cfg.lua so aus:

pidfile = "/var/run/prosody/prosody.pid"

storage = "sql"

sql = {
    driver = "MySQL";
    database = "prosody";
    host = "localhost";
    username = "bn";
    password = "px";
}

plugin_paths = { "/usr/lib/prosody/prosody-modules" }
 
admins = {"intux@intux.de" }
modules_enabled = {
	"roster";
	"saslauth";
 	"tls";
	"dialback";
	"disco";
	"private";
	"blocklist";
	"version";
	"uptime";
	"time";
	"ping";
	"posix";
	"pep";
	"register";
	"admin_adhoc";
	"motd";
	"welcome";
	"proxy65";
	"watchregistrations";
	"register_web";
	"admin_web";
	"http_upload_external";
	"mam";
	"csi";
	"carbons";
	"smacks";
	"lastlog";
	"cloud_notify";
	"omemo_all_access";
	"server_contact_info";
	"profile";
	"vcard_legacy";
	"pep_vcard_avatar";
	"websocket";
	"bookmarks";
}
 
log = {
 debug = "/var/log/prosody/prosody.log";
 error = "/var/log/prosody/prosody.err";
}
 
legacy_ssl_ports = { 5223 }
 
default_archive_policy = false;
archive_expires_after = "1m";
 
c2s_require_encryption = true  
s2s_require_encryption = true
s2s_secure_auth = true
s2s_secure_domains = { "blabber.im", "trashserver.net", "jabber.de", "c0by.de", "jabber.org", "xmpp.org", "xmpp.maltris.org", "oprtr.org" }
s2s_insecure_domains = {}

http_upload_external_base_url = "https://upload.intux.de/upload/"
http_upload_external_secret = "mysecret"
http_upload_external_file_size_limit = 10000000
 
proxy65_ports = { 55555 }
 
authentication = "internal_hashed"
 
consider_websocket_secure = true;
cross_domain_bosh = true;
consider_bosh_secure = true;

allow_registration = true
register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme";
min_seconds_between_registrations = 300
registration_blacklist = { "83.218.198.86", "109.185.243.100", "93.114.0.93", "93.114.11.136", "92.114.216.80" }

ssl = {
	protocol = "tlsv1_2";
        key = "/etc/prosody/certs/privkey.pem";
        certificate = "/etc/prosody/certs/fullchain.pem";
       
        dhparam = "/etc/prosody/certs/dh-4096.pem";
 
        ciphers = "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:!AES128:!CAMELLIA128";
 
        options = { "no_sslv2", "no_sslv3", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use" }
 
}
 
contact_info = {
  abuse = { "mailto:abuse@intux.de", "xmpp:intux@intux.de" };
  admin = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  feedback = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  sales = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  security = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  support = { "xmpp:admin@intux.de", "xmpp:intux@intux.de" };
}
 
VirtualHost "intux.de"
 
Component "proxy.intux.de" "proxy65"
 
	proxy65_acl = { "intux.de" }
 
Component "conference.intux.de" "muc"
        name = "intux.de Chatrooms"
        restrict_room_creation = false
        max_history_messages = 500
        modules_enabled = {
                "mam_muc",
		"vcard_muc",
        }
        muc_log_by_default = false

Nun wird Prosody mit

# systemctl restart prosody

neu gestartet. Das Passwort in der config.toml und der prosody.cfg.lua müssen übereinstimmen.

Systemd Service einrichten

Nun wird noch ein Service für den Prosody Filer eingerichtet, damit dieser auch nach einem Reboot des Server selbstständig startet. Dazu erstellt man die Datei /etc/systemd/system/prosody-filer.service

# nano /etc/systemd/system/prosody-filer.service

mit folgendem Inhalt:

[Unit]
Description=Prosody file upload server

[Service]
Type=simple
ExecStart=/home/prosody-filer/prosody-filer
Restart=always
WorkingDirectory=/home/prosody-filer
User=prosody-filer
Group=prosody-filer
# Group=nginx  # if the files should get served by nginx directly:

[Install]
WantedBy=multi-user.target

Dann übergibt, aktiviert und startet man den neuen Dienst.

# systemctl daemon-reload
# systemctl enable prosody-filer
# systemctl start prosody-filer

Apache2 Konfiguration

Zu guter Letzt erstellt man noch einen Reverse Proxy. Da ich einen Apache2 laufen habe, zeige ich hier meine Konfiguration unter /etc/apache2/sites-available/upload.intux.de.conf.

<VirtualHost *:80>
    ServerName upload.intux.de
    RedirectPermanent / https://upload.intux.de/
</VirtualHost>

<VirtualHost *:443>
    ServerName upload.intux.de
    SSLEngine on

    SSLCertificateFile /etc/letsencrypt/live/intux.de/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/intux.de/privkey.pem

    Header always set Public-Key-Pins: ''
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
    H2Direct on

    <Location /upload>
        Header always set Access-Control-Allow-Origin "*"
        Header always set Access-Control-Allow-Headers "Content-Type"
        Header always set Access-Control-Allow-Methods "OPTIONS, PUT, GET"

        RewriteEngine On

        RewriteCond %{REQUEST_METHOD} OPTIONS
        RewriteRule ^(.*)$ $1 [R=200,L]
    </Location>

    SSLProxyEngine on

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://localhost:5050/
    ProxyPassReverse / http://localhost:5050/
</VirtualHost>

Wer einen Nginx betreibt, schaut bitte in die Anleitung von Thomas Leister.

Zum Schluss wird der Webserver neu gestartet und der externe HTTP-Upload sollte nun auch in einem Gastnetzwerk funktionieren.

# systemctl restart apache2

Test

Ob der Prosody Filer arbeitet, kann leicht mit

# journalctl -f -u prosody-filer

überprüft werden. Weiterhin gibt die App Conversations über Server-Info Auskunft, ob XEP-0363 aktiviert ist.

1 Kommentar

Kommentieren Sie den Artikel

Bitte bestätige diesen Kommentar!
Bitte den Namen hier eingeben

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.