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
1 |
# adduser --disabled-login --disabled-password prosody-filer |
und wechselt in dessen Home-Verzeichnis.
1 |
# su - prosody-filer |
Hier lädt man den prosody-filer und die config.example.toml hinein.
1 |
wget https://github.com/ThomasLeister/prosody-filer/releases/download/v1.0.0/prosody-filer |
1 |
wget https://github.com/ThomasLeister/prosody-filer/blob/master/config.example.toml |
Die config.example.toml wird nun in config.toml umbenannt.
1 |
mv config.example.toml config.toml |
Weiterhin muss das Binary prosody-filer ausführbar gemacht werden.
1 |
chmod u+x prosody-filer |
Konfiguration Prosody
Das Modul http_upload_external wird wie folgt in die /etc/prosody/prosody.cfg.lua eingetragen:
1 2 3 4 |
modules_enabled = { ... "http_upload_external"; ... |
Weiterhin müssen weitere Zeilen in die Config eingefügt werden (http_uplod ist zu deaktivieren).
1 2 3 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
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
1 |
# 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
1 |
# nano /etc/systemd/system/prosody-filer.service |
mit folgendem Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[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.
1 2 3 |
# 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<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.
1 |
# systemctl restart apache2 |
Test
Ob der Prosody Filer arbeitet, kann leicht mit
1 |
# journalctl -f -u prosody-filer |
überprüft werden. Weiterhin gibt die App Conversations über Server-Info Auskunft, ob XEP-0363 aktiviert ist.
[…] werden (siehe https://intux.de/2019/05/kein-bilderversand-im-gastnetzwerk/). Die Module WebSocket und BOSH müssen ebenfalls beide aktiviert […]