Som en Microsoft Exchange - fast gratis

19 September, 2019

Man kan givetvis diskutera det lämpliga, eller olämpliga, i att köra en egen e-postserver. De allra flesta nöjer sig med att ha sin e-post på webbhotellet, eller i en molntjänst som iCloud eller hos Google. Det finns också de som är av åsikten att e-post är viktigt och något privat och därför ska man ha kontroll över den och då kan man väl utan omsvep konstatera att företag som Google faller bort tämligen omgående.

Hur som haver är det inte svårt att hitta en programvara att hantera sin e-post med. Det är heller inte svårt att hitta en programvara som gör det gratis. Vad som däremot kan vara lite knivigt är att hitta en e-postserver som är modern och trevlig att använda, inte enbart för dig som administratör utan också för de som faktiskt ska använda den i slutändan.. du vet… svärmor, dina barn och några kompisar. För det brukar bli så med tiden - man har en e-postserver och vips så har det flyttat in 20 personer med sin e-post på den.

Detta är inte en guide till hur du väljer e-postserver. Vissa går all in och bygger den från grunden på en Linux eller FreeBSD-server där varje inställning och justering görs för hand. Andra köper en programvara eller laddar ner ett gratis paket som ger dig hela tjolabaletten uppsatt och klart. Jag har valt att göra ett sorts mellanting mellan de två men det återkommer jag till senare. Detta är inte heller en guide till hur du håller skräppost borta från din e-postserver, för där kan jag varmt rekommendera att du antingen kör ett eget filter för ändamålet (det finns flera att välja mellan, jag rekommenderar helhjärtat EFA) eller så använder du en molntjänst som exempelvis Inumbo som drivs av vännerna på Halon Security.

Jag tänkte sätta igång och pensionera min gamla e-postserver. Den kör programvaran Kerio Connect, och det är egentligen inget fel på Kerio Connect i sig men min licens är från 2015, fortfarande helt laglig att köra, men det innebär också att jag kör en e-postserver från år 2015 som inte är patchad sedan år 2015. Anledningen till att jag aldrig förnyade licensen efter det året var enkelt: företaget som då ägde Kerio Connect gick över till en prenumerationsmodell för att stödja synkronisering av e-post via ActiveSync-protokollet. Stannade man kvar på den version jag kört fram tills idag så ingick det i licensen vilket sannolikt kostade Kerio, som bolaget då hette, ordentliga pengar i form av licensavgifter till Microsoft som i sin tur äger ActiveSync-protokollet. Den version av Kerio Connect jag kör vägrar dessutom låta sig installeras på något nyare än exempelvis CentOS 6.9, vilket är en version av CentOS som är ganska gammal. Kort sagt: det är läge att uppgradera.

Jag satte därför tänderna i Zimbra. Detta är en e-postplattform som har ett antal år på nacken, vilket dels märks i form av dess webbaserade administrationsgränssnitt som inte ens kan göra en mor glad, och dels för att hela klabbet är skrivet i Java. Jodå - du läste rätt: Java. Bortsett från det, och en del annat, så är Zimbra en ganska trevlig e-postplattform. Betalar man för sig får man tonvis med lull-lull som exempelvis nyss nämnda ActiveSync. Kör man gratisvarianten får man det inte.

Varför är då ActiveSync så viktigt? Framförallt handlar det om hur mobila klienter, både iOS och Android, ansluter sig till e-postservrar över Internet. Ska man stödja kalendersynk via Caldav, adressbokssynk via Carddav, IMAP och SMTP till klienter över internet innebär det ett antal portar som ska öppnas i en brandvägg och inte sällan kan det strula eftersom ett protokoll som IMAP gärna kan se lite annorlunda ut beroende på vem som programmerat servern i fråga. Det är som man brukar säga: det som är så bra med standarder är att det finns så många av dem.

ActiveSync löser allt detta. Anslutningen är krypterad över SSL och därmed är det en port, 443, som öppnas. Det är allt. Kalender, kontaktbok, anteckningar och givetvis e-post synkroniseras över detta protokoll och som sylt på pannkakan blir det också enklare för en slutanvändare att faktiskt ansluta sig.

Zimbra i sin gratisversion vill inte prata ActiveSync. Det är i sig inte så konstigt - det måste ju finnas flera goda anledningar till att betala för programvaran och de tjänster som kommer med en betald licens. Men om man inte, eller kan, eller ens måste så kan man få Zimbra att prata ActiveSync, och det är egentligen inte så fasligt svårt.

Installera och konfigurera

Jag förutsätter att du gjort det enda civiliserade valet och installerat Zimbra på CentOS. När detta skrivs har CentOS 7.7 precis landat, när du läser detta kan det vara CentOS 8 eller 9 som gäller. Oavsett vad finns det gott om guider om hur man installerar Zimbra på CentOS så hitta en sådan som är skriven så pass nära i tiden från när du läser den - en guide från 2015 innehåller garanterat saker och ting som inte fungerar längre.

Logga sedan in på din Zimbra-server och skriv följande som root:

wget -O z-push.tar.gz http://download.z-push.org/final/2.3/z-push-2.3.7.tar.gz
mkdir -p /var/www/z-push
tar cf z-push.tar.gz --strip-components=1 -C /var/www/z-push

Nu har du laddat ner och packat upp z-push och lagt filerna på rätt ställe. Dags att installera Z-push backend för Zimbra så du får synkronisering av inte enbart e-post utan också kalender och adressbok:

wget -O zpushzimbra.tar.gz https://sourceforge.net/projects/zimbrabackend/files/latest/download
mkdir -p /var/www/z-push/backend/zimbra
tar xf zpushzimbra.tar.gz -C /var/www/z-push/backend/zimbra

Z-push är skrivet i PHP. Därför måste vi (tyvärr) installera PHP:

yum install -y php-pecl-memcached php-cli php-soap php-process php-mbstring php-fpm -y

När detta aningen obehagliga installationsmoment är ur vägen är det “bara” lite småsaker kvar. Först skapar vi lite kataloger:

mkdir -p /var/log/z-push /var/lib/z-push
chown apache: /var/log/z-push /var/lib/z-push

Nu börjar vi komma till den roliga delen: dags att konfigurera Z-push. Öppna /var/www/z-push/config.php med din favoriteditor och leta fram följande rad:

define('USE_X_FORWARDED_FOR_HEADER', false);

Ändra denna rad till:

define('USE_X_FORWARDED_FOR_HEADER', true);

Därefter ska vi redigera filen /var/www/z-push/backend/zimbra/config.php. Leta fram följande rad:

define('ZIMBRA_URL', 'https://YourZimbraInstallationURL.com');

Denna rad ska ändras till adressen till din Zimbra-server, och notera mycket noga vad du skriver här för det är helt avgörande om det ska fungera. Jag kommer strax till varför. I mitt fall ser raden ut såhär:

define('ZIMBRA_URL', 'https://mail01.fidonet.io');

Bara några ändringar kvar, och detta måste du göra som användaren zimbra. Öppna filen /opt/zimbra/conf/nginx/templates/nginx.conf.web.https.default.template och gör följande ändringar:

location ^~ /Microsoft-Server-ActiveSync
     {
         # Begin stray redirect hack
          
       ......

         # End stray redirect hack
 
-      # Proxy to Zimbra Upstream
-        proxy_pass          ${web.upstream.target};
-        proxy_read_timeout  ${web.upstream.polling.timeout};
-        proxy_buffering     off;
+        # Z-PUSH start
+        include /etc/nginx-php-fpm.conf;
+        # Z-PUSH end

         # For audit
       .......
   }

Där det är ett minustecken till vänster ska raden raderas, plustecken ska raden läggas till.

Som root skapar du sedan filen /etc/nginx-php-fpm.conf med följande innehåll:

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

fastcgi_param   HTTPS                   $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

fastcgi_param HTTP_PROXY "";
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/z-push/index.php;

client_max_body_size 20m;
client_body_buffer_size 128k;
keepalive_timeout  65;

# max_execution_time is 900
proxy_read_timeout 910;
fastcgi_read_timeout 910;

sendfile  on;

Därefter bygger du om Zimbras konfiguration:

sudo -u zimbra /opt/zimbra/bin/zmconfigdctl restart

Aktivera PHP-FPM:

systemctl enable php-fpm
systemctl start php-fpm

… och slutligen startar du om Zimbras proxy:

sudo -u zimbra /opt/zimbra/bin/zmproxyctl restart

Klart? Jodå. Minns du hur jag lite tidigare gav dig rådet att noga lägga på minnet vilken adress du angav till Zimbra-servern i filen /var/www/z-push/backend/zimbra/config.php? Om du lägger upp flera e-postdomäner i Zimbra, vilket är högst sannolikt att du gör, så är det oerhört viktigt att alla dessa kopplas till samma värdnamn

I mitt exempel ovan har jag skapat domänen fidonet.io och kopplar den till mail01.fidonet.io. Skapar jag en domän i Zimbra som heter joacimmelin.se måste även den i Zimbras domänkonfiguration i fältet Public service host name kopplas till det namn din Zimbra-server har, inget annat.

Nu kan du testa att koppla upp din iOS- eller Android-enhet mot din Zimbra-server genom att skapa ett nytt Exchange-konto i enheten. Du kan få mata in servernamn manuellt om du inte skapat DNS-records med autodiscovery och dylikt, och du behöver inte ange något på raden för domän när du skapar Exchange-kontot manuellt i iOS. Har du väldigt många brev i din brevlåda kommer din server att gå på knäna ganska omgående - jag har gett min Zimbra-server fyra processorkärnor och 16 gigabyte minne men när 3-4 stycken ActiveSync-klienter börjar hamra på servern och ska synkronisera sina brevlådor så kommer du snart märka att Zimbra med ActiveSync är som IT-världens Kakmonster och bara vill ha mer.. och mer…

Det var det hela. Lycka till!