<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://bitlair.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WilcoBaanHofman</id>
	<title>Hackerspace Bitlair - Gebruikersbijdragen [nl]</title>
	<link rel="self" type="application/atom+xml" href="https://bitlair.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WilcoBaanHofman"/>
	<link rel="alternate" type="text/html" href="https://bitlair.nl/Speciaal:Bijdragen/WilcoBaanHofman"/>
	<updated>2026-04-17T15:51:13Z</updated>
	<subtitle>Gebruikersbijdragen</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2026-04-18_EventInfra_klusdag&amp;diff=13750</id>
		<title>Events/2026-04-18 EventInfra klusdag</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2026-04-18_EventInfra_klusdag&amp;diff=13750"/>
		<updated>2026-04-16T20:23:42Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=EventInfra klusdag&lt;br /&gt;
|picture=Bestand:Wilco-fibre-helmet.jpg&lt;br /&gt;
|start=2026-04-18T14:30:00.000Z&lt;br /&gt;
|end=2026-04-18T21:00:00.000Z&lt;br /&gt;
|location=Hoofdruimte&lt;br /&gt;
|status=Confirmed&lt;br /&gt;
|promote=Ja&lt;br /&gt;
}}&lt;br /&gt;
We gaan met EventInfra op zaterdag 18 april weer klussen aan het volgende:&lt;br /&gt;
&lt;br /&gt;
* 180x Aruba AP&#039;s schoonmaken, labels verwijderen van donateur, config default&lt;br /&gt;
* Fibre splicing van glasvezelkabels welke gerepareerd moeten worden&lt;br /&gt;
* Controle van teruggekomen (na event) &amp;amp; nieuwe Juniper switches&lt;br /&gt;
&lt;br /&gt;
== Voor wie? ==&lt;br /&gt;
Voor iedereen die mee wil helpen &amp;amp; geinteresseerd is :). We leggen het je uit mocht je geen ervaring hebben.&lt;br /&gt;
&lt;br /&gt;
== Food/drinks ==&lt;br /&gt;
Gratis eten/drinken &amp;amp; avondeten voor iedereen die meehelpt.&lt;br /&gt;
&lt;br /&gt;
== Ik doe mee! ==&lt;br /&gt;
* Wheeze&lt;br /&gt;
* AK&lt;br /&gt;
* rewbie&lt;br /&gt;
* killergeek&lt;br /&gt;
* 8. &lt;br /&gt;
* emilia&lt;br /&gt;
* evey&lt;br /&gt;
* trix&lt;br /&gt;
* Samantie&lt;br /&gt;
* Andries&lt;br /&gt;
* Wilco&lt;br /&gt;
* jij?&lt;br /&gt;
&lt;br /&gt;
== Ruimtes ==&lt;br /&gt;
We gebruiken zowel de EventInfra opslag als een aantal tafels in de hoofdruimte; het is geen exclusief event.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=8029</id>
		<title>Projects/Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=8029"/>
		<updated>2022-11-14T12:11:29Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* SPF */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|name=Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto&lt;br /&gt;
|start=2015/03/01&lt;br /&gt;
|contact=WilcoBaanHofman&lt;br /&gt;
|info=This page describes how we set up our mail system and how other people can set up their own full blown modern mail servers.&lt;br /&gt;
|status=Production&lt;br /&gt;
|Picture=Email-icon-vector.jpg&lt;br /&gt;
}}&lt;br /&gt;
This page will talk about how to set up a mail server, and also how to comply with Google mail / gmail&#039;s bizarre, idiotic IPv6 spam policies. &lt;br /&gt;
&lt;br /&gt;
You will need an SPF policy, DKIM and a valid forward/reverse DNS which matches the EHLO your mailserver sends. You will need spam filtering, virus filtering and a valid TLS connection.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Running an external (partial) LDAP slave&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* A (virtual) machine running Debian wheezy or jessie with public IPv4 and IPv6 internet connectivity&lt;br /&gt;
* Possibility to set up reverse DNS for your IPv4 and IPv6 addresses&lt;br /&gt;
* Ability to have a CA sign your certificates (can be done for free with Let&#039;s Encrypt).&lt;br /&gt;
&lt;br /&gt;
== Determine your setup ==&lt;br /&gt;
What kind of setup are you going to run?&lt;br /&gt;
* Single mailserver&lt;br /&gt;
* MTA + Encrypted mail store&lt;br /&gt;
* High-availability setup&lt;br /&gt;
&lt;br /&gt;
=== Single mailserver ===&lt;br /&gt;
In this case, install all packages on the same machine, do not use disk encryption, because your mail server will be unreachable after a power failure.&lt;br /&gt;
&lt;br /&gt;
=== MTA + Encrypted mail store ===&lt;br /&gt;
This is the best scenario for small setups and requires two (virtual) machines, one MTA that handles accepting of emails and spam/virus filtering and one machine that is encrypted. This guide covers this setup. To prepare for this setup, simple install one machine without disk crypto and one with. The MTA will hold mail for up to 3 weeks if you haven&#039;t typed your disk crypto password on boot yet (See the lmtp section).&lt;br /&gt;
&lt;br /&gt;
The setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Encrypted-mailstore.png]]&lt;br /&gt;
&lt;br /&gt;
=== High-availability ===&lt;br /&gt;
Running MTAs in high availability is easy, just duplicate the MTA setup and add two MX records to your domains. (Of course, your bayesian spam filters may train differently..). Running dovecot in high-availability is a different story.. &lt;br /&gt;
&lt;br /&gt;
The safest way to run dovecot in high-availibility mode is to run the mail store on top of a high-performance redundant NAS. This can be a proprietary NAS or some open source HA NFS setup. You will need shared NFS storage. The best performing mailbox format is mdbox, but this is also the easiest store to corrupt the indexes of if two nodes write to it in parallel. Locking may cause performance degradation and has to work reliably on your NFS backend, otherwise the indexes get corrupted. To prevent index corruption and locking overhead, there is the director component, which will pin a user to a node as long as that node is up. The dovecot part of this setup is *not* included in this guide (yet).&lt;br /&gt;
&lt;br /&gt;
This setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Mailserver-HA.png]]&lt;br /&gt;
&lt;br /&gt;
== Install the packages ==&lt;br /&gt;
&lt;br /&gt;
Step 1: Install the required packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install exim4-daemon-heavy spamassassin clamav-daemon greylistd spf-tools-perl sasl2-bin srs pyzor razor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want to run a mailing list server as well, also install mailman and apache2.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install mailman apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If dovecot is going to run on this same host (you&#039;re not doing high-availability or full disk crypto mail store), also install dovecot-imapd, dovecot-ldap and dovecot-lmtpd on the mta. Otherwise, do this on the host(s) where you want to run your dovecot.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-imapd dovecot-ldap dovecot-lmtpd dovecot-sieve dovecot-managesieved&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verify that no interfering packages are installed (like postfix, sendmail, amavis)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ dpkg -l |egrep &#039;(postfix|sendmail|amavis)&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This command should give no output, if it does and starts with ii, remove that package.&lt;br /&gt;
&lt;br /&gt;
== Configuring exim4 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# dpkg-reconfigure exim4-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Choose internet site, set the host name to the value you will set the reverse DNS to, specify all domains you want to receive mail for and choose split files (unless you want to replace every exim4 file name here with exim4.conf.template in this manual).&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim4 ===&lt;br /&gt;
Now try to see if simple address resolution works. This will only test against local system users. It&#039;s good to test this, even if you&#039;re going to add LDAP later.&lt;br /&gt;
Substitute the IP and mail addresses for your own stuff. For now, you can test any local system user @ one of the domains you accepted.&lt;br /&gt;
&lt;br /&gt;
Any line not starting with a number is something you have to type yourself to test this.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:27 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
RCPT TO: &amp;lt;aoeu@bitlair.nl&amp;gt;&lt;br /&gt;
550 Unrouteable address&lt;br /&gt;
QUIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hint; Use let&#039;s encrypt to keep these keys valid.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To generate the key and certificate signing request (replace mail.bitlair.nl with your Fully Qualified Domain Name):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/mail.bitlair.nl-key.pem -out /etc/ssl/mail.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the Common Name field, input your mail hostname (mail.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Copy the certificate signing request to a CA for signing. Allow the CA to sign it, then you&#039;ll receive a certificate from the CA. Place the received certificate in /etc/ssl/mail.your.domain-cert.pem&lt;br /&gt;
&lt;br /&gt;
Put MAIN_TLS_ENABLE=yes near the top in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions and set the following keys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAIN_TLS_CERTIFICATE = /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
MAIN_TLS_PRIVATEKEY = /etc/ssl/private/mail.bitlair.nl-key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the ssl-cert group, allow this group to read in /etc/ssl/private and add the exim user to the ssl-cert group to make sure exim can read the private key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# groupadd --system ssl-cert&lt;br /&gt;
~# chgrp ssl-cert /etc/ssl/private&lt;br /&gt;
~# chmod 750 /etc/ssl/private&lt;br /&gt;
~# usermod -a -G ssl-cert Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download your chain file from your CA. Store the chain file in /etc/ssl/. &lt;br /&gt;
&lt;br /&gt;
Now append its content to /etc/ssl/your-domain-cert.pem. I have a class 2 certificate, so I used this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# cat /etc/ssl/sub.class2.server.sha2.ca.pem &amp;gt;&amp;gt; /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing STARTTLS ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25 &lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
STARTTLS&lt;br /&gt;
220 TLS go ahead&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
STARTTLS should be listed and give a 220 status code.&lt;br /&gt;
&lt;br /&gt;
=== Testing TLS ===&lt;br /&gt;
Unfortunately, openssl s_client does not support IPv6, but this the tests the legacy IP listener as well as TLS:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect mail.bitlair.nl:25 -starttls smtp -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA256&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
Secure Renegotiation IS supported&lt;br /&gt;
Compression: NONE&lt;br /&gt;
Expansion: NONE&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1.2&lt;br /&gt;
    Cipher    : DHE-RSA-AES256-SHA256&lt;br /&gt;
    Session-ID: 82CBCEC7833853A674F6399694A03052566C494E1F6DDC8DE2CD4B3A9F8ED528&lt;br /&gt;
    Session-ID-ctx: &lt;br /&gt;
    Master-Key: BAE67F5D50E5C1C95FBDF355C1BDE18C6251E13F5B8686977292A54657498EFECFF518290211F24F01C40E39929981C4&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    PSK identity: None&lt;br /&gt;
    PSK identity hint: None&lt;br /&gt;
    SRP username: None&lt;br /&gt;
    Start Time: 1426438799&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should give Verify return code 0 at all times. Anything else is wrong.. see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
== SASL Authenticated relay ==&lt;br /&gt;
To enable relaying of messages after authentication, for SPF or just for laptops that are on different connections all the time, SASL authentication needs to be enabled.&lt;br /&gt;
&lt;br /&gt;
=== Enabling other ports than 25 ===&lt;br /&gt;
Port 25 is usually blocked by firewalls, for good reason. An alternative authenticated-only submission port exists on port 587 and a legacy TLS on connect port on 465 also exists.&lt;br /&gt;
&lt;br /&gt;
To enable these, set the following in /etc/default/exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTPLISTENEROPTIONS=&#039;-oX 25:465:587 -oP /var/run/exim4/exim.pid&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions add the following near the top:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tls_on_connect_ports=465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SASL authentication ===&lt;br /&gt;
Set the following to /etc/default/saslauthd, this is the default these days&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start saslauthd.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/exim4/conf.d/auth/30_exim4-config_examples, uncomment the section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plain_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = PLAIN&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth2&lt;br /&gt;
  server_prompts = :&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&lt;br /&gt;
login_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = LOGIN&lt;br /&gt;
  server_prompts = &amp;quot;Username:: : Password::&amp;quot;&lt;br /&gt;
  # don&#039;t send system passwords over unencrypted connections&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth1&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the Debian-exim user to the sasl group.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ swaks -a -tls -q AUTH -s 2a02:2ca0:aaa::a843:657d -au username&lt;br /&gt;
Password: enter_your_password&lt;br /&gt;
=== Trying 2a02:2ca0:aaa::a843:657d:25...&lt;br /&gt;
=== Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
&amp;lt;-  220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 16:04:35 -0400&lt;br /&gt;
 -&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;-  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;-  250-SIZE 52428800&lt;br /&gt;
&amp;lt;-  250-8BITMIME&lt;br /&gt;
&amp;lt;-  250-PIPELINING&lt;br /&gt;
&amp;lt;-  250-STARTTLS&lt;br /&gt;
&amp;lt;-  250 HELP&lt;br /&gt;
 -&amp;gt; STARTTLS&lt;br /&gt;
&amp;lt;-  220 TLS go ahead&lt;br /&gt;
=== TLS started w/ cipher DHE-RSA-AES256-SHA256&lt;br /&gt;
=== TLS peer subject DN=&amp;quot;/C=NL/ST=Utrecht/L=Amersfoort/O=Stichting Bitlair/CN=mail.bitlair.nl&amp;quot;&lt;br /&gt;
 ~&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;~  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;~  250-SIZE 52428800&lt;br /&gt;
&amp;lt;~  250-8BITMIME&lt;br /&gt;
&amp;lt;~  250-PIPELINING&lt;br /&gt;
&amp;lt;~  250-AUTH PLAIN LOGIN&lt;br /&gt;
&amp;lt;~  250 HELP&lt;br /&gt;
 ~&amp;gt; AUTH LOGIN&lt;br /&gt;
&amp;lt;~  334 VXNlcm5hbWU6&lt;br /&gt;
 ~&amp;gt; d2lsY28=&lt;br /&gt;
&amp;lt;~  334 UGFzc3dvcmQ6&lt;br /&gt;
 ~&amp;gt; YmxpZXA=&lt;br /&gt;
&amp;lt;~  235 Authentication succeeded&lt;br /&gt;
 ~&amp;gt; QUIT&lt;br /&gt;
&amp;lt;~  221 mail.bitlair.nl closing connection&lt;br /&gt;
Connection closed with remote host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Authentication succeeded is what you want!&lt;br /&gt;
&lt;br /&gt;
=== DNS block lists ===&lt;br /&gt;
Add CHECK_RCPT_IP_DNSBLS to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt, like my list of DNSBLs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_IP_DNSBLS=cbl.abuseat.org:sbl-xbl.spamhaus.org:psbl.surriel.com:b.barracudacentral.org:dul.dnsbl.sorbs.net:spamsources.fabel.dk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove the whole ifdef CHECK_RCPT_IP_DNSBLS section from /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt and place the following section just before the accept rule with relay_to_domains&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  accept&lt;br /&gt;
    domains      = +local_domains : +relay_to_domains&lt;br /&gt;
    dnslists      = list.dnswl.org&lt;br /&gt;
    logwrite      = $sender_host_address is whitelisted&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = ${sender_host_address} is listed at ${dnslist_domain}; See ${dnslist_text}&lt;br /&gt;
    !hosts = +relay_from_hosts&lt;br /&gt;
    !authenticated = *&lt;br /&gt;
    dnslists = CHECK_RCPT_IP_DNSBLS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information exim4 configuration ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/&lt;br /&gt;
&lt;br /&gt;
== Spamassassin ==&lt;br /&gt;
=== Spamassassin configuration ===&lt;br /&gt;
To enable spamd from spamassassin, set the following in /etc/default/spamassassin (these may already be the default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLED=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And add &amp;quot;-u debian-spamd&amp;quot; to the options, you will get something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OPTIONS=&amp;quot;--create-prefs --max-children 5 --helper-home-dir -u debian-spamd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And also enable the cron rules updates by setting&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRON=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will probably want more terse spam reporting, because it will be in the email headers, to get this, add the following to /etc/spamassassin/local.cf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear_report_template&lt;br /&gt;
report _YESNO_, score=_SCORE_ required=_REQD_ autolearn=_AUTOLEARN_&lt;br /&gt;
report tests=_TESTSSCORES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
While you&#039;re there, you may want to enable the bayesian classifier, and set up razor and pyzor, and fix RFC-ignorant rules.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   Use Bayesian classifier (default: 1)&lt;br /&gt;
#&lt;br /&gt;
use_bayes 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#   Bayesian classifier auto-learning (default: 1)&lt;br /&gt;
#&lt;br /&gt;
bayes_auto_learn 1&lt;br /&gt;
bayes_auto_learn_threshold_nonspam -0.001&lt;br /&gt;
bayes_auto_learn_threshold_spam 8.0&lt;br /&gt;
&lt;br /&gt;
# Use razor and pyzor&lt;br /&gt;
use_razor2 1&lt;br /&gt;
use_pyzor 1&lt;br /&gt;
&lt;br /&gt;
# Disable stupid RFC-incompatible spamassassin SPF_NEUTRAL check. Do not add points for SPF_NEUTRAL, as it should be treated the same as having no SPF record.&lt;br /&gt;
score SPF_NEUTRAL 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now, set up razor and pyzor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -create&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -register&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -discover&lt;br /&gt;
~# pyzor --homedir /etc/mail/spamassassin discover&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart spamassassin.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service spamassassin restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim spamd integration ===&lt;br /&gt;
Uncomment the following line in /etc/exim4/conf.d/main/02_exim4-config_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spamd_address = 127.0.0.1 783&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   warn&lt;br /&gt;
#     spam = Debian-exim:true&lt;br /&gt;
#     add_header = X-Spam_score: $spam_score\n\&lt;br /&gt;
#               X-Spam_score_int: $spam_score_int\n\&lt;br /&gt;
#               X-Spam_bar: $spam_bar\n\&lt;br /&gt;
#               X-Spam_report: $spam_report&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also replace Debian-exim with debian-spamd (case sensitive), change _report to -Status and dash/upper case the rest (See section below for result). To bounce messages, also add this directly below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll get something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  warn&lt;br /&gt;
    spam = debian-spamd:true&lt;br /&gt;
    add_header = X-Spam-Score: $spam_score\n\&lt;br /&gt;
              X-Spam-Score-Int: $spam_score_int\n\&lt;br /&gt;
              X-Spam-Bar: $spam_bar\n\&lt;br /&gt;
              X-Spam-Status: $spam_report&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing spam blocking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ telnet 127.0.0.1 25&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to 127.0.0.1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 13:53:46 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello localhost.localdomain [127.0.0.1]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test            &lt;br /&gt;
&lt;br /&gt;
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
550 This message scored 1002.6 spam points.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here.    &lt;br /&gt;
&lt;br /&gt;
=== More information on spamassassin ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* https://spamassassin.apache.org/&lt;br /&gt;
&lt;br /&gt;
== Antivirus ==&lt;br /&gt;
=== Setting up ClamAV ===&lt;br /&gt;
Update the antivirus database:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# freshclam&lt;br /&gt;
ClamAV update process started at Sun Mar 15 13:57:01 2015&lt;br /&gt;
main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)&lt;br /&gt;
daily.cvd is up to date (version: 20194, sigs: 1348078, f-level: 63, builder: dgoddard)&lt;br /&gt;
bytecode.cvd is up to date (version: 247, sigs: 41, f-level: 63, builder: dgoddard)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will get a message about outdated ClamAV if you do not have the latest version from stable-updates. Make sure you have it in your sources list and preferably in the unattended-upgrades list. Also see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
If you get a message about freshclam.log being locked, this means the clamav database is already up to date, check the freshclam.log for any warnings, like &amp;quot;your version is OUTDATED&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Add clamav to the Debian-exim group, so that clamav-daemon can read the message to scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/clamav/clamd.conf set clamav to use the supplementary group (it may be already enabled by default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowSupplementaryGroups true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart clamav-daemon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service clamav-daemon restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim clamd integration ===&lt;br /&gt;
In /etc/exim4/conf.d/main/02_exim4-config_options, uncomment the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
av_scanner = clamd:/var/run/clamav/clamd.ctl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    malware = *&lt;br /&gt;
    message = This message was detected as possible malware ($malware_name).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the exim4 config and restart exim.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 14:10:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test&lt;br /&gt;
&lt;br /&gt;
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*&lt;br /&gt;
.&lt;br /&gt;
550 This message was detected as possible malware (Eicar-Test-Signature).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here. This is good.&lt;br /&gt;
&lt;br /&gt;
=== More information on ClamAV ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-content_scanning_at_acl_time.html&lt;br /&gt;
* http://www.clamav.net/index.html&lt;br /&gt;
&lt;br /&gt;
== Setting up DKIM ==&lt;br /&gt;
Contrary to SPF and DMARC, DKIM is actually a good idea. This does not break the internet, I advise everyone to implement DKIM.&lt;br /&gt;
=== Configuring exim for DKIM ===&lt;br /&gt;
The first step to getting DKIM working, is generating an RSA key for DKIM. You will be tempted to use a large key here, but given that you have to add the public key to DNS, do not use more than 1024-bit keys. If you want to use stronger cryptography for this in the future, please consider contributing to the support of ECC crypto in DKIM.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# mkdir -m 0750 /etc/exim4/dkim_keys&lt;br /&gt;
~# chown root:Debian-exim /etc/exim4/dkim_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To generate the RSA key pair (repeat per domain): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl genrsa -out /etc/exim4/dkim_keys/bitlair.nl.private.pem 1024&lt;br /&gt;
~# openssl rsa -in /etc/exim4/dkim_keys/bitlair.nl.private.pem -out /etc/exim4/dkim_keys/bitlair.nl.public.pem -pubout -outform PEM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following to the top of /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM_DOMAIN =  ${domain:$return_path}&lt;br /&gt;
DKIM_SELECTOR = exim&lt;br /&gt;
DKIM_FILE = /etc/exim4/dkim_keys/${lc:${domain:$return_path}}.private.pem&lt;br /&gt;
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}&lt;br /&gt;
DKIM_CANON = relaxed&lt;br /&gt;
DKIM_STRICT = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring DNS for DKIM ===&lt;br /&gt;
Update your DNS zones to have the following records:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exim._domainkey    IN    TXT   v=DKIM1; k=rsa; p=MIGfMA... &amp;lt;- your base64-encoded public key here&lt;br /&gt;
_domainkey         IN    TXT   o=~;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Send an email to yourself from your MTA, you should see DKIM headers added to your message, to verify if it really checks out, send an email to check-auth@verifier.port25.com from your MTA. &lt;br /&gt;
&lt;br /&gt;
It should respond with something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM check:         pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on DKIM ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.iodigitalsec.com/exim-dkim-and-debian-configuration/&lt;br /&gt;
* http://mikepultz.com/2010/02/using-dkim-in-exim/&lt;br /&gt;
* https://www.debian-administration.org/users/lee/weblog/41&lt;br /&gt;
* http://www.dkim.org/&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
Please note, before you add SPF: SPF is very broken. It assumes that people do not forward e-mail. It breaks .forward files, procmail forwards, etc. There is a remedy, called Sender Rewriting Scheme, but people are generally not aware of this. If you want to forward to gmail.com, which is known broken, because it mandates SPF records. &lt;br /&gt;
=== Adding SPF to your domain ===&lt;br /&gt;
You can set limits on who can send on behalf of your domain using DNS. However, extremely few mail forwards have implemented SRS. As stated on wikipedia: &amp;quot;Publishers of SPF FAIL policies must accept the risk that their legitimate emails are being rejected or bounced. They should test (e.g., with a SOFTFAIL policy) until they are satisfied with the results.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, adding SPF to your domain adds to the legitimacy of your domain, and will decrease your chances of getting into a spam box. So it would be wise to set an SPF policy of allowing your mailservers and hosts under your domain, but so fail softly. Neutral means a pass on SPF for spammers, making their mail authenticated and thus ruining your reputation. -all is guaranteed to break plain mail forwarding. ~all will make sure most of your mail works..&lt;br /&gt;
&lt;br /&gt;
To have an SPF policy, I advise to not use a softfail, so that spammers are not legitimately mailing from your reputation, configure a record like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ IN TXT &amp;quot;v=spf1 a mx ~all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will ensure that hosts under your domain can pass SPF, as can your mailservers, but it is neutral for other, potentially forwarding hosts.&lt;br /&gt;
&lt;br /&gt;
=== Adding Sending Rewriting Scheme (SRS) ===&lt;br /&gt;
Be careful with mail forwards, make sure your spam rules are set strictly enough, because your mail server reputation with gmail depends on forwarding mostly non-spam. If you want to do mail forwards to gmail, you need to implement SRS, because gmail on IPv6 is a known broken SPF mail system.&lt;br /&gt;
&lt;br /&gt;
==== Installing srsd ====&lt;br /&gt;
Create /etc/init.d/srsd with content:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          srsd&lt;br /&gt;
# Required-Start:    &lt;br /&gt;
# Required-Stop:     &lt;br /&gt;
# Should-Start:      &lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: SRS daemon&lt;br /&gt;
# Description:       SRS daemon&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# /etc/init.d/srsd: start and stop the srsd daemon&lt;br /&gt;
&lt;br /&gt;
DAEMON=/usr/bin/srsd&lt;br /&gt;
USER=Debian-exim&lt;br /&gt;
SECRETFILE=/etc/srsd.secret&lt;br /&gt;
PIDFILE=/var/run/srsd.pid&lt;br /&gt;
SOCKETFILE=/tmp/srsd&lt;br /&gt;
SRSD_OPTS=&amp;quot;--secretfile ${SECRETFILE}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test -x $DAEMON || exit 0&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
srsd_start() {&lt;br /&gt;
    if start-stop-daemon --start --quiet --background \&lt;br /&gt;
        --chuid $USER \&lt;br /&gt;
        --pidfile $PIDFILE --make-pidfile \&lt;br /&gt;
        --exec $DAEMON \&lt;br /&gt;
        -- $SRSD_OPTS&lt;br /&gt;
    then&lt;br /&gt;
        rc=0&lt;br /&gt;
        sleep 1&lt;br /&gt;
        if ! kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
            log_failure_msg &amp;quot;srsd daemon failed to start&amp;quot;&lt;br /&gt;
            rc=1&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        rc=1&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $rc -eq 0 ]; then&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
    else&lt;br /&gt;
        log_end_msg 1&lt;br /&gt;
        rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
} # srsd_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
    log_daemon_msg &amp;quot;Starting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        log_progress_msg &amp;quot;apparently already running&amp;quot;&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
        exit 0&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
  stop)&lt;br /&gt;
    log_daemon_msg &amp;quot;Stopping srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE&lt;br /&gt;
    log_end_msg $?&lt;br /&gt;
    rm -f $PIDFILE&lt;br /&gt;
    rm -f $SOCKETFILE&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  restart)&lt;br /&gt;
    set +e&lt;br /&gt;
    log_daemon_msg &amp;quot;Restarting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || true&lt;br /&gt;
        sleep 1&lt;br /&gt;
    else&lt;br /&gt;
        log_warning_msg &amp;quot;srsd daemon not running, attempting to start.&amp;quot;&lt;br /&gt;
            rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  status)&lt;br /&gt;
    status_of_proc -p $PIDFILE &amp;quot;$DAEMON&amp;quot; srsd&lt;br /&gt;
    exit $?    # notreached due to set -e&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    echo &amp;quot;Usage: /etc/init.d/srsd {start|stop|restart|status}&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now make it executable and run at boot time.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# chmod 755 /etc/init.d/srsd&lt;br /&gt;
~# update-rc.d srsd defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Generate a new random secret:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# touch /etc/srsd.secret&lt;br /&gt;
~# chown Debian-exim /etc/srsd.secret&lt;br /&gt;
~# chmod 600 /etc/srsd.secret&lt;br /&gt;
~# openssl rand -base64 12 &amp;gt; /etc/srsd.secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Start srsd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service srsd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Implement srsd integration into exim4 ====&lt;br /&gt;
Create a file in /etc/exim4/conf.d/router/175_exim4-config_srs with the following content, replace spf-must-die.org to your own SRS rewriting domain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srs_bounce:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_bounce for $local_part@$domain&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  domains = spf-must-die.org&lt;br /&gt;
  local_part_prefix = srs0+ : srs0- : srs0= : srs1+ : srs1- : srs1=&lt;br /&gt;
  caseful_local_part&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}{REVERSE $local_part_prefix$local_part@$domain}{5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  data = ${if match{$address_data}{^ERROR}{:fail: Invalid SRS address}{$address_data}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
srs_forward:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_forward for $local_part@$domain&amp;quot;&lt;br /&gt;
  no_verify&lt;br /&gt;
  senders = ! : ! *@+local_domains&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}\&lt;br /&gt;
                {FORWARD $sender_address_local_part@$sender_address_domain spf-must-die.org\n}\&lt;br /&gt;
                                        {5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&lt;br /&gt;
  headers_add = &amp;quot;X-SRS: Sender address rewritten from &amp;lt;$sender_address&amp;gt; to &amp;lt;${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&amp;gt; by $primary_hostname.&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  repeat_use = false&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${quote_local_part:$local_part}@$domain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Testing the SRS forwarding ====&lt;br /&gt;
Create an alias in /etc/aliases to your own mailbox, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user: your@email.address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
run newaliases to regenerate the hash table&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newaliases&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now try to send email to user@your-mail-server.&lt;br /&gt;
&lt;br /&gt;
You should get it in your mailbox.. look at the message source, you will see the following headers if DKIM and SRS are working (note the d=rewriting domain):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Return-Path: &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt;&lt;br /&gt;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=spf-must-die.org; s=exim;&lt;br /&gt;
        h=Content-Type:Subject:To:MIME-Version:From:Date:Message-ID; bh=Nh/X++v9YcgLCxTBH1lYXZg22kWTVrM8UJ+92lkoOFQ=;&lt;br /&gt;
        b=eC+zN8okGJYoNUgllB9TUb9XDmHVIWYwFiIC+m2gcji5zlM+LIDYEz0Z6tAdZt1vUhugefB7DCLos6aiKwP/jShm2Cn4XTY4U+i0WG1wxf3L9wp8bs1bfo1oJLaI8iyNuSGnUDbQspWwJj1toXp2J1nGkV2MeagggaGr7+GLXro=;&lt;br /&gt;
X-SRS: Sender address rewritten from &amp;lt;wilco@baanhofman.nl&amp;gt; to &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt; by mail.bitlair.nl.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable SPF checking ===&lt;br /&gt;
Enabling SPF checking will break mail forwarding to your domain without SRS on domains that have a fail configured. This will likely block much legitimate e-mail, but if you want to forward to the big players, it&#039;s nearly mandatory to do..&lt;br /&gt;
&lt;br /&gt;
To enable inbound SPF checking, add the following to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_SPF=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be careful if you have servers relaying e-mail for you (for instance because your mail server is IPv6 only and want to receive e-mail on IPv4 or as a fallback mailserver). You need to add all addresses of those servers to /etc/exim4/host_local_deny_exceptions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note, there is a bug in the debian default SPF check, causing to bounce mail from senders that use HELO macros, like exists:_i.%{i}._h.%{h}._o.%{o}._spf.belastingdienst.nl .. So, to fix, find the following in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {--scope helo --identity ${quote:$sender_helo_name}}}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace it with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {}} --scope helo --identity ${quote:$sender_helo_name}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing SPF checking===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 29 Mar 2015 14:37:47 +0200&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;spf-test@openspf.net&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
550-[SPF] 2001:41d0:52:300::107c is not allowed to send mail from openspf.net. &lt;br /&gt;
550 Please see http://www.openspf.org/Why?scope=mfrom;identity=spf-test@openspf.net;ip=2001:41d0:52:300::107c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see a 550 reject here when there is an SPF FAIL.&lt;br /&gt;
&lt;br /&gt;
=== More information on SPF and SRS ===&lt;br /&gt;
&lt;br /&gt;
* https://www.assembla.com/wiki/show/file_sender/Configuring_SRS_with_Exim_(Debian_and_Ubuntu)&lt;br /&gt;
* https://github.com/Exim/exim/wiki/SRS&lt;br /&gt;
* http://www.openspf.org/SPF_Record_Syntax&lt;br /&gt;
&lt;br /&gt;
== Greylisting ==&lt;br /&gt;
Greylisting is bouncing all email from new senders with a temporary failure code. Implementing this helps a good deal against spammers, at the cost of having to wait for an email from a new sender.&lt;br /&gt;
&lt;br /&gt;
=== Set up exim ===&lt;br /&gt;
To set up configuration, simply do&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# greylistd-setup-exim4 add&lt;br /&gt;
~# service greylistd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, if you want to skip greylisting on dnswl listed hosts, which I recommend: add the following line to the defer and deny sections about greylisting in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    !dnslists = list.dnswl.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will override your local greylistd blacklist and override greylisting for known good senders.&lt;br /&gt;
&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 15:27:34 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
451-2a02:2ca0:aaa::a843:657d is not yet authorized to deliver mail from&lt;br /&gt;
451 &amp;lt;wilco@bitlair.nl&amp;gt; to &amp;lt;wilco@bitlair.nl&amp;gt;. Please try later.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
451 is the temporary failure error, this is the desired behaviour.&lt;br /&gt;
&lt;br /&gt;
=== More information on Greylisting ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
Be careful with DMARC, as DMARC with p=reject breaks your outbound e-mail even further than SPF. With p=reject, you will no longer be able to use mailing lists or mail forwarders, even those with SRS enabled. DMARC checks the &#039;From:&#039; header, instead of the envelope sender of the mail, so setting DMARC policies will break all of your forwarding, and will make sure that your mail does not reach its destination. I also recommend that you reject all mail with a DMARC policy set on your mailing lists, because the bounces will cause your members to bounce off the mailing list.&lt;br /&gt;
&lt;br /&gt;
Enable this if the risk of impersonation/identity fraud is greater than the risk of your outgoing emails not arriving at their destination. So, if you are paypal, a bank, linkedin, twitter or facebook.. or using this for internal mail only or to signal that nobody should be sending mail on behalf of a domain. If you do not have full control over your users&lt;br /&gt;
&lt;br /&gt;
It does have useful features, like reporting, so setting a p=none can add at least some value to your mail setup.&lt;br /&gt;
&lt;br /&gt;
=== Set up a mailbox ===&lt;br /&gt;
&lt;br /&gt;
Create a user in whatever system you&#039;re using. If you&#039;re not using LDAP or MySQL or something, this should do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd dmarc&lt;br /&gt;
~# passwd dmarc&lt;br /&gt;
Enter new UNIX password: &lt;br /&gt;
Retype new UNIX password: &lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running a remote mailstore without LDAP/MySQL backend, this procedure has to be repeated on the mail store.&lt;br /&gt;
&lt;br /&gt;
=== Publish a DMARC policy ===&lt;br /&gt;
You can add the following DMARC policy to your domain. p=none is important!&lt;br /&gt;
&lt;br /&gt;
_dmarc     IN     TXT     &amp;quot;v=DMARC1; p=none; rua=dmarc@bitlair.nl; ruf=dmarc@bitlair.nl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Doing something useful with the reports ===&lt;br /&gt;
This section is TODO. I haven&#039;t found a good tool yet.&lt;br /&gt;
&lt;br /&gt;
=== More information on DMARC ===&lt;br /&gt;
* http://lists.dmarc.org/pipermail/dmarc-discuss/2014-April/002445.html&lt;br /&gt;
* http://dmarc.org/overview/&lt;br /&gt;
&lt;br /&gt;
== LDAP integration ==&lt;br /&gt;
This assumes you already have an LDAP running. To set one up, please see the spacefed guide.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
Load the qmail LDAP schema:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# ldapadd -H ldapi:/// -Y EXTERNAL &amp;lt;&amp;lt; EOF&lt;br /&gt;
dn: cn=qmail,cn=schema,cn=config&lt;br /&gt;
objectClass: olcSchemaConfig&lt;br /&gt;
cn: {4}qmail&lt;br /&gt;
olcAttributeTypes: {0}( 1.3.6.1.4.1.7914.1.2.1.1 NAME &#039;qmailUID&#039; DESC &#039;UID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {1}( 1.3.6.1.4.1.7914.1.2.1.2 NAME &#039;qmailGID&#039; DESC &#039;GID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {2}( 1.3.6.1.4.1.7914.1.2.1.3 NAME &#039;mailMessageStore&#039; DESC &lt;br /&gt;
 &#039;Path to the maildir/mbox on the mail system&#039; EQUALITY caseExactIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SIN&lt;br /&gt;
 GLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {3}( 1.3.6.1.4.1.7914.1.2.1.4 NAME &#039;mailAlternateAddress&#039; D&lt;br /&gt;
 ESC &#039;Secondary (alias) mailaddresses for the same user&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {4}( 1.3.6.1.4.1.7914.1.2.1.5 NAME &#039;mailQuota&#039; DESC &#039;The am&lt;br /&gt;
 ount of space the user can use until all further messages get bounced.&#039; SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {5}( 1.3.6.1.4.1.7914.1.2.1.6 NAME &#039;mailHost&#039; DESC &#039;On whic&lt;br /&gt;
 h qmail server the messagestore of this user is located.&#039; EQUALITY caseIgnore&lt;br /&gt;
 IA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.&lt;br /&gt;
 1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {6}( 1.3.6.1.4.1.7914.1.2.1.7 NAME &#039;mailForwardingAddress&#039; &lt;br /&gt;
 DESC &#039;Address(es) to forward all incoming messages to.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {7}( 1.3.6.1.4.1.7914.1.2.1.8 NAME &#039;deliveryProgramPath&#039; DE&lt;br /&gt;
 SC &#039;Program to execute for all incoming mails.&#039; EQUALITY caseExactIA5Match SU&lt;br /&gt;
 BSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {8}( 1.3.6.1.4.1.7914.1.2.1.9 NAME &#039;qmailDotMode&#039; DESC &#039;Int&lt;br /&gt;
 erpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog&#039; EQUALITY &lt;br /&gt;
 caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {9}( 1.3.6.1.4.1.7914.1.2.1.10 NAME &#039;deliveryMode&#039; DESC &#039;mu&lt;br /&gt;
 lti field entries of: nolocal, noforward, noprogram, reply&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )&lt;br /&gt;
olcAttributeTypes: {10}( 1.3.6.1.4.1.7914.1.2.1.11 NAME &#039;mailReplyText&#039; DESC &#039;&lt;br /&gt;
 A reply text for every incoming message&#039; EQUALITY caseIgnoreMatch SUBSTR case&lt;br /&gt;
 IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE&lt;br /&gt;
  )&lt;br /&gt;
olcAttributeTypes: {11}( 1.3.6.1.4.1.7914.1.2.1.12 NAME &#039;accountStatus&#039; DESC &#039;&lt;br /&gt;
 The status of a user account: active, noaccess, disabled, deleted&#039; EQUALITY c&lt;br /&gt;
 aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {12}( 1.3.6.1.4.1.7914.1.2.1.14 NAME &#039;qmailAccountPurge&#039; DE&lt;br /&gt;
 SC &#039;The earliest date when a mailMessageStore will be purged&#039; EQUALITY numeri&lt;br /&gt;
 cStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {13}( 1.3.6.1.4.1.7914.1.2.1.15 NAME &#039;mailQuotaSize&#039; DESC &#039;&lt;br /&gt;
 The size of space the user can have until further messages get bounced.&#039; EQUA&lt;br /&gt;
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {14}( 1.3.6.1.4.1.7914.1.2.1.16 NAME &#039;mailQuotaCount&#039; DESC &lt;br /&gt;
 &#039;The number of messages the user can have until further messages get bounced.&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {15}( 1.3.6.1.4.1.7914.1.2.1.17 NAME &#039;mailSizeMax&#039; DESC &#039;Th&lt;br /&gt;
 e maximum size of a single messages the user accepts.&#039; EQUALITY integerMatch &lt;br /&gt;
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {16}( 1.3.6.1.4.1.7914.1.3.1.1 NAME &#039;dnmember&#039; DESC &#039;Group &lt;br /&gt;
 member specified as distinguished name.&#039; EQUALITY distinguishedNameMatch SYNT&lt;br /&gt;
 AX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {17}( 1.3.6.1.4.1.7914.1.3.1.2 NAME &#039;rfc822member&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA5Ma&lt;br /&gt;
 tch SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{&lt;br /&gt;
 256} )&lt;br /&gt;
olcAttributeTypes: {18}( 1.3.6.1.4.1.7914.1.3.1.3 NAME &#039;filtermember&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} )&lt;br /&gt;
olcAttributeTypes: {19}( 1.3.6.1.4.1.7914.1.3.1.4 NAME &#039;senderconfirm&#039; DESC &#039;S&lt;br /&gt;
 ender to Group has to answer confirmation email.&#039; EQUALITY booleanMatch SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {20}( 1.3.6.1.4.1.7914.1.3.1.5 NAME &#039;membersonly&#039; DESC &#039;Sen&lt;br /&gt;
 der to Group must be group member itself.&#039; EQUALITY booleanMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {21}( 1.3.6.1.4.1.7914.1.3.1.6 NAME &#039;confirmtext&#039; DESC &#039;Tex&lt;br /&gt;
 t that will be sent with sender confirmation email.&#039; EQUALITY caseIgnoreMatch&lt;br /&gt;
  SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} &lt;br /&gt;
 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {22}( 1.3.6.1.4.1.7914.1.3.1.7 NAME &#039;dnmoderator&#039; DESC &#039;Gro&lt;br /&gt;
 up moderator specified as Distinguished name.&#039; EQUALITY distinguishedNameMatc&lt;br /&gt;
 h SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {23}( 1.3.6.1.4.1.7914.1.3.1.8 NAME &#039;rfc822moderator&#039; DESC &lt;br /&gt;
 &#039;Group moderator specified as normal rfc822 email address.&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12&lt;br /&gt;
 1.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {24}( 1.3.6.1.4.1.7914.1.3.1.9 NAME &#039;moderatortext&#039; DESC &#039;T&lt;br /&gt;
 ext that will be sent with request for moderation email.&#039; EQUALITY caseIgnore&lt;br /&gt;
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4&lt;br /&gt;
 096} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {25}( 1.3.6.1.4.1.7914.1.3.1.10 NAME &#039;dnsender&#039; DESC &#039;Allow&lt;br /&gt;
 ed sender specified as distinguished name.&#039; EQUALITY distinguishedNameMatch S&lt;br /&gt;
 YNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {26}( 1.3.6.1.4.1.7914.1.3.1.11 NAME &#039;rfc822sender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {27}( 1.3.6.1.4.1.7914.1.3.1.12 NAME &#039;filtersender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match S&lt;br /&gt;
 UBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {28}( 1.3.6.1.4.1.7914.1.4.1.1 NAME &#039;qladnmanager&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {29}( 1.3.6.1.4.1.7914.1.4.1.2 NAME &#039;qlaDomainList&#039; DESC &#039;&#039;&lt;br /&gt;
  EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {30}( 1.3.6.1.4.1.7914.1.4.1.3 NAME &#039;qlaUidPrefix&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.&lt;br /&gt;
 1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {31}( 1.3.6.1.4.1.7914.1.4.1.4 NAME &#039;qlaQmailUid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {32}( 1.3.6.1.4.1.7914.1.4.1.5 NAME &#039;qlaQmailGid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {33}( 1.3.6.1.4.1.7914.1.4.1.6 NAME &#039;qlaMailMStorePrefix&#039; D&lt;br /&gt;
 ESC &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX&lt;br /&gt;
  1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {34}( 1.3.6.1.4.1.7914.1.4.1.7 NAME &#039;qlaMailQuotaSize&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {35}( 1.3.6.1.4.1.7914.1.4.1.8 NAME &#039;qlaMailQuotaCount&#039; DES&lt;br /&gt;
 C &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {36}( 1.3.6.1.4.1.7914.1.4.1.9 NAME &#039;qlaMailSizeMax&#039; DESC &#039;&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {37}( 1.3.6.1.4.1.7914.1.4.1.10 NAME &#039;qlaMailHostList&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.&lt;br /&gt;
 3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcObjectClasses: {0}( 1.3.6.1.4.1.7914.1.2.2.1 NAME &#039;qmailUser&#039; DESC &#039;QMail-L&lt;br /&gt;
 DAP User&#039; SUP top AUXILIARY MUST mail MAY ( uid $ mailMessageStore $ homeDire&lt;br /&gt;
 ctory $ userPassword $ mailAlternateAddress $ qmailUID $ qmailGID $ mailHost &lt;br /&gt;
 $ mailForwardingAddress $ deliveryProgramPath $ qmailDotMode $ deliveryMode $&lt;br /&gt;
  mailReplyText $ accountStatus $ qmailAccountPurge $ mailQuotaSize $ mailQuot&lt;br /&gt;
 aCount $ mailSizeMax ) )&lt;br /&gt;
olcObjectClasses: {1}( 1.3.6.1.4.1.7914.1.3.2.1 NAME &#039;qmailGroup&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Group&#039; SUP top AUXILIARY MUST ( mail $ mailAlternateAddress $ mailMessag&lt;br /&gt;
 eStore ) MAY ( dnmember $ rfc822member $ filtermember $ senderconfirm $ membe&lt;br /&gt;
 rsonly $ confirmtext $ dnmoderator $ rfc822moderator $ moderatortext $ dnsend&lt;br /&gt;
 er $ rfc822sender $ filtersender ) )&lt;br /&gt;
olcObjectClasses: {2}( 1.3.6.1.4.1.7914.1.4.2.1 NAME &#039;qldapAdmin&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Subtree Admin&#039; SUP top AUXILIARY MUST ( qlaDnManager $ qlaDomainList $ q&lt;br /&gt;
 laMailMStorePrefix $ qlaMailHostList ) MAY ( qlaUidPrefix $ qlaQmailUid $ qla&lt;br /&gt;
 QmailGid $ qlaMailQuotaSize $ qlaMailQuotaCount $ qlaMailSizeMax ) )&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Exim LDAP integration ===&lt;br /&gt;
Add the following two routers:&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/450_exim4-config_ldap_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=That would be dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?mailForwardingAddress?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/451_exim4-config_ldap_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=Still not that dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/454_exim4-config_ldap_accept:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_accept:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  condition = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (uid=${quote_ldap:$local_part})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  transport = lmtp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want wildcard domain matching for your domain add the following (Note: to use wildcards in LDAP set the attribute 		&lt;br /&gt;
mail or mailAlternateAddress to @domain.tld):&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/452_exim4-config_ldap_wildcard_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/453_exim4-config_ldap_wildcard_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim LDAP integration ===&lt;br /&gt;
To run a lookup: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bt -d+lookup wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To assemble to proper query: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -be&lt;br /&gt;
&amp;gt; ${lookup ldapm{ user=bla pass=bla ldaps://your.ldap.server/dc=your,dc=basedn?mail?sub?mail=wilco@bitlair.nl}}&lt;br /&gt;
wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give you back your email address.&lt;br /&gt;
&lt;br /&gt;
=== Saslauthd LDAP integration ===&lt;br /&gt;
&lt;br /&gt;
Change the mechanisms to ldap in /etc/default/saslauthd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MECHANISMS=&amp;quot;ldap&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Write up a configuration file like this in /etc/saslauthd.conf (use your own LDAP settings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_bind_dn: cn=exim,ou=System,dc=bitlair,dc=nl&lt;br /&gt;
ldap_bind_pw: Your password&lt;br /&gt;
ldap_servers: ldaps://ldap.bitlair.nl/&lt;br /&gt;
ldap_search_base: dc=bitlair,dc=nl&lt;br /&gt;
ldap_filter: (&amp;amp;(objectclass=posixAccount)(uid=%u))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart saslauthd.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing saslauthd LDAP integration ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# testsaslauthd -u johndoe -p secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give back something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: OK &amp;quot;Success.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next up is testing SASL exim, see the SASL integration section for exim, above here.&lt;br /&gt;
&lt;br /&gt;
=== More information on LDAP integration ===&lt;br /&gt;
* https://spacefed.net/wiki/index.php/Howto/Spacenet/Setup_LDAP&lt;br /&gt;
* http://blog.toxa.de/archives/493&lt;br /&gt;
* http://www.slideshare.net/jpmens/exim-and-ldap-1829032&lt;br /&gt;
&lt;br /&gt;
== LMTP delivery ==&lt;br /&gt;
If you want to deliver your e-mail via LMTP, just set dc_localdelivery=&#039;lmtp&#039; in update-exim4.conf.conf. Then follow either the local or remote delivery section of this guide. Using the remote delivery section has the advantage of allowing full disk crypto on the mail store. You cannot do this on the MTA, because it needs to power on automatically to accept new emails instantly.&lt;br /&gt;
&lt;br /&gt;
=== Local delivery ===&lt;br /&gt;
For local delivery to dovecot, add this section in /etc/exim4/conf.d/transport/40-exim4_config-lmtp (create it if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
        driver = lmtp&lt;br /&gt;
        socket = /var/run/dovecot/lmtp&lt;br /&gt;
        #maximum number of deliveries per batch, default 1&lt;br /&gt;
        batch_max = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For remote delivery with 3 week hold function via LMTP ===&lt;br /&gt;
Setting up remote delivery via LMTP makes sense, because you can have your mail store encrypted and still receive new emails, because the MTA will keep accepting mails.&lt;br /&gt;
To set this up, update exim&#039;s retry policy for ::1, so that the MTA will hold on to temporarily failed e-mail deliveries for 3 weeks and will retry every 5 minutes.&lt;br /&gt;
&lt;br /&gt;
Add the following in /etc/exim4/conf.d/retry/30_exim4-config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
::::1  *           F,3w,5m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In transport/40-exim4-config-lmtp, add/modify the lmtp section to match this (create the file if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
  driver = smtp&lt;br /&gt;
  protocol = lmtp&lt;br /&gt;
  port = 24&lt;br /&gt;
  hosts = ::::1&lt;br /&gt;
  allow_localhost&lt;br /&gt;
  return_path_add&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will deliver to localhost on port 24. If you want to use a mail store with full disk crypto seperate from your Mail Transfer Agent, configure a secure tunnel from local port 24 to the LDA. That&#039;s because LMTP with crypto is not supported properly by dovecot.. and exim4 does not support delivery to TLS-on-connect secure tunnels.. so.. we will configure a pair of stunnels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dovecot doesn&#039;t support TLS for LMTP, so install stunnel4 using apt-get install stunnel4 on both the mailstore and the MTA machine. To properly do this, first set up a CA on the mail store with a client cert for all of your MTAs.&lt;br /&gt;
&lt;br /&gt;
The easiest way to set up a CA (use a descriptive name as common name, e.g. My LMTP client CA):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ mkdir CA&lt;br /&gt;
~$ cd CA&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newca&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newreq-nodes&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -signreq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will result in a newcert.pem and newkey.pem which need to be transferred to the MTA in /etc/ssl/lmtpcert.pem and /etc/ssl/private/lmtpkey.pem, and in demoCA/cacert.pem is the CA you just created, copy that to /etc/ssl/lmtpca.pem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the MTA, create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
verify = 2&lt;br /&gt;
CAfile = /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
cert = /etc/ssl/lmtpcert.pem&lt;br /&gt;
key = /etc/ssl/private/lmtpkey.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
client = yes&lt;br /&gt;
accept = ::1:24&lt;br /&gt;
connect = imap.bitlair.nl:24&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The other end (in this case dovecot), should have a similar stunnel4 setup. Note that the IMAP certificate is generated in the dovecot section (further down).&lt;br /&gt;
&lt;br /&gt;
Create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
&lt;br /&gt;
cert = /etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
key = /etc/ssl/private/imap.bitlair.nl-key.pem&lt;br /&gt;
CAfile = /etc/ssl/lmtpca.pem&lt;br /&gt;
verify = 2&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
accept  = :::24&lt;br /&gt;
connect = /var/run/dovecot/lmtp&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now on both the MTA and the mail store, start the stunnel services.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service stunnel4 start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing LMTP delivery ===&lt;br /&gt;
To test if LMTP works, you need to have dovecot set up already. Send yourself an e-mail, see if it arrives.&lt;br /&gt;
&lt;br /&gt;
=== More information on LMTP ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_lmtp_transport.html&lt;br /&gt;
* http://wiki2.dovecot.org/LMTP&lt;br /&gt;
* https://www.ietf.org/rfc/rfc2033.txt&lt;br /&gt;
== Mailman ==&lt;br /&gt;
Mailman is a mailing list server. Setting this up will enable you to run both public and private, archived mailing lists, compatible with DKIM and SPF. Note that DMARC policies interfere with mailing lists, so either reject mail from DMARC p=reject domains or Munge the from address in the mails..&lt;br /&gt;
&lt;br /&gt;
You will need a mailing list subdomain, for example list.bitlair.nl. This way, Exim will route messages through a pipe if it&#039;s destined for a mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for list.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/list.bitlair.nl-key.pem -out /etc/ssl/list.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (list.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/list.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up Mailman ===&lt;br /&gt;
First thing is to create a mailman mailing list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newlist mailman&lt;br /&gt;
Enter the email of the person running the list: your@email.address&lt;br /&gt;
Initial mailman password: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the URL and mailing list domain in /etc/mailman/mm_cfg.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default domain for email addresses of newly created MLs&lt;br /&gt;
DEFAULT_EMAIL_HOST = &#039;list.bitlair.nl&#039;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default host for web interface of newly created MLs&lt;br /&gt;
DEFAULT_URL_HOST   = &#039;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following lines near the end in /etc/mailman/mm_cfg.py to streamline message sending.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Max recipients for each message&lt;br /&gt;
SMTP_MAX_RCPTS = 1000&lt;br /&gt;
# Max messages sent in each SMTP connection&lt;br /&gt;
SMTP_MAX_SESSIONS_PER_CONNECTION = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Exim for mailman ===&lt;br /&gt;
Unfortunately, mailman 2.1 does not support LMTP yet. It requires a bit more configuration to get the mailman transport going. Mailman 2.2 (development branch now deprecated in favour of 3.0) does have it, so once mailman 3 arrives, upgrade to a more simple configuration set-up than this.&lt;br /&gt;
&lt;br /&gt;
Configure the mailman exim settings in /etc/exim4/conf.d/main/05_exim4-config_mailman_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Mailman macro definitions&lt;br /&gt;
&lt;br /&gt;
# Home dir for the Mailman installation&lt;br /&gt;
MM_HOME=/var/lib/mailman&lt;br /&gt;
&lt;br /&gt;
# User and group for Mailman&lt;br /&gt;
MM_UID=list&lt;br /&gt;
MM_GID=list&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Domains that your lists are in - colon separated list&lt;br /&gt;
# you may wish to add these into local_domains as well&lt;br /&gt;
domainlist mm_domains=list.bitlair.nl&lt;br /&gt;
&lt;br /&gt;
# The path of the Mailman mail wrapper script&lt;br /&gt;
MM_WRAP=MM_HOME/mail/mailman&lt;br /&gt;
#&lt;br /&gt;
# The path of the list config file (used as a required file when&lt;br /&gt;
# verifying list addresses)&lt;br /&gt;
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure the mailman router in /etc/exim4/conf.d/router/449_exim4-config_mailman_router:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_router:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  domains = +mm_domains&lt;br /&gt;
  require_files = MM_LISTCHK&lt;br /&gt;
  local_part_suffix_optional&lt;br /&gt;
  local_part_suffix = -admin : \&lt;br /&gt;
    -bounces   : -bounces+*  : \&lt;br /&gt;
    -confirm   : -confirm+*  : \&lt;br /&gt;
    -join      : -leave      : \&lt;br /&gt;
    -owner     : -request    : \&lt;br /&gt;
    -subscribe : -unsubscribe&lt;br /&gt;
  transport = mailman_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Configure the mailman transport in /etc/exim4/conf.d/transport/40_exim4-config_mailman_pipe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_transport:&lt;br /&gt;
  driver  = pipe&lt;br /&gt;
  command = MM_WRAP \&lt;br /&gt;
          &#039;${if def:local_part_suffix \&lt;br /&gt;
                {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \&lt;br /&gt;
                {post}}&#039; \&lt;br /&gt;
          $local_part&lt;br /&gt;
  current_directory = MM_HOME&lt;br /&gt;
  home_directory    = MM_HOME&lt;br /&gt;
  user              = MM_UID&lt;br /&gt;
  group             = MM_GID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure exim to accept mail for list.yourdomain.tld in /etc/exim4/update-exim4.conf.conf, by adding it to the dc_other_hostnames list. This is a semicolon-separated list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dc_other_hostnames=&#039;bitlair.nl;spf-must-die.org;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring apache for mailman ===&lt;br /&gt;
Create a site configuration in /etc/apache2/sites-available/list.bitlair.nl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName list.bitlair.nl&lt;br /&gt;
        ServerAdmin your@email.address&lt;br /&gt;
        DocumentRoot /var/www/&lt;br /&gt;
	SSLEngine on&lt;br /&gt;
	SSLCertificateFile    /etc/ssl/list.bitlair.nl-cert.pem&lt;br /&gt;
	SSLCertificateKeyFile /etc/ssl/private/list.bitlair.nl-key.pem&lt;br /&gt;
        SSLCertificateChainFile /etc/ssl/sub.class2.server.sha2.ca.pem&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3&lt;br /&gt;
        SSLHonorCipherOrder on&lt;br /&gt;
        SSLCipherSuite &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \&lt;br /&gt;
              EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 \&lt;br /&gt;
              EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                # This directive allows us to have apache2&#039;s default start page&lt;br /&gt;
                # in /apache2-default/, but still have / go to the right place&lt;br /&gt;
                RedirectMatch ^/$ /cgi-bin/mailman/listinfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/&lt;br /&gt;
        &amp;lt;Directory &amp;quot;/usr/lib/cgi-bin&amp;quot;&amp;gt;&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
	Alias /pipermail /var/lib/mailman/archives/public&lt;br /&gt;
	Alias /images/mailman /usr/share/images/mailman&lt;br /&gt;
	&amp;lt;Directory /var/lib/mailman/archives/public&amp;gt;&lt;br /&gt;
	    DirectoryIndex index.html&lt;br /&gt;
	&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Of course, replace list.bitlair.nl with your own list subdomain.&lt;br /&gt;
&lt;br /&gt;
Give permission to the web user to modify list data by adding www-data to the group list.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G list www-data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the site and ssl module&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# a2enmod ssl&lt;br /&gt;
~# a2ensite list.bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Reload apache&#039;s configuration gracefully&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apache2ctl graceful&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up mailing lists ===&lt;br /&gt;
TODO, guided tour:&lt;br /&gt;
* Set DMARC-policies!&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
=== Testing Mailman ===&lt;br /&gt;
Browse to your list url, e.g. https://list.bitlair.nl. Create a mailing list and subscribe yourself and a test mail address. Play around with the settings until you&#039;re comfortable with it.&lt;br /&gt;
&lt;br /&gt;
To verify your SSL-setup on your URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl s_client -connect list.bitlair.nl:443 -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
... &amp;gt;snip&amp;lt; ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should give you the Verify return code 0 (ok) again, any other status code means there is something wrong with your certificate.&lt;br /&gt;
&lt;br /&gt;
=== More information about mailman ===&lt;br /&gt;
* http://wiki.list.org/DEV/DMARC&lt;br /&gt;
* http://www.exim.org/howto/mailman21.html&lt;br /&gt;
* https://www.debian-administration.org/article/617/Mailman_and_Exim4&lt;br /&gt;
* https://www.gnu.org/software/mailman/&lt;br /&gt;
&lt;br /&gt;
== Dovecot ==&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for imap.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/imap.bitlair.nl-key.pem -out /etc/ssl/imap.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (imap.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/imap.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up dovecot ===&lt;br /&gt;
Configuring dovecot should be pretty straightforward. The first step is to disable plain IMAP.&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-master.conf set port = 0 for both imap and pop3 and enable imaps. Only use the TLS-protected ports.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  inet_listener imap {&lt;br /&gt;
          port = 0&lt;br /&gt;
  }&lt;br /&gt;
  inet_listener imaps {&lt;br /&gt;
    port = 993&lt;br /&gt;
    ssl = yes&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-ssl.conf, disable SSLv3, mandate TLS and configure your certificates:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl = required&lt;br /&gt;
ssl_cert = &amp;lt;/etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
ssl_key = &amp;lt;/etc/dovecot/private/imap.bitlair.nl-key.pem&lt;br /&gt;
ssl_protocols = !SSLv2 !SSLv3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Set the mail location where you want your mail delivered in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_location = mdbox:/srv/mail/%n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want mailbox sharing between users, dovecot needs to setuid all mailboxes with the same user, so set this in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_uid = vmail&lt;br /&gt;
mail_gid = vmail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the lmtp service in /etc/dovecot/conf.d/10-master.conf and override the user, so LMTP doesn&#039;t run as root.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service lmtp {&lt;br /&gt;
  user = vmail&lt;br /&gt;
  unix_listener lmtp {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the auth_username_format to %n in /etc/dovecot/conf.d/10-auth.conf, to make sure mail sent to username@domain via LMTP is delivered to the lower case username.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_username_format = %Ln&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the autocreate setting properly for the Local Delivery Agent in /etc/dovecot/conf.d/15-lda.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lda_mailbox_autocreate = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the vmail user and create the mail store&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd --system vmail&lt;br /&gt;
~# mkdir -m 0700 /srv/mail&lt;br /&gt;
~# chown vmail: /srv/mail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set up sieve filters, uncomment the listen section in /etc/dovecot/conf.d/20-managesieve.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service managesieve-login {&lt;br /&gt;
  inet_listener sieve {&lt;br /&gt;
    port = 4190&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are going to change a few things in order to get sieve working properly. &lt;br /&gt;
&lt;br /&gt;
First open and comment out the following in &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#  sieve = ~/.dovecot.sieve&lt;br /&gt;
#  sieve_dir = ~/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the reason we need to comment out the above entries is because a users home directory for mail is  &amp;quot;/srv/mail/%n&amp;quot; (%n = Username)and what the default actually says is check &amp;quot;/home/%n&amp;quot; for the sieve script which will fail due to the fact the vmail user cannot access that directory so we are going to move sieve configs to the users mailbox directory. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now in the same file &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot; add the following just under &amp;quot;plugin {&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
    sieve = /srv/mail/%n/.dovecot.sieve&lt;br /&gt;
    sieve_global_path = /etc/dovecot/sieve/default.sieve&lt;br /&gt;
    sieve_dir = /srv/mail/%n&lt;br /&gt;
    sieve_global_dir = /etc/dovecot/sieve/global/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We need to create the default directories next which will give us global rules for all users. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mkdir -p /etc/dovecot/sieve/global&lt;br /&gt;
chown vmail:vmail -R /etc/dovecot/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have the directories for global rules for all users.&lt;br /&gt;
&lt;br /&gt;
Now we are going to restart dovecot using the following command to update the configuration of dovecot: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
## service dovecot restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to test this lets add a test global rule by editing &amp;quot;/etc/dovecot/sieve/default.sieve&amp;quot; and adding the following: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
require [&amp;quot;fileinto&amp;quot;];&lt;br /&gt;
# rule:[SPAM]&lt;br /&gt;
if header :contains &amp;quot;X-Spam-Flag&amp;quot; &amp;quot;YES&amp;quot; {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
# rule:[SPAM2]&lt;br /&gt;
elsif header :matches &amp;quot;Subject&amp;quot; [&amp;quot;*money*&amp;quot;,&amp;quot;*Viagra*&amp;quot;,&amp;quot;Cialis&amp;quot;] {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
now to test it send yourself a mail with money in the subject and see if it gets filed into Junk. &lt;br /&gt;
If it does not work try sending it from an external mailserver and see if it works then. &lt;br /&gt;
&lt;br /&gt;
Now if you want to add a rule that applies only to a single user then make add the same rule to the file &amp;quot;/srv/mail/username/.dovecot.sieve&amp;quot; and make sure the file is owned and writeable by the vmail user. &lt;br /&gt;
&lt;br /&gt;
that&#039;s everything you need to know about sieve if an error occurs /var/log/mail.log will tell you and a log file will be created in the same directory as the sieve rule when an issue with the rule occurs. &lt;br /&gt;
&lt;br /&gt;
If you are not using LDAP then the following applies to you:&lt;br /&gt;
&lt;br /&gt;
And also, if you&#039;re not going to use LDAP, set the following overrides in /etc/dovecot/conf.d/auth-system.conf.ext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  # &amp;lt;doc/wiki/AuthDatabase.Passwd.txt&amp;gt;&lt;br /&gt;
  driver = passwd&lt;br /&gt;
  # [blocking=no]&lt;br /&gt;
  #args =&lt;br /&gt;
&lt;br /&gt;
  # Override fields from passwd&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you&#039;re basically done. If you want LDAP integration, continue with the next section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integrating LDAP into dovecot ===&lt;br /&gt;
Make sure dovecot-ldap is installed. &lt;br /&gt;
Change /etc/dovecot/conf.d/10-auth.conf to include auth-ldap.conf.ext and not include auth-system.conf.ext&lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-auth.conf and change your overrides in the userdb section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  driver = ldap&lt;br /&gt;
  args = /etc/dovecot/dovecot-ldap.conf.ext&lt;br /&gt;
&lt;br /&gt;
  # Default fields can be used to specify defaults that LDAP may override&lt;br /&gt;
  #default_fields = home=/home/virtual/%u&lt;br /&gt;
&lt;br /&gt;
  # Override fields that are always set to this value, regardless of what LDAP returns&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now open /etc/dovecot/dovecot-ldap.conf.ext, configure your exim search user, base dn and search filter.&lt;br /&gt;
&lt;br /&gt;
You should be done now.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Testing logins:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
1 LOGIN username password&lt;br /&gt;
1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE] Logged in&lt;br /&gt;
2 LOGOUT&lt;br /&gt;
* BYE Logging out&lt;br /&gt;
2 OK Logout completed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing your TLS configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993 -CAfile /etc/ssl/certs/ca-certificates.crt -verify 5&lt;br /&gt;
&lt;br /&gt;
... -&amp;gt;snip certificate stuff&amp;lt;- ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see return code: 0 (ok), any other return code is bad.&lt;br /&gt;
&lt;br /&gt;
=== ACL and Shared mailboxs (allowing delegated mailboxes)  ===&lt;br /&gt;
&lt;br /&gt;
To allow users to share mailboxes with each other add the following configuration changes. &lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-mail.conf and uncomment the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace inbox {&lt;br /&gt;
  type = private&lt;br /&gt;
  separator = / &lt;br /&gt;
  #prefix = &lt;br /&gt;
  #location =&lt;br /&gt;
  inbox = yes&lt;br /&gt;
  #hidden = no&lt;br /&gt;
  #list = yes&lt;br /&gt;
  #subscriptions = yes&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that following option is set in the /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
&lt;br /&gt;
# Space separated list of plugins to load for all services. Plugins specific to&lt;br /&gt;
# IMAP, LDA, etc. are added to this list in their own .conf files.&lt;br /&gt;
mail_plugins = acl&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add the following to the end of the same file (/etc/dovecot/conf.d/10-mail.conf): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  type = shared&lt;br /&gt;
  separator = /&lt;br /&gt;
  prefix = shared/%%n/&lt;br /&gt;
  location = mdbox:/srv/mail/%%n&lt;br /&gt;
  subscriptions = yes&lt;br /&gt;
  list = children&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the file /etc/dovecot/conf.d/20-imap.conf make sure the following changes are made: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
  # Space separated list of plugins to load (default is global mail_plugins).&lt;br /&gt;
  mail_plugins = $mail_plugins imap_acl&lt;br /&gt;
&lt;br /&gt;
  # Maximum number of IMAP connections allowed for a user from each IP address.&lt;br /&gt;
  # NOTE: The username is compared case-sensitively.&lt;br /&gt;
  #mail_max_userip_connections = 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And finally add the following to the /etc/dovecot/conf.d/90-acl.conf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin {&lt;br /&gt;
   #acl = vfile:/etc/dovecot/global-acls:cache_secs=300&lt;br /&gt;
   acl = vfile&lt;br /&gt;
   #acl_shared_dict = file:/etc/dovecot/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# To let users LIST mailboxes shared by other users, Dovecot needs a&lt;br /&gt;
# shared mailbox dictionary. For example:&lt;br /&gt;
plugin {&lt;br /&gt;
  #acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes&lt;br /&gt;
  acl_shared_dict = file:/srv/mail/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardening ==&lt;br /&gt;
=== Exim4 rate limiting ===&lt;br /&gt;
First, we need to make sure only 1 message is sent per connection, we also want to limit the number of simultaneous connections. For most small mail providers, allowing 20 simulataneous connections should be plenty.&lt;br /&gt;
&lt;br /&gt;
Create a file in /etc/exim4/conf.d/main/04_ratelimiting with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smtp_accept_max_per_connection = 1&lt;br /&gt;
smtp_accept_max_per_host = 1&lt;br /&gt;
smtp_accept_max = 20&lt;br /&gt;
acl_smtp_connect = acl_check_connect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And create the ACL file /etc/exim4/conf.d/acl/50_exim4-connectdelay with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl_check_connect:&lt;br /&gt;
  accept&lt;br /&gt;
    delay = 3s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing the banner delay ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet ::1 25&lt;br /&gt;
Trying ::1...&lt;br /&gt;
Connected to ::1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
EHLO boe&lt;br /&gt;
554 SMTP synchronization error&lt;br /&gt;
Connection closed by foreign host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SMTP banner should only appear after 3 seconds of not giving any inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rate limiting hosts with iptables ===&lt;br /&gt;
Make sure you input something like this into your firewall. The mask here implies throttling new connections for entire /64s:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For legacy IP:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes sure that nobody can connect more than 6 times per minute to your SMTP server.&lt;br /&gt;
I also have a port scan wrapper which auto-blacklists bad people, so my firewall looks like this in my executable /etc/network/if-pre-up.d/ip6tables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
(ip6tables -F&lt;br /&gt;
ip6tables -X&lt;br /&gt;
ipset flush local6&lt;br /&gt;
ipset destroy local6&lt;br /&gt;
)&amp;amp;&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipset create local6 hash:net hashsize 1024 family inet6&lt;br /&gt;
ipset add local6 2001:470:7b66::/48&lt;br /&gt;
ipset add local6 fe80::/16&lt;br /&gt;
ipset add local6 ::1/128&lt;br /&gt;
&lt;br /&gt;
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -m set --match-set local6 src -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp -m state --state NEW -m recent --rcheck --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name sshthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name sshthrottle --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 \! --icmpv6-type redirect -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on hardening ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://techsadmin.blogspot.nl/2012/11/exim-hardening-practices.html&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
In general, look at the log files /var/log/exim4/mainlog and /var/log/exim4/paniclog. For Clamav, look at /var/log/clamav/clamav.log. For spamd, check out the main syslog in /var/log/syslog.&lt;br /&gt;
&lt;br /&gt;
Most issues are caused by forgetting to regenerate the configuration, try regenerating and restarting exim4 to see if your problem persists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to add the clamav user to the exim group ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 14:13:46 1YXD2f-0000D2-BL malware acl condition: clamd: ClamAV &lt;br /&gt;
   returned: /var/spool/exim4/scan/1YXD2f-0000D2-BL/1YXD2f-0000D2-BL.eml: lstat() failed: Permission denied. ERROR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not using wheezy-updates or jessie-updates repository ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WARNING: Your ClamAV installation is OUTDATED!&lt;br /&gt;
WARNING: Local version: 0.98.5 Recommended version: 0.98.6&lt;br /&gt;
DON&#039;T PANIC! Read http://www.clamav.net/support/faq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed by adding the -updates repository to /etc/apt/sources.list, for wheezy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian wheezy-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For Debian jessie:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian jessie-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Forgetting to add the exim to sasl group ===&lt;br /&gt;
You&#039;ll see something like this in the mainlog:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 16:01:54 plain_saslauthd_server authenticator failed for (mail.bitlair.nl) [2a02:2ca0:aaa::a843:657d]: &lt;br /&gt;
    435 Unable to authenticate at present (set_id=wilco): cannot connect to saslauthd daemon at /var/run/saslauthd/mux: Permission denied&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And swaks will tell you:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;~* 435 Unable to authenticate at present&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Running the following will fix it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== auth-ldap and dovecot-ldap.conf files missing ===&lt;br /&gt;
You cannot find the auth-ldap files in the /etc/dovecot/conf.d or the dovecot-ldap file in /etc/dovecot.&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to install dovecot-lmtpd ===&lt;br /&gt;
You&#039;ve enabled the lmtp service, but when starting dovecot, the UNIX socket /var/run/dovecot/lmtp is not created.&lt;br /&gt;
&lt;br /&gt;
Exim will give messages like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-31 09:43:57 1Ycqq4-0004Q8-NP == wilco@bitlair.nl &amp;lt;root@bitlair.nl&amp;gt; R=ldap_users T=lmtp defer (-1): &lt;br /&gt;
    Failed to connect to socket /var/run/dovecot/lmtp for lmtp transport: No such file or directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-lmtpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Spamassassin hits rule URIBL_BLOCKED on every mail message ===&lt;br /&gt;
You keep getting spamassassin URIBL_BLOCKED on every message.. this is likely caused by using large caching DNS servers.&lt;br /&gt;
&lt;br /&gt;
Set up your own DNS server on your box to fix it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install bind9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Test it with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ host www.google.nl ::1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If it works, change your resolv.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# echo nameserver ::1 &amp;gt; /etc/resolv.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== You keep getting 550 relay not permitted for local email addresses ===&lt;br /&gt;
You most likely forgot to include your domain as a local domain.&lt;br /&gt;
&lt;br /&gt;
You can change this in /etc/exim4/update-exim4.conf.conf. There is a semicolon-separated list of dc_other_hostnames. These are the hostnames to accept mail for.&lt;br /&gt;
&lt;br /&gt;
After adding your domains to this file, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  Unable to verify the first certificate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Verify return code: 21 (unable to verify the first certificate)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means you forgot to append the chain file to the certificate. See the TLS section on appending the certificate chain and check the certificate chain you see in the s_client output.&lt;br /&gt;
&lt;br /&gt;
Verify that there are two certificates in /etc/ssl/your-mailserver-cert.pem. The first one should be your mail certificate and the second one should be the chain file.&lt;br /&gt;
&lt;br /&gt;
=== TLS not available and Error while reading file message in exim4.log ===&lt;br /&gt;
You will get output from s_client like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
139736697235088:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:774:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or &amp;quot;TLS is currently unavailable&amp;quot; when issueing the STARTTLS command in SMTP.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see this message in the log:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-04-12 18:31:50 TLS error on connection from localhost (openssl.client.net) [127.0.0.1] (cert/key setup: cert=/etc/ssl/mail.bitlair.nl-cert.pem key=/etc/ssl/private/mail.bitlair.nl-key.pem): Error while reading file.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be fixed by setting the access rights appropriately (see the TLS section). Don&#039;t forget to restart exim4! The problem may also be caused by not restarting exim4 adding Debian-exim to the ssl-cert group. It may also be caused by the certificates being missing or a typo in the location in the configuration file. After editing, regenerate the configuration file!&lt;br /&gt;
&lt;br /&gt;
=== Keep getting 421 Unexpected failure after RCPT TO ===&lt;br /&gt;
&lt;br /&gt;
Check your exim4 mainlog, it may say something like &amp;quot;no host name found for IP address xxxx:xxx:xxx::xxx. &lt;br /&gt;
Your mail server will only accept mail if you have a valid reverse DNS entry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DKIM signatures are not added ===&lt;br /&gt;
Add some debugging output to your mainlog by setting this debug_print in /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote_smtp:&lt;br /&gt;
  debug_print = &amp;quot;T: remote_smtp for $local_part@$domain, DKIM domain DKIM_DOMAIN DKIM_FILE&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, stop exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service exim4 stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, start exim4 in transport debugging mode in a new terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bd -d+transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can send yourself another email and you should see messages about which DKIM domain and key it is going to use in the debugging output&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2022-12-08_building_burners&amp;diff=8020</id>
		<title>Events/2022-12-08 building burners</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2022-12-08_building_burners&amp;diff=8020"/>
		<updated>2022-10-21T19:21:18Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=building burners&lt;br /&gt;
|start=2022/12/08 18:00:00 &lt;br /&gt;
|end=2022/12/08 23:59:00 &lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
see [[Events/2022-10-13 building burners]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2022-11-10_building_burners&amp;diff=8019</id>
		<title>Events/2022-11-10 building burners</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2022-11-10_building_burners&amp;diff=8019"/>
		<updated>2022-10-21T19:20:46Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=building burners&lt;br /&gt;
|start=2022/11/10 06:00:00 PM&lt;br /&gt;
|end=2022/11/10 11:59:00 PM&lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
see [[Events/2022-10-13 building burners]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Services&amp;diff=7970</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Services&amp;diff=7970"/>
		<updated>2022-07-21T11:14:42Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Wireless access */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Network services =&lt;br /&gt;
&lt;br /&gt;
== Getting local network access ==&lt;br /&gt;
Inside and outside of the space we are offering wireless and wired network access. IPv4 address-assignment is done via RFC1918 and NAT, for IPv6 we are using a HE.net-tunnel to give you a publicly routable IPv6 address.&lt;br /&gt;
&lt;br /&gt;
=== Wireless access ===&lt;br /&gt;
The following SSID&#039;s are available inside and outside of the space:&lt;br /&gt;
&lt;br /&gt;
* Bitlair-2GHz (2.4GHz-only WPA2-enterprise)&lt;br /&gt;
* Bitlair-5GHz (5GHz-only WPA2-enterprise)&lt;br /&gt;
* Bitlair-things (2.4GHz/5GHz WPA2-PSK network for &amp;quot;Internet of Things&amp;quot;). The PSK is available in the space.&lt;br /&gt;
* spacenet (WPA2-enterprise federated authentication across hackerspaces)&lt;br /&gt;
* eduroam (WPA2-enterprise federated authentication for educational organisations)&lt;br /&gt;
&lt;br /&gt;
General WPA2-enterprise settings for Bitlair-networks and spacenet for Bitlair members:&lt;br /&gt;
&lt;br /&gt;
* Phase 1: EAP-TTLS or PEAP&lt;br /&gt;
* Phase 2: PAP or MSCHAPv2 or EAP-MSCHAPv2&lt;br /&gt;
* CHECK THE CERTIFICATE! Check both the CA and the subject.&lt;br /&gt;
** Certificate signed by CA: ISRG Root X1 (Let&#039;s Encrypt!)&lt;br /&gt;
** Certificate subject: radius.bitlair.nl&lt;br /&gt;
&lt;br /&gt;
As a Bitlair-member:&lt;br /&gt;
&lt;br /&gt;
* Bitlair networks: Use your LDAP credentials to login.&lt;br /&gt;
* spacenet: use your LDAP credentials with the &amp;quot;@bitlair.nl&amp;quot;-realm to login. Also use this profile to get network access at other spaces.&lt;br /&gt;
&lt;br /&gt;
As a guest:&lt;br /&gt;
&lt;br /&gt;
* Bitlair networks:&lt;br /&gt;
** Username: guest&lt;br /&gt;
** Password: eurosnoeren&lt;br /&gt;
* spacenet: if you have a spacenet account from another hackerspace you can use these credentials to login. You should have received the correct phase 1/2 settings from your hackerspace.&lt;br /&gt;
&lt;br /&gt;
For more information about connecting check these howto&#039;s: https://spacefed.net/wiki/index.php/Category:Howto/Spacenet&lt;br /&gt;
&lt;br /&gt;
=== Wired access ===&lt;br /&gt;
At many places in the space we are offering GigE 802.3af PoE wired network access. Please find the nearest outlet or network cable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--If your MAC-address is not known in our LDAP server you will be dropped in VLAN 10 (IPv4: 192.168.10.0/24 - DJO), otherwise you will be dropped in VLAN 89 (IPv4: 192.168.89.0/24 - Bitlair clients). VLAN 89 is the client VLAN where all of the other Bitlair clients reside.!--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== shell.bitlair.nl ==&lt;br /&gt;
For Bitlair members &amp;amp; friends we are offering a shell server which is hosted inside Bitlair. It is reachable over IPv4 and/or IPv6.&lt;br /&gt;
&lt;br /&gt;
* Methods: SSH&lt;br /&gt;
* Hostname: shell.bitlair.nl&lt;br /&gt;
* Username: &amp;lt;your nickname&amp;gt;&lt;br /&gt;
* Password: &amp;lt;your personal password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== dashboard.bitlair.nl ==&lt;br /&gt;
Grafana frontend for statistics of Bitlair. Running on Portal VM.&lt;br /&gt;
&lt;br /&gt;
* For dashboard see https://dashboard.bitlair.nl/&lt;br /&gt;
* Grafana install is linked to LDAP. Use your LDAP credentials to login and create your own dashboards.&lt;br /&gt;
&lt;br /&gt;
== kvm.bitlair.nl / kvm2.bitlair.nl ==&lt;br /&gt;
These machines are running all of the VM&#039;s.&lt;br /&gt;
&lt;br /&gt;
* for support on this machine ask AK47, Wilco or polyfloyd&lt;br /&gt;
&lt;br /&gt;
== music.bitlair.nl ==&lt;br /&gt;
See [[Projects/Muzieksysteem]]. https://music.bitlair.nl. Only reachable from local network. Separate system (not a VM on kvm.bitlair.nl).&lt;br /&gt;
&lt;br /&gt;
== service.bitlair.nl ==&lt;br /&gt;
VM running backend for spacestate. Also see [[Projects/Spacestate]].&lt;br /&gt;
&lt;br /&gt;
== bank.bitlair.nl ==&lt;br /&gt;
VM running RevBank software.&lt;br /&gt;
&lt;br /&gt;
== aaa.bitlair.nl / idp.bitlair.nl ==&lt;br /&gt;
External and internal authentication machine running these services:&lt;br /&gt;
&lt;br /&gt;
* FreeRADIUS (for 802.1X/spacenet)&lt;br /&gt;
* OpenLDAP&lt;br /&gt;
* IdP (simplesaml)&lt;br /&gt;
&lt;br /&gt;
== pbx.bitlair.nl ==&lt;br /&gt;
VM running Asterisk for external phone number and connecting Cisco 79xx phones in the space.&lt;br /&gt;
&lt;br /&gt;
== metrics.bitlair.nl ==&lt;br /&gt;
VM running Graphite/Carbon as backend for dashboard.bitlair.nl. Also running Collectd for collection of various metrics (SNMP/MQTT). https://metrics.bitlair.nl (IPv6 only)&lt;br /&gt;
&lt;br /&gt;
== cyber.bitlair.nl ==&lt;br /&gt;
This VM hosts the public wiki (bitlair.nl).&lt;br /&gt;
&lt;br /&gt;
== git.bitlair.nl ==&lt;br /&gt;
Hosting https://git.bitlair.nl. This VM is used for private Git repo&#039;s. Your can login here with your LDAP credentials.&lt;br /&gt;
&lt;br /&gt;
== portal.bitlair.nl ==&lt;br /&gt;
https://portal.bitlair.nl/&lt;br /&gt;
&lt;br /&gt;
Bitlair member/friend portal, see [[Projects/Portal]].&lt;br /&gt;
&lt;br /&gt;
== 3dprinter.bitlair.nl ==&lt;br /&gt;
https://3dprinter.bitlair.nl - 3D printing frontend. Running on 3D printing PC (not a VM).&lt;br /&gt;
&lt;br /&gt;
== mqtt.bitlair.nl ==&lt;br /&gt;
VM running MQTT software for metrics of Bitlair. Also see [[Projects/MQTT]].&lt;br /&gt;
&lt;br /&gt;
== lights.bitlair.nl ==&lt;br /&gt;
VM running ArtNet scripts for LED visualisation.&lt;br /&gt;
&lt;br /&gt;
== newyolo.synnack.net ==&lt;br /&gt;
VM hosted by [[User:Wilco]] (SYNNACK) running several public services:&lt;br /&gt;
&lt;br /&gt;
* https://pad.bitlair.nl&lt;br /&gt;
* https://paste.bitlair.nl&lt;br /&gt;
* https://member.bitlair.nl (to be phased out)&lt;br /&gt;
&lt;br /&gt;
== vps.bitlair.nl ==&lt;br /&gt;
External VPS running several services:&lt;br /&gt;
&lt;br /&gt;
* Email&lt;br /&gt;
* Mailing lists: https://list.bitlair.nl&lt;br /&gt;
&lt;br /&gt;
== leds.bitlair.nl ==&lt;br /&gt;
OrangePi used for controlling LED strips (not deployed at Bitlair3)&lt;br /&gt;
&lt;br /&gt;
== doorpi.bitlair.nl ==&lt;br /&gt;
OrangePi used for interfacing with Arduino&#039;s of Doorsystem.  (not deployed at Bitlair3)&lt;br /&gt;
&lt;br /&gt;
== bank-pi.bitlair.nl ==&lt;br /&gt;
RaspberryPi running SSH-client to bank.bitlair.nl - frontend for RevBank.&lt;br /&gt;
&lt;br /&gt;
== lasercutter.bitlair.nl (IPv4 only) ==&lt;br /&gt;
LAOS board controller lasercutter.&lt;br /&gt;
&lt;br /&gt;
== lasercam.bitlair.nl ==&lt;br /&gt;
RaspberryPi running webcam for lasercutter.&lt;br /&gt;
&lt;br /&gt;
== dagobert.bitlair.nl ==&lt;br /&gt;
RaspberryPi running safety/accounting for lasercutter.&lt;br /&gt;
&lt;br /&gt;
== 2D printer ==&lt;br /&gt;
Color 2D laserprinter, HP 3600. Reachable via IPv4: 100.64.0.5..&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=7428</id>
		<title>Projects/Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=7428"/>
		<updated>2020-07-23T18:07:52Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|name=Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto&lt;br /&gt;
|start=2015/03/01&lt;br /&gt;
|contact=WilcoBaanHofman&lt;br /&gt;
|info=This page describes how we set up our mail system and how other people can set up their own full blown modern mail servers.&lt;br /&gt;
|status=Production&lt;br /&gt;
|Picture=Email-icon-vector.jpg&lt;br /&gt;
}}&lt;br /&gt;
This page will talk about how to set up a mail server, and also how to comply with Google mail / gmail&#039;s bizarre, idiotic IPv6 spam policies. &lt;br /&gt;
&lt;br /&gt;
You will need an SPF policy, DKIM and a valid forward/reverse DNS which matches the EHLO your mailserver sends. You will need spam filtering, virus filtering and a valid TLS connection.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Running an external (partial) LDAP slave&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* A (virtual) machine running Debian wheezy or jessie with public IPv4 and IPv6 internet connectivity&lt;br /&gt;
* Possibility to set up reverse DNS for your IPv4 and IPv6 addresses&lt;br /&gt;
* Ability to have a CA sign your certificates (can be done for free with Let&#039;s Encrypt).&lt;br /&gt;
&lt;br /&gt;
== Determine your setup ==&lt;br /&gt;
What kind of setup are you going to run?&lt;br /&gt;
* Single mailserver&lt;br /&gt;
* MTA + Encrypted mail store&lt;br /&gt;
* High-availability setup&lt;br /&gt;
&lt;br /&gt;
=== Single mailserver ===&lt;br /&gt;
In this case, install all packages on the same machine, do not use disk encryption, because your mail server will be unreachable after a power failure.&lt;br /&gt;
&lt;br /&gt;
=== MTA + Encrypted mail store ===&lt;br /&gt;
This is the best scenario for small setups and requires two (virtual) machines, one MTA that handles accepting of emails and spam/virus filtering and one machine that is encrypted. This guide covers this setup. To prepare for this setup, simple install one machine without disk crypto and one with. The MTA will hold mail for up to 3 weeks if you haven&#039;t typed your disk crypto password on boot yet (See the lmtp section).&lt;br /&gt;
&lt;br /&gt;
The setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Encrypted-mailstore.png]]&lt;br /&gt;
&lt;br /&gt;
=== High-availability ===&lt;br /&gt;
Running MTAs in high availability is easy, just duplicate the MTA setup and add two MX records to your domains. (Of course, your bayesian spam filters may train differently..). Running dovecot in high-availability is a different story.. &lt;br /&gt;
&lt;br /&gt;
The safest way to run dovecot in high-availibility mode is to run the mail store on top of a high-performance redundant NAS. This can be a proprietary NAS or some open source HA NFS setup. You will need shared NFS storage. The best performing mailbox format is mdbox, but this is also the easiest store to corrupt the indexes of if two nodes write to it in parallel. Locking may cause performance degradation and has to work reliably on your NFS backend, otherwise the indexes get corrupted. To prevent index corruption and locking overhead, there is the director component, which will pin a user to a node as long as that node is up. The dovecot part of this setup is *not* included in this guide (yet).&lt;br /&gt;
&lt;br /&gt;
This setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Mailserver-HA.png]]&lt;br /&gt;
&lt;br /&gt;
== Install the packages ==&lt;br /&gt;
&lt;br /&gt;
Step 1: Install the required packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install exim4-daemon-heavy spamassassin clamav-daemon greylistd spf-tools-perl sasl2-bin srs pyzor razor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want to run a mailing list server as well, also install mailman and apache2.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install mailman apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If dovecot is going to run on this same host (you&#039;re not doing high-availability or full disk crypto mail store), also install dovecot-imapd, dovecot-ldap and dovecot-lmtpd on the mta. Otherwise, do this on the host(s) where you want to run your dovecot.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-imapd dovecot-ldap dovecot-lmtpd dovecot-sieve dovecot-managesieved&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verify that no interfering packages are installed (like postfix, sendmail, amavis)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ dpkg -l |egrep &#039;(postfix|sendmail|amavis)&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This command should give no output, if it does and starts with ii, remove that package.&lt;br /&gt;
&lt;br /&gt;
== Configuring exim4 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# dpkg-reconfigure exim4-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Choose internet site, set the host name to the value you will set the reverse DNS to, specify all domains you want to receive mail for and choose split files (unless you want to replace every exim4 file name here with exim4.conf.template in this manual).&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim4 ===&lt;br /&gt;
Now try to see if simple address resolution works. This will only test against local system users. It&#039;s good to test this, even if you&#039;re going to add LDAP later.&lt;br /&gt;
Substitute the IP and mail addresses for your own stuff. For now, you can test any local system user @ one of the domains you accepted.&lt;br /&gt;
&lt;br /&gt;
Any line not starting with a number is something you have to type yourself to test this.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:27 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
RCPT TO: &amp;lt;aoeu@bitlair.nl&amp;gt;&lt;br /&gt;
550 Unrouteable address&lt;br /&gt;
QUIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hint; Use let&#039;s encrypt to keep these keys valid.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To generate the key and certificate signing request (replace mail.bitlair.nl with your Fully Qualified Domain Name):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/mail.bitlair.nl-key.pem -out /etc/ssl/mail.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the Common Name field, input your mail hostname (mail.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Copy the certificate signing request to a CA for signing. Allow the CA to sign it, then you&#039;ll receive a certificate from the CA. Place the received certificate in /etc/ssl/mail.your.domain-cert.pem&lt;br /&gt;
&lt;br /&gt;
Put MAIN_TLS_ENABLE=yes near the top in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions and set the following keys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAIN_TLS_CERTIFICATE = /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
MAIN_TLS_PRIVATEKEY = /etc/ssl/private/mail.bitlair.nl-key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the ssl-cert group, allow this group to read in /etc/ssl/private and add the exim user to the ssl-cert group to make sure exim can read the private key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# groupadd --system ssl-cert&lt;br /&gt;
~# chgrp ssl-cert /etc/ssl/private&lt;br /&gt;
~# chmod 750 /etc/ssl/private&lt;br /&gt;
~# usermod -a -G ssl-cert Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download your chain file from your CA. Store the chain file in /etc/ssl/. &lt;br /&gt;
&lt;br /&gt;
Now append its content to /etc/ssl/your-domain-cert.pem. I have a class 2 certificate, so I used this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# cat /etc/ssl/sub.class2.server.sha2.ca.pem &amp;gt;&amp;gt; /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing STARTTLS ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25 &lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
STARTTLS&lt;br /&gt;
220 TLS go ahead&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
STARTTLS should be listed and give a 220 status code.&lt;br /&gt;
&lt;br /&gt;
=== Testing TLS ===&lt;br /&gt;
Unfortunately, openssl s_client does not support IPv6, but this the tests the legacy IP listener as well as TLS:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect mail.bitlair.nl:25 -starttls smtp -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA256&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
Secure Renegotiation IS supported&lt;br /&gt;
Compression: NONE&lt;br /&gt;
Expansion: NONE&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1.2&lt;br /&gt;
    Cipher    : DHE-RSA-AES256-SHA256&lt;br /&gt;
    Session-ID: 82CBCEC7833853A674F6399694A03052566C494E1F6DDC8DE2CD4B3A9F8ED528&lt;br /&gt;
    Session-ID-ctx: &lt;br /&gt;
    Master-Key: BAE67F5D50E5C1C95FBDF355C1BDE18C6251E13F5B8686977292A54657498EFECFF518290211F24F01C40E39929981C4&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    PSK identity: None&lt;br /&gt;
    PSK identity hint: None&lt;br /&gt;
    SRP username: None&lt;br /&gt;
    Start Time: 1426438799&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should give Verify return code 0 at all times. Anything else is wrong.. see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
== SASL Authenticated relay ==&lt;br /&gt;
To enable relaying of messages after authentication, for SPF or just for laptops that are on different connections all the time, SASL authentication needs to be enabled.&lt;br /&gt;
&lt;br /&gt;
=== Enabling other ports than 25 ===&lt;br /&gt;
Port 25 is usually blocked by firewalls, for good reason. An alternative authenticated-only submission port exists on port 587 and a legacy TLS on connect port on 465 also exists.&lt;br /&gt;
&lt;br /&gt;
To enable these, set the following in /etc/default/exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTPLISTENEROPTIONS=&#039;-oX 25:465:587 -oP /var/run/exim4/exim.pid&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions add the following near the top:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tls_on_connect_ports=465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SASL authentication ===&lt;br /&gt;
Set the following to /etc/default/saslauthd, this is the default these days&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start saslauthd.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/exim4/conf.d/auth/30_exim4-config_examples, uncomment the section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plain_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = PLAIN&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth2&lt;br /&gt;
  server_prompts = :&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&lt;br /&gt;
login_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = LOGIN&lt;br /&gt;
  server_prompts = &amp;quot;Username:: : Password::&amp;quot;&lt;br /&gt;
  # don&#039;t send system passwords over unencrypted connections&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth1&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the Debian-exim user to the sasl group.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ swaks -a -tls -q AUTH -s 2a02:2ca0:aaa::a843:657d -au username&lt;br /&gt;
Password: enter_your_password&lt;br /&gt;
=== Trying 2a02:2ca0:aaa::a843:657d:25...&lt;br /&gt;
=== Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
&amp;lt;-  220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 16:04:35 -0400&lt;br /&gt;
 -&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;-  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;-  250-SIZE 52428800&lt;br /&gt;
&amp;lt;-  250-8BITMIME&lt;br /&gt;
&amp;lt;-  250-PIPELINING&lt;br /&gt;
&amp;lt;-  250-STARTTLS&lt;br /&gt;
&amp;lt;-  250 HELP&lt;br /&gt;
 -&amp;gt; STARTTLS&lt;br /&gt;
&amp;lt;-  220 TLS go ahead&lt;br /&gt;
=== TLS started w/ cipher DHE-RSA-AES256-SHA256&lt;br /&gt;
=== TLS peer subject DN=&amp;quot;/C=NL/ST=Utrecht/L=Amersfoort/O=Stichting Bitlair/CN=mail.bitlair.nl&amp;quot;&lt;br /&gt;
 ~&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;~  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;~  250-SIZE 52428800&lt;br /&gt;
&amp;lt;~  250-8BITMIME&lt;br /&gt;
&amp;lt;~  250-PIPELINING&lt;br /&gt;
&amp;lt;~  250-AUTH PLAIN LOGIN&lt;br /&gt;
&amp;lt;~  250 HELP&lt;br /&gt;
 ~&amp;gt; AUTH LOGIN&lt;br /&gt;
&amp;lt;~  334 VXNlcm5hbWU6&lt;br /&gt;
 ~&amp;gt; d2lsY28=&lt;br /&gt;
&amp;lt;~  334 UGFzc3dvcmQ6&lt;br /&gt;
 ~&amp;gt; YmxpZXA=&lt;br /&gt;
&amp;lt;~  235 Authentication succeeded&lt;br /&gt;
 ~&amp;gt; QUIT&lt;br /&gt;
&amp;lt;~  221 mail.bitlair.nl closing connection&lt;br /&gt;
Connection closed with remote host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Authentication succeeded is what you want!&lt;br /&gt;
&lt;br /&gt;
=== DNS block lists ===&lt;br /&gt;
Add CHECK_RCPT_IP_DNSBLS to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt, like my list of DNSBLs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_IP_DNSBLS=cbl.abuseat.org:sbl-xbl.spamhaus.org:psbl.surriel.com:b.barracudacentral.org:dul.dnsbl.sorbs.net:spamsources.fabel.dk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove the whole ifdef CHECK_RCPT_IP_DNSBLS section from /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt and place the following section just before the accept rule with relay_to_domains&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  accept&lt;br /&gt;
    domains      = +local_domains : +relay_to_domains&lt;br /&gt;
    dnslists      = list.dnswl.org&lt;br /&gt;
    logwrite      = $sender_host_address is whitelisted&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = ${sender_host_address} is listed at ${dnslist_domain}; See ${dnslist_text}&lt;br /&gt;
    !hosts = +relay_from_hosts&lt;br /&gt;
    !authenticated = *&lt;br /&gt;
    dnslists = CHECK_RCPT_IP_DNSBLS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information exim4 configuration ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/&lt;br /&gt;
&lt;br /&gt;
== Spamassassin ==&lt;br /&gt;
=== Spamassassin configuration ===&lt;br /&gt;
To enable spamd from spamassassin, set the following in /etc/default/spamassassin (these may already be the default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLED=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And add &amp;quot;-u debian-spamd&amp;quot; to the options, you will get something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OPTIONS=&amp;quot;--create-prefs --max-children 5 --helper-home-dir -u debian-spamd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And also enable the cron rules updates by setting&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRON=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will probably want more terse spam reporting, because it will be in the email headers, to get this, add the following to /etc/spamassassin/local.cf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear_report_template&lt;br /&gt;
report _YESNO_, score=_SCORE_ required=_REQD_ autolearn=_AUTOLEARN_&lt;br /&gt;
report tests=_TESTSSCORES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
While you&#039;re there, you may want to enable the bayesian classifier, and set up razor and pyzor, and fix RFC-ignorant rules.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   Use Bayesian classifier (default: 1)&lt;br /&gt;
#&lt;br /&gt;
use_bayes 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#   Bayesian classifier auto-learning (default: 1)&lt;br /&gt;
#&lt;br /&gt;
bayes_auto_learn 1&lt;br /&gt;
bayes_auto_learn_threshold_nonspam -0.001&lt;br /&gt;
bayes_auto_learn_threshold_spam 8.0&lt;br /&gt;
&lt;br /&gt;
# Use razor and pyzor&lt;br /&gt;
use_razor2 1&lt;br /&gt;
use_pyzor 1&lt;br /&gt;
&lt;br /&gt;
# Disable stupid RFC-incompatible spamassassin SPF_NEUTRAL check. Do not add points for SPF_NEUTRAL, as it should be treated the same as having no SPF record.&lt;br /&gt;
score SPF_NEUTRAL 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now, set up razor and pyzor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -create&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -register&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -discover&lt;br /&gt;
~# pyzor --homedir /etc/mail/spamassassin discover&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart spamassassin.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service spamassassin restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim spamd integration ===&lt;br /&gt;
Uncomment the following line in /etc/exim4/conf.d/main/02_exim4-config_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spamd_address = 127.0.0.1 783&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   warn&lt;br /&gt;
#     spam = Debian-exim:true&lt;br /&gt;
#     add_header = X-Spam_score: $spam_score\n\&lt;br /&gt;
#               X-Spam_score_int: $spam_score_int\n\&lt;br /&gt;
#               X-Spam_bar: $spam_bar\n\&lt;br /&gt;
#               X-Spam_report: $spam_report&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also replace Debian-exim with debian-spamd (case sensitive), change _report to -Status and dash/upper case the rest (See section below for result). To bounce messages, also add this directly below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll get something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  warn&lt;br /&gt;
    spam = debian-spamd:true&lt;br /&gt;
    add_header = X-Spam-Score: $spam_score\n\&lt;br /&gt;
              X-Spam-Score-Int: $spam_score_int\n\&lt;br /&gt;
              X-Spam-Bar: $spam_bar\n\&lt;br /&gt;
              X-Spam-Status: $spam_report&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing spam blocking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ telnet 127.0.0.1 25&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to 127.0.0.1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 13:53:46 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello localhost.localdomain [127.0.0.1]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test            &lt;br /&gt;
&lt;br /&gt;
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
550 This message scored 1002.6 spam points.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here.    &lt;br /&gt;
&lt;br /&gt;
=== More information on spamassassin ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* https://spamassassin.apache.org/&lt;br /&gt;
&lt;br /&gt;
== Antivirus ==&lt;br /&gt;
=== Setting up ClamAV ===&lt;br /&gt;
Update the antivirus database:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# freshclam&lt;br /&gt;
ClamAV update process started at Sun Mar 15 13:57:01 2015&lt;br /&gt;
main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)&lt;br /&gt;
daily.cvd is up to date (version: 20194, sigs: 1348078, f-level: 63, builder: dgoddard)&lt;br /&gt;
bytecode.cvd is up to date (version: 247, sigs: 41, f-level: 63, builder: dgoddard)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will get a message about outdated ClamAV if you do not have the latest version from stable-updates. Make sure you have it in your sources list and preferably in the unattended-upgrades list. Also see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
If you get a message about freshclam.log being locked, this means the clamav database is already up to date, check the freshclam.log for any warnings, like &amp;quot;your version is OUTDATED&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Add clamav to the Debian-exim group, so that clamav-daemon can read the message to scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/clamav/clamd.conf set clamav to use the supplementary group (it may be already enabled by default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowSupplementaryGroups true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart clamav-daemon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service clamav-daemon restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim clamd integration ===&lt;br /&gt;
In /etc/exim4/conf.d/main/02_exim4-config_options, uncomment the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
av_scanner = clamd:/var/run/clamav/clamd.ctl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    malware = *&lt;br /&gt;
    message = This message was detected as possible malware ($malware_name).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the exim4 config and restart exim.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 14:10:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test&lt;br /&gt;
&lt;br /&gt;
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*&lt;br /&gt;
.&lt;br /&gt;
550 This message was detected as possible malware (Eicar-Test-Signature).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here. This is good.&lt;br /&gt;
&lt;br /&gt;
=== More information on ClamAV ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-content_scanning_at_acl_time.html&lt;br /&gt;
* http://www.clamav.net/index.html&lt;br /&gt;
&lt;br /&gt;
== Setting up DKIM ==&lt;br /&gt;
Contrary to SPF and DMARC, DKIM is actually a good idea. This does not break the internet, I advise everyone to implement DKIM.&lt;br /&gt;
=== Configuring exim for DKIM ===&lt;br /&gt;
The first step to getting DKIM working, is generating an RSA key for DKIM. You will be tempted to use a large key here, but given that you have to add the public key to DNS, do not use more than 1024-bit keys. If you want to use stronger cryptography for this in the future, please consider contributing to the support of ECC crypto in DKIM.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# mkdir -m 0750 /etc/exim4/dkim_keys&lt;br /&gt;
~# chown root:Debian-exim /etc/exim4/dkim_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To generate the RSA key pair (repeat per domain): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl genrsa -out /etc/exim4/dkim_keys/bitlair.nl.private.pem 1024&lt;br /&gt;
~# openssl rsa -in /etc/exim4/dkim_keys/bitlair.nl.private.pem -out /etc/exim4/dkim_keys/bitlair.nl.public.pem -pubout -outform PEM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following to the top of /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM_DOMAIN =  ${domain:$return_path}&lt;br /&gt;
DKIM_SELECTOR = exim&lt;br /&gt;
DKIM_FILE = /etc/exim4/dkim_keys/${lc:${domain:$return_path}}.private.pem&lt;br /&gt;
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}&lt;br /&gt;
DKIM_CANON = relaxed&lt;br /&gt;
DKIM_STRICT = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring DNS for DKIM ===&lt;br /&gt;
Update your DNS zones to have the following records:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exim._domainkey    IN    TXT   v=DKIM1; k=rsa; p=MIGfMA... &amp;lt;- your base64-encoded public key here&lt;br /&gt;
_domainkey         IN    TXT   o=~;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Send an email to yourself from your MTA, you should see DKIM headers added to your message, to verify if it really checks out, send an email to check-auth@verifier.port25.com from your MTA. &lt;br /&gt;
&lt;br /&gt;
It should respond with something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM check:         pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on DKIM ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.iodigitalsec.com/exim-dkim-and-debian-configuration/&lt;br /&gt;
* http://mikepultz.com/2010/02/using-dkim-in-exim/&lt;br /&gt;
* https://www.debian-administration.org/users/lee/weblog/41&lt;br /&gt;
* http://www.dkim.org/&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
Please note, before you add SPF: SPF is very broken. It assumes that people do not forward e-mail. It breaks .forward files, procmail forwards, etc. There is a remedy, called Sender Rewriting Scheme, but people are generally not aware of this. If you want to forward to gmail.com, which is known broken, because it mandates SPF records. &lt;br /&gt;
=== Adding SPF to your domain ===&lt;br /&gt;
You can set limits on who can send on behalf of your domain using DNS. However, extremely few mail forwards have implemented SRS. As stated on wikipedia: &amp;quot;Publishers of SPF FAIL policies must accept the risk that their legitimate emails are being rejected or bounced. They should test (e.g., with a SOFTFAIL policy) until they are satisfied with the results.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, adding SPF to your domain adds to the legitimacy of your domain, and will decrease your chances of getting into a spam box. So it would be wise to set an SPF policy of allowing your mailservers and hosts under your domain, but leave the rest neutral with ?all. -all is guaranteed to break plain mail forwarding. ~all will make sure your mail reaches the spam box.&lt;br /&gt;
&lt;br /&gt;
To have an SPF policy, I advise to not use any fails on your domain, but configure a record like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ IN TXT &amp;quot;v=spf1 a mx ?all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will ensure that hosts under your domain can pass SPF, as can your mailservers, but it is neutral for other, potentially forwarding hosts.&lt;br /&gt;
&lt;br /&gt;
=== Adding Sending Rewriting Scheme (SRS) ===&lt;br /&gt;
Be careful with mail forwards, make sure your spam rules are set strictly enough, because your mail server reputation with gmail depends on forwarding mostly non-spam. If you want to do mail forwards to gmail, you need to implement SRS, because gmail on IPv6 is a known broken SPF mail system.&lt;br /&gt;
&lt;br /&gt;
==== Installing srsd ====&lt;br /&gt;
Create /etc/init.d/srsd with content:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          srsd&lt;br /&gt;
# Required-Start:    &lt;br /&gt;
# Required-Stop:     &lt;br /&gt;
# Should-Start:      &lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: SRS daemon&lt;br /&gt;
# Description:       SRS daemon&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# /etc/init.d/srsd: start and stop the srsd daemon&lt;br /&gt;
&lt;br /&gt;
DAEMON=/usr/bin/srsd&lt;br /&gt;
USER=Debian-exim&lt;br /&gt;
SECRETFILE=/etc/srsd.secret&lt;br /&gt;
PIDFILE=/var/run/srsd.pid&lt;br /&gt;
SOCKETFILE=/tmp/srsd&lt;br /&gt;
SRSD_OPTS=&amp;quot;--secretfile ${SECRETFILE}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test -x $DAEMON || exit 0&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
srsd_start() {&lt;br /&gt;
    if start-stop-daemon --start --quiet --background \&lt;br /&gt;
        --chuid $USER \&lt;br /&gt;
        --pidfile $PIDFILE --make-pidfile \&lt;br /&gt;
        --exec $DAEMON \&lt;br /&gt;
        -- $SRSD_OPTS&lt;br /&gt;
    then&lt;br /&gt;
        rc=0&lt;br /&gt;
        sleep 1&lt;br /&gt;
        if ! kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
            log_failure_msg &amp;quot;srsd daemon failed to start&amp;quot;&lt;br /&gt;
            rc=1&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        rc=1&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $rc -eq 0 ]; then&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
    else&lt;br /&gt;
        log_end_msg 1&lt;br /&gt;
        rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
} # srsd_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
    log_daemon_msg &amp;quot;Starting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        log_progress_msg &amp;quot;apparently already running&amp;quot;&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
        exit 0&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
  stop)&lt;br /&gt;
    log_daemon_msg &amp;quot;Stopping srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE&lt;br /&gt;
    log_end_msg $?&lt;br /&gt;
    rm -f $PIDFILE&lt;br /&gt;
    rm -f $SOCKETFILE&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  restart)&lt;br /&gt;
    set +e&lt;br /&gt;
    log_daemon_msg &amp;quot;Restarting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || true&lt;br /&gt;
        sleep 1&lt;br /&gt;
    else&lt;br /&gt;
        log_warning_msg &amp;quot;srsd daemon not running, attempting to start.&amp;quot;&lt;br /&gt;
            rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  status)&lt;br /&gt;
    status_of_proc -p $PIDFILE &amp;quot;$DAEMON&amp;quot; srsd&lt;br /&gt;
    exit $?    # notreached due to set -e&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    echo &amp;quot;Usage: /etc/init.d/srsd {start|stop|restart|status}&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now make it executable and run at boot time.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# chmod 755 /etc/init.d/srsd&lt;br /&gt;
~# update-rc.d srsd defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Generate a new random secret:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# touch /etc/srsd.secret&lt;br /&gt;
~# chown Debian-exim /etc/srsd.secret&lt;br /&gt;
~# chmod 600 /etc/srsd.secret&lt;br /&gt;
~# openssl rand -base64 12 &amp;gt; /etc/srsd.secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Start srsd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service srsd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Implement srsd integration into exim4 ====&lt;br /&gt;
Create a file in /etc/exim4/conf.d/router/175_exim4-config_srs with the following content, replace spf-must-die.org to your own SRS rewriting domain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srs_bounce:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_bounce for $local_part@$domain&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  domains = spf-must-die.org&lt;br /&gt;
  local_part_prefix = srs0+ : srs0- : srs0= : srs1+ : srs1- : srs1=&lt;br /&gt;
  caseful_local_part&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}{REVERSE $local_part_prefix$local_part@$domain}{5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  data = ${if match{$address_data}{^ERROR}{:fail: Invalid SRS address}{$address_data}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
srs_forward:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_forward for $local_part@$domain&amp;quot;&lt;br /&gt;
  no_verify&lt;br /&gt;
  senders = ! : ! *@+local_domains&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}\&lt;br /&gt;
                {FORWARD $sender_address_local_part@$sender_address_domain spf-must-die.org\n}\&lt;br /&gt;
                                        {5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&lt;br /&gt;
  headers_add = &amp;quot;X-SRS: Sender address rewritten from &amp;lt;$sender_address&amp;gt; to &amp;lt;${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&amp;gt; by $primary_hostname.&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  repeat_use = false&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${quote_local_part:$local_part}@$domain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Testing the SRS forwarding ====&lt;br /&gt;
Create an alias in /etc/aliases to your own mailbox, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user: your@email.address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
run newaliases to regenerate the hash table&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newaliases&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now try to send email to user@your-mail-server.&lt;br /&gt;
&lt;br /&gt;
You should get it in your mailbox.. look at the message source, you will see the following headers if DKIM and SRS are working (note the d=rewriting domain):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Return-Path: &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt;&lt;br /&gt;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=spf-must-die.org; s=exim;&lt;br /&gt;
        h=Content-Type:Subject:To:MIME-Version:From:Date:Message-ID; bh=Nh/X++v9YcgLCxTBH1lYXZg22kWTVrM8UJ+92lkoOFQ=;&lt;br /&gt;
        b=eC+zN8okGJYoNUgllB9TUb9XDmHVIWYwFiIC+m2gcji5zlM+LIDYEz0Z6tAdZt1vUhugefB7DCLos6aiKwP/jShm2Cn4XTY4U+i0WG1wxf3L9wp8bs1bfo1oJLaI8iyNuSGnUDbQspWwJj1toXp2J1nGkV2MeagggaGr7+GLXro=;&lt;br /&gt;
X-SRS: Sender address rewritten from &amp;lt;wilco@baanhofman.nl&amp;gt; to &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt; by mail.bitlair.nl.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable SPF checking ===&lt;br /&gt;
Enabling SPF checking will break mail forwarding to your domain without SRS on domains that have a fail configured. This will likely block much legitimate e-mail, but if you want to forward to the big players, it&#039;s nearly mandatory to do..&lt;br /&gt;
&lt;br /&gt;
To enable inbound SPF checking, add the following to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_SPF=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be careful if you have servers relaying e-mail for you (for instance because your mail server is IPv6 only and want to receive e-mail on IPv4 or as a fallback mailserver). You need to add all addresses of those servers to /etc/exim4/host_local_deny_exceptions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note, there is a bug in the debian default SPF check, causing to bounce mail from senders that use HELO macros, like exists:_i.%{i}._h.%{h}._o.%{o}._spf.belastingdienst.nl .. So, to fix, find the following in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {--scope helo --identity ${quote:$sender_helo_name}}}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace it with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {}} --scope helo --identity ${quote:$sender_helo_name}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing SPF checking===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 29 Mar 2015 14:37:47 +0200&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;spf-test@openspf.net&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
550-[SPF] 2001:41d0:52:300::107c is not allowed to send mail from openspf.net. &lt;br /&gt;
550 Please see http://www.openspf.org/Why?scope=mfrom;identity=spf-test@openspf.net;ip=2001:41d0:52:300::107c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see a 550 reject here when there is an SPF FAIL.&lt;br /&gt;
&lt;br /&gt;
=== More information on SPF and SRS ===&lt;br /&gt;
&lt;br /&gt;
* https://www.assembla.com/wiki/show/file_sender/Configuring_SRS_with_Exim_(Debian_and_Ubuntu)&lt;br /&gt;
* https://github.com/Exim/exim/wiki/SRS&lt;br /&gt;
* http://www.openspf.org/SPF_Record_Syntax&lt;br /&gt;
&lt;br /&gt;
== Greylisting ==&lt;br /&gt;
Greylisting is bouncing all email from new senders with a temporary failure code. Implementing this helps a good deal against spammers, at the cost of having to wait for an email from a new sender.&lt;br /&gt;
&lt;br /&gt;
=== Set up exim ===&lt;br /&gt;
To set up configuration, simply do&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# greylistd-setup-exim4 add&lt;br /&gt;
~# service greylistd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, if you want to skip greylisting on dnswl listed hosts, which I recommend: add the following line to the defer and deny sections about greylisting in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    !dnslists = list.dnswl.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will override your local greylistd blacklist and override greylisting for known good senders.&lt;br /&gt;
&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 15:27:34 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
451-2a02:2ca0:aaa::a843:657d is not yet authorized to deliver mail from&lt;br /&gt;
451 &amp;lt;wilco@bitlair.nl&amp;gt; to &amp;lt;wilco@bitlair.nl&amp;gt;. Please try later.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
451 is the temporary failure error, this is the desired behaviour.&lt;br /&gt;
&lt;br /&gt;
=== More information on Greylisting ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
Be careful with DMARC, as DMARC with p=reject breaks your outbound e-mail even further than SPF. With p=reject, you will no longer be able to use mailing lists or mail forwarders, even those with SRS enabled. DMARC checks the &#039;From:&#039; header, instead of the envelope sender of the mail, so setting DMARC policies will break all of your forwarding, and will make sure that your mail does not reach its destination. I also recommend that you reject all mail with a DMARC policy set on your mailing lists, because the bounces will cause your members to bounce off the mailing list.&lt;br /&gt;
&lt;br /&gt;
Enable this if the risk of impersonation/identity fraud is greater than the risk of your outgoing emails not arriving at their destination. So, if you are paypal, a bank, linkedin, twitter or facebook.. or using this for internal mail only or to signal that nobody should be sending mail on behalf of a domain. If you do not have full control over your users&lt;br /&gt;
&lt;br /&gt;
It does have useful features, like reporting, so setting a p=none can add at least some value to your mail setup.&lt;br /&gt;
&lt;br /&gt;
=== Set up a mailbox ===&lt;br /&gt;
&lt;br /&gt;
Create a user in whatever system you&#039;re using. If you&#039;re not using LDAP or MySQL or something, this should do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd dmarc&lt;br /&gt;
~# passwd dmarc&lt;br /&gt;
Enter new UNIX password: &lt;br /&gt;
Retype new UNIX password: &lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running a remote mailstore without LDAP/MySQL backend, this procedure has to be repeated on the mail store.&lt;br /&gt;
&lt;br /&gt;
=== Publish a DMARC policy ===&lt;br /&gt;
You can add the following DMARC policy to your domain. p=none is important!&lt;br /&gt;
&lt;br /&gt;
_dmarc     IN     TXT     &amp;quot;v=DMARC1; p=none; rua=dmarc@bitlair.nl; ruf=dmarc@bitlair.nl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Doing something useful with the reports ===&lt;br /&gt;
This section is TODO. I haven&#039;t found a good tool yet.&lt;br /&gt;
&lt;br /&gt;
=== More information on DMARC ===&lt;br /&gt;
* http://lists.dmarc.org/pipermail/dmarc-discuss/2014-April/002445.html&lt;br /&gt;
* http://dmarc.org/overview/&lt;br /&gt;
&lt;br /&gt;
== LDAP integration ==&lt;br /&gt;
This assumes you already have an LDAP running. To set one up, please see the spacefed guide.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
Load the qmail LDAP schema:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# ldapadd -H ldapi:/// -Y EXTERNAL &amp;lt;&amp;lt; EOF&lt;br /&gt;
dn: cn=qmail,cn=schema,cn=config&lt;br /&gt;
objectClass: olcSchemaConfig&lt;br /&gt;
cn: {4}qmail&lt;br /&gt;
olcAttributeTypes: {0}( 1.3.6.1.4.1.7914.1.2.1.1 NAME &#039;qmailUID&#039; DESC &#039;UID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {1}( 1.3.6.1.4.1.7914.1.2.1.2 NAME &#039;qmailGID&#039; DESC &#039;GID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {2}( 1.3.6.1.4.1.7914.1.2.1.3 NAME &#039;mailMessageStore&#039; DESC &lt;br /&gt;
 &#039;Path to the maildir/mbox on the mail system&#039; EQUALITY caseExactIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SIN&lt;br /&gt;
 GLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {3}( 1.3.6.1.4.1.7914.1.2.1.4 NAME &#039;mailAlternateAddress&#039; D&lt;br /&gt;
 ESC &#039;Secondary (alias) mailaddresses for the same user&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {4}( 1.3.6.1.4.1.7914.1.2.1.5 NAME &#039;mailQuota&#039; DESC &#039;The am&lt;br /&gt;
 ount of space the user can use until all further messages get bounced.&#039; SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {5}( 1.3.6.1.4.1.7914.1.2.1.6 NAME &#039;mailHost&#039; DESC &#039;On whic&lt;br /&gt;
 h qmail server the messagestore of this user is located.&#039; EQUALITY caseIgnore&lt;br /&gt;
 IA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.&lt;br /&gt;
 1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {6}( 1.3.6.1.4.1.7914.1.2.1.7 NAME &#039;mailForwardingAddress&#039; &lt;br /&gt;
 DESC &#039;Address(es) to forward all incoming messages to.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {7}( 1.3.6.1.4.1.7914.1.2.1.8 NAME &#039;deliveryProgramPath&#039; DE&lt;br /&gt;
 SC &#039;Program to execute for all incoming mails.&#039; EQUALITY caseExactIA5Match SU&lt;br /&gt;
 BSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {8}( 1.3.6.1.4.1.7914.1.2.1.9 NAME &#039;qmailDotMode&#039; DESC &#039;Int&lt;br /&gt;
 erpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog&#039; EQUALITY &lt;br /&gt;
 caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {9}( 1.3.6.1.4.1.7914.1.2.1.10 NAME &#039;deliveryMode&#039; DESC &#039;mu&lt;br /&gt;
 lti field entries of: nolocal, noforward, noprogram, reply&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )&lt;br /&gt;
olcAttributeTypes: {10}( 1.3.6.1.4.1.7914.1.2.1.11 NAME &#039;mailReplyText&#039; DESC &#039;&lt;br /&gt;
 A reply text for every incoming message&#039; EQUALITY caseIgnoreMatch SUBSTR case&lt;br /&gt;
 IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE&lt;br /&gt;
  )&lt;br /&gt;
olcAttributeTypes: {11}( 1.3.6.1.4.1.7914.1.2.1.12 NAME &#039;accountStatus&#039; DESC &#039;&lt;br /&gt;
 The status of a user account: active, noaccess, disabled, deleted&#039; EQUALITY c&lt;br /&gt;
 aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {12}( 1.3.6.1.4.1.7914.1.2.1.14 NAME &#039;qmailAccountPurge&#039; DE&lt;br /&gt;
 SC &#039;The earliest date when a mailMessageStore will be purged&#039; EQUALITY numeri&lt;br /&gt;
 cStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {13}( 1.3.6.1.4.1.7914.1.2.1.15 NAME &#039;mailQuotaSize&#039; DESC &#039;&lt;br /&gt;
 The size of space the user can have until further messages get bounced.&#039; EQUA&lt;br /&gt;
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {14}( 1.3.6.1.4.1.7914.1.2.1.16 NAME &#039;mailQuotaCount&#039; DESC &lt;br /&gt;
 &#039;The number of messages the user can have until further messages get bounced.&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {15}( 1.3.6.1.4.1.7914.1.2.1.17 NAME &#039;mailSizeMax&#039; DESC &#039;Th&lt;br /&gt;
 e maximum size of a single messages the user accepts.&#039; EQUALITY integerMatch &lt;br /&gt;
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {16}( 1.3.6.1.4.1.7914.1.3.1.1 NAME &#039;dnmember&#039; DESC &#039;Group &lt;br /&gt;
 member specified as distinguished name.&#039; EQUALITY distinguishedNameMatch SYNT&lt;br /&gt;
 AX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {17}( 1.3.6.1.4.1.7914.1.3.1.2 NAME &#039;rfc822member&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA5Ma&lt;br /&gt;
 tch SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{&lt;br /&gt;
 256} )&lt;br /&gt;
olcAttributeTypes: {18}( 1.3.6.1.4.1.7914.1.3.1.3 NAME &#039;filtermember&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} )&lt;br /&gt;
olcAttributeTypes: {19}( 1.3.6.1.4.1.7914.1.3.1.4 NAME &#039;senderconfirm&#039; DESC &#039;S&lt;br /&gt;
 ender to Group has to answer confirmation email.&#039; EQUALITY booleanMatch SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {20}( 1.3.6.1.4.1.7914.1.3.1.5 NAME &#039;membersonly&#039; DESC &#039;Sen&lt;br /&gt;
 der to Group must be group member itself.&#039; EQUALITY booleanMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {21}( 1.3.6.1.4.1.7914.1.3.1.6 NAME &#039;confirmtext&#039; DESC &#039;Tex&lt;br /&gt;
 t that will be sent with sender confirmation email.&#039; EQUALITY caseIgnoreMatch&lt;br /&gt;
  SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} &lt;br /&gt;
 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {22}( 1.3.6.1.4.1.7914.1.3.1.7 NAME &#039;dnmoderator&#039; DESC &#039;Gro&lt;br /&gt;
 up moderator specified as Distinguished name.&#039; EQUALITY distinguishedNameMatc&lt;br /&gt;
 h SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {23}( 1.3.6.1.4.1.7914.1.3.1.8 NAME &#039;rfc822moderator&#039; DESC &lt;br /&gt;
 &#039;Group moderator specified as normal rfc822 email address.&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12&lt;br /&gt;
 1.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {24}( 1.3.6.1.4.1.7914.1.3.1.9 NAME &#039;moderatortext&#039; DESC &#039;T&lt;br /&gt;
 ext that will be sent with request for moderation email.&#039; EQUALITY caseIgnore&lt;br /&gt;
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4&lt;br /&gt;
 096} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {25}( 1.3.6.1.4.1.7914.1.3.1.10 NAME &#039;dnsender&#039; DESC &#039;Allow&lt;br /&gt;
 ed sender specified as distinguished name.&#039; EQUALITY distinguishedNameMatch S&lt;br /&gt;
 YNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {26}( 1.3.6.1.4.1.7914.1.3.1.11 NAME &#039;rfc822sender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {27}( 1.3.6.1.4.1.7914.1.3.1.12 NAME &#039;filtersender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match S&lt;br /&gt;
 UBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {28}( 1.3.6.1.4.1.7914.1.4.1.1 NAME &#039;qladnmanager&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {29}( 1.3.6.1.4.1.7914.1.4.1.2 NAME &#039;qlaDomainList&#039; DESC &#039;&#039;&lt;br /&gt;
  EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {30}( 1.3.6.1.4.1.7914.1.4.1.3 NAME &#039;qlaUidPrefix&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.&lt;br /&gt;
 1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {31}( 1.3.6.1.4.1.7914.1.4.1.4 NAME &#039;qlaQmailUid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {32}( 1.3.6.1.4.1.7914.1.4.1.5 NAME &#039;qlaQmailGid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {33}( 1.3.6.1.4.1.7914.1.4.1.6 NAME &#039;qlaMailMStorePrefix&#039; D&lt;br /&gt;
 ESC &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX&lt;br /&gt;
  1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {34}( 1.3.6.1.4.1.7914.1.4.1.7 NAME &#039;qlaMailQuotaSize&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {35}( 1.3.6.1.4.1.7914.1.4.1.8 NAME &#039;qlaMailQuotaCount&#039; DES&lt;br /&gt;
 C &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {36}( 1.3.6.1.4.1.7914.1.4.1.9 NAME &#039;qlaMailSizeMax&#039; DESC &#039;&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {37}( 1.3.6.1.4.1.7914.1.4.1.10 NAME &#039;qlaMailHostList&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.&lt;br /&gt;
 3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcObjectClasses: {0}( 1.3.6.1.4.1.7914.1.2.2.1 NAME &#039;qmailUser&#039; DESC &#039;QMail-L&lt;br /&gt;
 DAP User&#039; SUP top AUXILIARY MUST mail MAY ( uid $ mailMessageStore $ homeDire&lt;br /&gt;
 ctory $ userPassword $ mailAlternateAddress $ qmailUID $ qmailGID $ mailHost &lt;br /&gt;
 $ mailForwardingAddress $ deliveryProgramPath $ qmailDotMode $ deliveryMode $&lt;br /&gt;
  mailReplyText $ accountStatus $ qmailAccountPurge $ mailQuotaSize $ mailQuot&lt;br /&gt;
 aCount $ mailSizeMax ) )&lt;br /&gt;
olcObjectClasses: {1}( 1.3.6.1.4.1.7914.1.3.2.1 NAME &#039;qmailGroup&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Group&#039; SUP top AUXILIARY MUST ( mail $ mailAlternateAddress $ mailMessag&lt;br /&gt;
 eStore ) MAY ( dnmember $ rfc822member $ filtermember $ senderconfirm $ membe&lt;br /&gt;
 rsonly $ confirmtext $ dnmoderator $ rfc822moderator $ moderatortext $ dnsend&lt;br /&gt;
 er $ rfc822sender $ filtersender ) )&lt;br /&gt;
olcObjectClasses: {2}( 1.3.6.1.4.1.7914.1.4.2.1 NAME &#039;qldapAdmin&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Subtree Admin&#039; SUP top AUXILIARY MUST ( qlaDnManager $ qlaDomainList $ q&lt;br /&gt;
 laMailMStorePrefix $ qlaMailHostList ) MAY ( qlaUidPrefix $ qlaQmailUid $ qla&lt;br /&gt;
 QmailGid $ qlaMailQuotaSize $ qlaMailQuotaCount $ qlaMailSizeMax ) )&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Exim LDAP integration ===&lt;br /&gt;
Add the following two routers:&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/450_exim4-config_ldap_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=That would be dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?mailForwardingAddress?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/451_exim4-config_ldap_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=Still not that dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/454_exim4-config_ldap_accept:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_accept:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  condition = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (uid=${quote_ldap:$local_part})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  transport = lmtp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want wildcard domain matching for your domain add the following (Note: to use wildcards in LDAP set the attribute 		&lt;br /&gt;
mail or mailAlternateAddress to @domain.tld):&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/452_exim4-config_ldap_wildcard_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/453_exim4-config_ldap_wildcard_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim LDAP integration ===&lt;br /&gt;
To run a lookup: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bt -d+lookup wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To assemble to proper query: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -be&lt;br /&gt;
&amp;gt; ${lookup ldapm{ user=bla pass=bla ldaps://your.ldap.server/dc=your,dc=basedn?mail?sub?mail=wilco@bitlair.nl}}&lt;br /&gt;
wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give you back your email address.&lt;br /&gt;
&lt;br /&gt;
=== Saslauthd LDAP integration ===&lt;br /&gt;
&lt;br /&gt;
Change the mechanisms to ldap in /etc/default/saslauthd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MECHANISMS=&amp;quot;ldap&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Write up a configuration file like this in /etc/saslauthd.conf (use your own LDAP settings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_bind_dn: cn=exim,ou=System,dc=bitlair,dc=nl&lt;br /&gt;
ldap_bind_pw: Your password&lt;br /&gt;
ldap_servers: ldaps://ldap.bitlair.nl/&lt;br /&gt;
ldap_search_base: dc=bitlair,dc=nl&lt;br /&gt;
ldap_filter: (&amp;amp;(objectclass=posixAccount)(uid=%u))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart saslauthd.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing saslauthd LDAP integration ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# testsaslauthd -u johndoe -p secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give back something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: OK &amp;quot;Success.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next up is testing SASL exim, see the SASL integration section for exim, above here.&lt;br /&gt;
&lt;br /&gt;
=== More information on LDAP integration ===&lt;br /&gt;
* https://spacefed.net/wiki/index.php/Howto/Spacenet/Setup_LDAP&lt;br /&gt;
* http://blog.toxa.de/archives/493&lt;br /&gt;
* http://www.slideshare.net/jpmens/exim-and-ldap-1829032&lt;br /&gt;
&lt;br /&gt;
== LMTP delivery ==&lt;br /&gt;
If you want to deliver your e-mail via LMTP, just set dc_localdelivery=&#039;lmtp&#039; in update-exim4.conf.conf. Then follow either the local or remote delivery section of this guide. Using the remote delivery section has the advantage of allowing full disk crypto on the mail store. You cannot do this on the MTA, because it needs to power on automatically to accept new emails instantly.&lt;br /&gt;
&lt;br /&gt;
=== Local delivery ===&lt;br /&gt;
For local delivery to dovecot, add this section in /etc/exim4/conf.d/transport/40-exim4_config-lmtp (create it if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
        driver = lmtp&lt;br /&gt;
        socket = /var/run/dovecot/lmtp&lt;br /&gt;
        #maximum number of deliveries per batch, default 1&lt;br /&gt;
        batch_max = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For remote delivery with 3 week hold function via LMTP ===&lt;br /&gt;
Setting up remote delivery via LMTP makes sense, because you can have your mail store encrypted and still receive new emails, because the MTA will keep accepting mails.&lt;br /&gt;
To set this up, update exim&#039;s retry policy for ::1, so that the MTA will hold on to temporarily failed e-mail deliveries for 3 weeks and will retry every 5 minutes.&lt;br /&gt;
&lt;br /&gt;
Add the following in /etc/exim4/conf.d/retry/30_exim4-config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
::::1  *           F,3w,5m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In transport/40-exim4-config-lmtp, add/modify the lmtp section to match this (create the file if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
  driver = smtp&lt;br /&gt;
  protocol = lmtp&lt;br /&gt;
  port = 24&lt;br /&gt;
  hosts = ::::1&lt;br /&gt;
  allow_localhost&lt;br /&gt;
  return_path_add&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will deliver to localhost on port 24. If you want to use a mail store with full disk crypto seperate from your Mail Transfer Agent, configure a secure tunnel from local port 24 to the LDA. That&#039;s because LMTP with crypto is not supported properly by dovecot.. and exim4 does not support delivery to TLS-on-connect secure tunnels.. so.. we will configure a pair of stunnels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dovecot doesn&#039;t support TLS for LMTP, so install stunnel4 using apt-get install stunnel4 on both the mailstore and the MTA machine. To properly do this, first set up a CA on the mail store with a client cert for all of your MTAs.&lt;br /&gt;
&lt;br /&gt;
The easiest way to set up a CA (use a descriptive name as common name, e.g. My LMTP client CA):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ mkdir CA&lt;br /&gt;
~$ cd CA&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newca&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newreq-nodes&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -signreq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will result in a newcert.pem and newkey.pem which need to be transferred to the MTA in /etc/ssl/lmtpcert.pem and /etc/ssl/private/lmtpkey.pem, and in demoCA/cacert.pem is the CA you just created, copy that to /etc/ssl/lmtpca.pem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the MTA, create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
verify = 2&lt;br /&gt;
CAfile = /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
cert = /etc/ssl/lmtpcert.pem&lt;br /&gt;
key = /etc/ssl/private/lmtpkey.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
client = yes&lt;br /&gt;
accept = ::1:24&lt;br /&gt;
connect = imap.bitlair.nl:24&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The other end (in this case dovecot), should have a similar stunnel4 setup. Note that the IMAP certificate is generated in the dovecot section (further down).&lt;br /&gt;
&lt;br /&gt;
Create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
&lt;br /&gt;
cert = /etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
key = /etc/ssl/private/imap.bitlair.nl-key.pem&lt;br /&gt;
CAfile = /etc/ssl/lmtpca.pem&lt;br /&gt;
verify = 2&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
accept  = :::24&lt;br /&gt;
connect = /var/run/dovecot/lmtp&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now on both the MTA and the mail store, start the stunnel services.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service stunnel4 start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing LMTP delivery ===&lt;br /&gt;
To test if LMTP works, you need to have dovecot set up already. Send yourself an e-mail, see if it arrives.&lt;br /&gt;
&lt;br /&gt;
=== More information on LMTP ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_lmtp_transport.html&lt;br /&gt;
* http://wiki2.dovecot.org/LMTP&lt;br /&gt;
* https://www.ietf.org/rfc/rfc2033.txt&lt;br /&gt;
== Mailman ==&lt;br /&gt;
Mailman is a mailing list server. Setting this up will enable you to run both public and private, archived mailing lists, compatible with DKIM and SPF. Note that DMARC policies interfere with mailing lists, so either reject mail from DMARC p=reject domains or Munge the from address in the mails..&lt;br /&gt;
&lt;br /&gt;
You will need a mailing list subdomain, for example list.bitlair.nl. This way, Exim will route messages through a pipe if it&#039;s destined for a mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for list.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/list.bitlair.nl-key.pem -out /etc/ssl/list.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (list.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/list.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up Mailman ===&lt;br /&gt;
First thing is to create a mailman mailing list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newlist mailman&lt;br /&gt;
Enter the email of the person running the list: your@email.address&lt;br /&gt;
Initial mailman password: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the URL and mailing list domain in /etc/mailman/mm_cfg.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default domain for email addresses of newly created MLs&lt;br /&gt;
DEFAULT_EMAIL_HOST = &#039;list.bitlair.nl&#039;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default host for web interface of newly created MLs&lt;br /&gt;
DEFAULT_URL_HOST   = &#039;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following lines near the end in /etc/mailman/mm_cfg.py to streamline message sending.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Max recipients for each message&lt;br /&gt;
SMTP_MAX_RCPTS = 1000&lt;br /&gt;
# Max messages sent in each SMTP connection&lt;br /&gt;
SMTP_MAX_SESSIONS_PER_CONNECTION = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Exim for mailman ===&lt;br /&gt;
Unfortunately, mailman 2.1 does not support LMTP yet. It requires a bit more configuration to get the mailman transport going. Mailman 2.2 (development branch now deprecated in favour of 3.0) does have it, so once mailman 3 arrives, upgrade to a more simple configuration set-up than this.&lt;br /&gt;
&lt;br /&gt;
Configure the mailman exim settings in /etc/exim4/conf.d/main/05_exim4-config_mailman_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Mailman macro definitions&lt;br /&gt;
&lt;br /&gt;
# Home dir for the Mailman installation&lt;br /&gt;
MM_HOME=/var/lib/mailman&lt;br /&gt;
&lt;br /&gt;
# User and group for Mailman&lt;br /&gt;
MM_UID=list&lt;br /&gt;
MM_GID=list&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Domains that your lists are in - colon separated list&lt;br /&gt;
# you may wish to add these into local_domains as well&lt;br /&gt;
domainlist mm_domains=list.bitlair.nl&lt;br /&gt;
&lt;br /&gt;
# The path of the Mailman mail wrapper script&lt;br /&gt;
MM_WRAP=MM_HOME/mail/mailman&lt;br /&gt;
#&lt;br /&gt;
# The path of the list config file (used as a required file when&lt;br /&gt;
# verifying list addresses)&lt;br /&gt;
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure the mailman router in /etc/exim4/conf.d/router/449_exim4-config_mailman_router:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_router:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  domains = +mm_domains&lt;br /&gt;
  require_files = MM_LISTCHK&lt;br /&gt;
  local_part_suffix_optional&lt;br /&gt;
  local_part_suffix = -admin : \&lt;br /&gt;
    -bounces   : -bounces+*  : \&lt;br /&gt;
    -confirm   : -confirm+*  : \&lt;br /&gt;
    -join      : -leave      : \&lt;br /&gt;
    -owner     : -request    : \&lt;br /&gt;
    -subscribe : -unsubscribe&lt;br /&gt;
  transport = mailman_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Configure the mailman transport in /etc/exim4/conf.d/transport/40_exim4-config_mailman_pipe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_transport:&lt;br /&gt;
  driver  = pipe&lt;br /&gt;
  command = MM_WRAP \&lt;br /&gt;
          &#039;${if def:local_part_suffix \&lt;br /&gt;
                {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \&lt;br /&gt;
                {post}}&#039; \&lt;br /&gt;
          $local_part&lt;br /&gt;
  current_directory = MM_HOME&lt;br /&gt;
  home_directory    = MM_HOME&lt;br /&gt;
  user              = MM_UID&lt;br /&gt;
  group             = MM_GID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure exim to accept mail for list.yourdomain.tld in /etc/exim4/update-exim4.conf.conf, by adding it to the dc_other_hostnames list. This is a semicolon-separated list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dc_other_hostnames=&#039;bitlair.nl;spf-must-die.org;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring apache for mailman ===&lt;br /&gt;
Create a site configuration in /etc/apache2/sites-available/list.bitlair.nl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName list.bitlair.nl&lt;br /&gt;
        ServerAdmin your@email.address&lt;br /&gt;
        DocumentRoot /var/www/&lt;br /&gt;
	SSLEngine on&lt;br /&gt;
	SSLCertificateFile    /etc/ssl/list.bitlair.nl-cert.pem&lt;br /&gt;
	SSLCertificateKeyFile /etc/ssl/private/list.bitlair.nl-key.pem&lt;br /&gt;
        SSLCertificateChainFile /etc/ssl/sub.class2.server.sha2.ca.pem&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3&lt;br /&gt;
        SSLHonorCipherOrder on&lt;br /&gt;
        SSLCipherSuite &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \&lt;br /&gt;
              EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 \&lt;br /&gt;
              EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                # This directive allows us to have apache2&#039;s default start page&lt;br /&gt;
                # in /apache2-default/, but still have / go to the right place&lt;br /&gt;
                RedirectMatch ^/$ /cgi-bin/mailman/listinfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/&lt;br /&gt;
        &amp;lt;Directory &amp;quot;/usr/lib/cgi-bin&amp;quot;&amp;gt;&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
	Alias /pipermail /var/lib/mailman/archives/public&lt;br /&gt;
	Alias /images/mailman /usr/share/images/mailman&lt;br /&gt;
	&amp;lt;Directory /var/lib/mailman/archives/public&amp;gt;&lt;br /&gt;
	    DirectoryIndex index.html&lt;br /&gt;
	&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Of course, replace list.bitlair.nl with your own list subdomain.&lt;br /&gt;
&lt;br /&gt;
Give permission to the web user to modify list data by adding www-data to the group list.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G list www-data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the site and ssl module&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# a2enmod ssl&lt;br /&gt;
~# a2ensite list.bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Reload apache&#039;s configuration gracefully&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apache2ctl graceful&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up mailing lists ===&lt;br /&gt;
TODO, guided tour:&lt;br /&gt;
* Set DMARC-policies!&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
=== Testing Mailman ===&lt;br /&gt;
Browse to your list url, e.g. https://list.bitlair.nl. Create a mailing list and subscribe yourself and a test mail address. Play around with the settings until you&#039;re comfortable with it.&lt;br /&gt;
&lt;br /&gt;
To verify your SSL-setup on your URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl s_client -connect list.bitlair.nl:443 -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
... &amp;gt;snip&amp;lt; ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should give you the Verify return code 0 (ok) again, any other status code means there is something wrong with your certificate.&lt;br /&gt;
&lt;br /&gt;
=== More information about mailman ===&lt;br /&gt;
* http://wiki.list.org/DEV/DMARC&lt;br /&gt;
* http://www.exim.org/howto/mailman21.html&lt;br /&gt;
* https://www.debian-administration.org/article/617/Mailman_and_Exim4&lt;br /&gt;
* https://www.gnu.org/software/mailman/&lt;br /&gt;
&lt;br /&gt;
== Dovecot ==&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for imap.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/imap.bitlair.nl-key.pem -out /etc/ssl/imap.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (imap.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/imap.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up dovecot ===&lt;br /&gt;
Configuring dovecot should be pretty straightforward. The first step is to disable plain IMAP.&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-master.conf set port = 0 for both imap and pop3 and enable imaps. Only use the TLS-protected ports.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  inet_listener imap {&lt;br /&gt;
          port = 0&lt;br /&gt;
  }&lt;br /&gt;
  inet_listener imaps {&lt;br /&gt;
    port = 993&lt;br /&gt;
    ssl = yes&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-ssl.conf, disable SSLv3, mandate TLS and configure your certificates:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl = required&lt;br /&gt;
ssl_cert = &amp;lt;/etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
ssl_key = &amp;lt;/etc/dovecot/private/imap.bitlair.nl-key.pem&lt;br /&gt;
ssl_protocols = !SSLv2 !SSLv3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Set the mail location where you want your mail delivered in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_location = mdbox:/srv/mail/%n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want mailbox sharing between users, dovecot needs to setuid all mailboxes with the same user, so set this in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_uid = vmail&lt;br /&gt;
mail_gid = vmail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the lmtp service in /etc/dovecot/conf.d/10-master.conf and override the user, so LMTP doesn&#039;t run as root.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service lmtp {&lt;br /&gt;
  user = vmail&lt;br /&gt;
  unix_listener lmtp {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the auth_username_format to %n in /etc/dovecot/conf.d/10-auth.conf, to make sure mail sent to username@domain via LMTP is delivered to the lower case username.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_username_format = %Ln&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the autocreate setting properly for the Local Delivery Agent in /etc/dovecot/conf.d/15-lda.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lda_mailbox_autocreate = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the vmail user and create the mail store&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd --system vmail&lt;br /&gt;
~# mkdir -m 0700 /srv/mail&lt;br /&gt;
~# chown vmail: /srv/mail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set up sieve filters, uncomment the listen section in /etc/dovecot/conf.d/20-managesieve.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service managesieve-login {&lt;br /&gt;
  inet_listener sieve {&lt;br /&gt;
    port = 4190&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are going to change a few things in order to get sieve working properly. &lt;br /&gt;
&lt;br /&gt;
First open and comment out the following in &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#  sieve = ~/.dovecot.sieve&lt;br /&gt;
#  sieve_dir = ~/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the reason we need to comment out the above entries is because a users home directory for mail is  &amp;quot;/srv/mail/%n&amp;quot; (%n = Username)and what the default actually says is check &amp;quot;/home/%n&amp;quot; for the sieve script which will fail due to the fact the vmail user cannot access that directory so we are going to move sieve configs to the users mailbox directory. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now in the same file &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot; add the following just under &amp;quot;plugin {&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
    sieve = /srv/mail/%n/.dovecot.sieve&lt;br /&gt;
    sieve_global_path = /etc/dovecot/sieve/default.sieve&lt;br /&gt;
    sieve_dir = /srv/mail/%n&lt;br /&gt;
    sieve_global_dir = /etc/dovecot/sieve/global/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We need to create the default directories next which will give us global rules for all users. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mkdir -p /etc/dovecot/sieve/global&lt;br /&gt;
chown vmail:vmail -R /etc/dovecot/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have the directories for global rules for all users.&lt;br /&gt;
&lt;br /&gt;
Now we are going to restart dovecot using the following command to update the configuration of dovecot: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
## service dovecot restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to test this lets add a test global rule by editing &amp;quot;/etc/dovecot/sieve/default.sieve&amp;quot; and adding the following: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
require [&amp;quot;fileinto&amp;quot;];&lt;br /&gt;
# rule:[SPAM]&lt;br /&gt;
if header :contains &amp;quot;X-Spam-Flag&amp;quot; &amp;quot;YES&amp;quot; {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
# rule:[SPAM2]&lt;br /&gt;
elsif header :matches &amp;quot;Subject&amp;quot; [&amp;quot;*money*&amp;quot;,&amp;quot;*Viagra*&amp;quot;,&amp;quot;Cialis&amp;quot;] {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
now to test it send yourself a mail with money in the subject and see if it gets filed into Junk. &lt;br /&gt;
If it does not work try sending it from an external mailserver and see if it works then. &lt;br /&gt;
&lt;br /&gt;
Now if you want to add a rule that applies only to a single user then make add the same rule to the file &amp;quot;/srv/mail/username/.dovecot.sieve&amp;quot; and make sure the file is owned and writeable by the vmail user. &lt;br /&gt;
&lt;br /&gt;
that&#039;s everything you need to know about sieve if an error occurs /var/log/mail.log will tell you and a log file will be created in the same directory as the sieve rule when an issue with the rule occurs. &lt;br /&gt;
&lt;br /&gt;
If you are not using LDAP then the following applies to you:&lt;br /&gt;
&lt;br /&gt;
And also, if you&#039;re not going to use LDAP, set the following overrides in /etc/dovecot/conf.d/auth-system.conf.ext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  # &amp;lt;doc/wiki/AuthDatabase.Passwd.txt&amp;gt;&lt;br /&gt;
  driver = passwd&lt;br /&gt;
  # [blocking=no]&lt;br /&gt;
  #args =&lt;br /&gt;
&lt;br /&gt;
  # Override fields from passwd&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you&#039;re basically done. If you want LDAP integration, continue with the next section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integrating LDAP into dovecot ===&lt;br /&gt;
Make sure dovecot-ldap is installed. &lt;br /&gt;
Change /etc/dovecot/conf.d/10-auth.conf to include auth-ldap.conf.ext and not include auth-system.conf.ext&lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-auth.conf and change your overrides in the userdb section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  driver = ldap&lt;br /&gt;
  args = /etc/dovecot/dovecot-ldap.conf.ext&lt;br /&gt;
&lt;br /&gt;
  # Default fields can be used to specify defaults that LDAP may override&lt;br /&gt;
  #default_fields = home=/home/virtual/%u&lt;br /&gt;
&lt;br /&gt;
  # Override fields that are always set to this value, regardless of what LDAP returns&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now open /etc/dovecot/dovecot-ldap.conf.ext, configure your exim search user, base dn and search filter.&lt;br /&gt;
&lt;br /&gt;
You should be done now.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Testing logins:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
1 LOGIN username password&lt;br /&gt;
1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE] Logged in&lt;br /&gt;
2 LOGOUT&lt;br /&gt;
* BYE Logging out&lt;br /&gt;
2 OK Logout completed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing your TLS configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993 -CAfile /etc/ssl/certs/ca-certificates.crt -verify 5&lt;br /&gt;
&lt;br /&gt;
... -&amp;gt;snip certificate stuff&amp;lt;- ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see return code: 0 (ok), any other return code is bad.&lt;br /&gt;
&lt;br /&gt;
=== ACL and Shared mailboxs (allowing delegated mailboxes)  ===&lt;br /&gt;
&lt;br /&gt;
To allow users to share mailboxes with each other add the following configuration changes. &lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-mail.conf and uncomment the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace inbox {&lt;br /&gt;
  type = private&lt;br /&gt;
  separator = / &lt;br /&gt;
  #prefix = &lt;br /&gt;
  #location =&lt;br /&gt;
  inbox = yes&lt;br /&gt;
  #hidden = no&lt;br /&gt;
  #list = yes&lt;br /&gt;
  #subscriptions = yes&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that following option is set in the /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
&lt;br /&gt;
# Space separated list of plugins to load for all services. Plugins specific to&lt;br /&gt;
# IMAP, LDA, etc. are added to this list in their own .conf files.&lt;br /&gt;
mail_plugins = acl&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add the following to the end of the same file (/etc/dovecot/conf.d/10-mail.conf): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  type = shared&lt;br /&gt;
  separator = /&lt;br /&gt;
  prefix = shared/%%n/&lt;br /&gt;
  location = mdbox:/srv/mail/%%n&lt;br /&gt;
  subscriptions = yes&lt;br /&gt;
  list = children&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the file /etc/dovecot/conf.d/20-imap.conf make sure the following changes are made: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
  # Space separated list of plugins to load (default is global mail_plugins).&lt;br /&gt;
  mail_plugins = $mail_plugins imap_acl&lt;br /&gt;
&lt;br /&gt;
  # Maximum number of IMAP connections allowed for a user from each IP address.&lt;br /&gt;
  # NOTE: The username is compared case-sensitively.&lt;br /&gt;
  #mail_max_userip_connections = 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And finally add the following to the /etc/dovecot/conf.d/90-acl.conf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin {&lt;br /&gt;
   #acl = vfile:/etc/dovecot/global-acls:cache_secs=300&lt;br /&gt;
   acl = vfile&lt;br /&gt;
   #acl_shared_dict = file:/etc/dovecot/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# To let users LIST mailboxes shared by other users, Dovecot needs a&lt;br /&gt;
# shared mailbox dictionary. For example:&lt;br /&gt;
plugin {&lt;br /&gt;
  #acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes&lt;br /&gt;
  acl_shared_dict = file:/srv/mail/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardening ==&lt;br /&gt;
=== Exim4 rate limiting ===&lt;br /&gt;
First, we need to make sure only 1 message is sent per connection, we also want to limit the number of simultaneous connections. For most small mail providers, allowing 20 simulataneous connections should be plenty.&lt;br /&gt;
&lt;br /&gt;
Create a file in /etc/exim4/conf.d/main/04_ratelimiting with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smtp_accept_max_per_connection = 1&lt;br /&gt;
smtp_accept_max_per_host = 1&lt;br /&gt;
smtp_accept_max = 20&lt;br /&gt;
acl_smtp_connect = acl_check_connect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And create the ACL file /etc/exim4/conf.d/acl/50_exim4-connectdelay with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl_check_connect:&lt;br /&gt;
  accept&lt;br /&gt;
    delay = 3s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing the banner delay ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet ::1 25&lt;br /&gt;
Trying ::1...&lt;br /&gt;
Connected to ::1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
EHLO boe&lt;br /&gt;
554 SMTP synchronization error&lt;br /&gt;
Connection closed by foreign host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SMTP banner should only appear after 3 seconds of not giving any inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rate limiting hosts with iptables ===&lt;br /&gt;
Make sure you input something like this into your firewall. The mask here implies throttling new connections for entire /64s:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For legacy IP:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes sure that nobody can connect more than 6 times per minute to your SMTP server.&lt;br /&gt;
I also have a port scan wrapper which auto-blacklists bad people, so my firewall looks like this in my executable /etc/network/if-pre-up.d/ip6tables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
(ip6tables -F&lt;br /&gt;
ip6tables -X&lt;br /&gt;
ipset flush local6&lt;br /&gt;
ipset destroy local6&lt;br /&gt;
)&amp;amp;&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipset create local6 hash:net hashsize 1024 family inet6&lt;br /&gt;
ipset add local6 2001:470:7b66::/48&lt;br /&gt;
ipset add local6 fe80::/16&lt;br /&gt;
ipset add local6 ::1/128&lt;br /&gt;
&lt;br /&gt;
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -m set --match-set local6 src -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp -m state --state NEW -m recent --rcheck --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name sshthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name sshthrottle --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 \! --icmpv6-type redirect -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on hardening ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://techsadmin.blogspot.nl/2012/11/exim-hardening-practices.html&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
In general, look at the log files /var/log/exim4/mainlog and /var/log/exim4/paniclog. For Clamav, look at /var/log/clamav/clamav.log. For spamd, check out the main syslog in /var/log/syslog.&lt;br /&gt;
&lt;br /&gt;
Most issues are caused by forgetting to regenerate the configuration, try regenerating and restarting exim4 to see if your problem persists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to add the clamav user to the exim group ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 14:13:46 1YXD2f-0000D2-BL malware acl condition: clamd: ClamAV &lt;br /&gt;
   returned: /var/spool/exim4/scan/1YXD2f-0000D2-BL/1YXD2f-0000D2-BL.eml: lstat() failed: Permission denied. ERROR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not using wheezy-updates or jessie-updates repository ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WARNING: Your ClamAV installation is OUTDATED!&lt;br /&gt;
WARNING: Local version: 0.98.5 Recommended version: 0.98.6&lt;br /&gt;
DON&#039;T PANIC! Read http://www.clamav.net/support/faq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed by adding the -updates repository to /etc/apt/sources.list, for wheezy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian wheezy-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For Debian jessie:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian jessie-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Forgetting to add the exim to sasl group ===&lt;br /&gt;
You&#039;ll see something like this in the mainlog:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 16:01:54 plain_saslauthd_server authenticator failed for (mail.bitlair.nl) [2a02:2ca0:aaa::a843:657d]: &lt;br /&gt;
    435 Unable to authenticate at present (set_id=wilco): cannot connect to saslauthd daemon at /var/run/saslauthd/mux: Permission denied&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And swaks will tell you:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;~* 435 Unable to authenticate at present&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Running the following will fix it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== auth-ldap and dovecot-ldap.conf files missing ===&lt;br /&gt;
You cannot find the auth-ldap files in the /etc/dovecot/conf.d or the dovecot-ldap file in /etc/dovecot.&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to install dovecot-lmtpd ===&lt;br /&gt;
You&#039;ve enabled the lmtp service, but when starting dovecot, the UNIX socket /var/run/dovecot/lmtp is not created.&lt;br /&gt;
&lt;br /&gt;
Exim will give messages like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-31 09:43:57 1Ycqq4-0004Q8-NP == wilco@bitlair.nl &amp;lt;root@bitlair.nl&amp;gt; R=ldap_users T=lmtp defer (-1): &lt;br /&gt;
    Failed to connect to socket /var/run/dovecot/lmtp for lmtp transport: No such file or directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-lmtpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Spamassassin hits rule URIBL_BLOCKED on every mail message ===&lt;br /&gt;
You keep getting spamassassin URIBL_BLOCKED on every message.. this is likely caused by using large caching DNS servers.&lt;br /&gt;
&lt;br /&gt;
Set up your own DNS server on your box to fix it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install bind9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Test it with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ host www.google.nl ::1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If it works, change your resolv.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# echo nameserver ::1 &amp;gt; /etc/resolv.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== You keep getting 550 relay not permitted for local email addresses ===&lt;br /&gt;
You most likely forgot to include your domain as a local domain.&lt;br /&gt;
&lt;br /&gt;
You can change this in /etc/exim4/update-exim4.conf.conf. There is a semicolon-separated list of dc_other_hostnames. These are the hostnames to accept mail for.&lt;br /&gt;
&lt;br /&gt;
After adding your domains to this file, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  Unable to verify the first certificate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Verify return code: 21 (unable to verify the first certificate)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means you forgot to append the chain file to the certificate. See the TLS section on appending the certificate chain and check the certificate chain you see in the s_client output.&lt;br /&gt;
&lt;br /&gt;
Verify that there are two certificates in /etc/ssl/your-mailserver-cert.pem. The first one should be your mail certificate and the second one should be the chain file.&lt;br /&gt;
&lt;br /&gt;
=== TLS not available and Error while reading file message in exim4.log ===&lt;br /&gt;
You will get output from s_client like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
139736697235088:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:774:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or &amp;quot;TLS is currently unavailable&amp;quot; when issueing the STARTTLS command in SMTP.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see this message in the log:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-04-12 18:31:50 TLS error on connection from localhost (openssl.client.net) [127.0.0.1] (cert/key setup: cert=/etc/ssl/mail.bitlair.nl-cert.pem key=/etc/ssl/private/mail.bitlair.nl-key.pem): Error while reading file.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be fixed by setting the access rights appropriately (see the TLS section). Don&#039;t forget to restart exim4! The problem may also be caused by not restarting exim4 adding Debian-exim to the ssl-cert group. It may also be caused by the certificates being missing or a typo in the location in the configuration file. After editing, regenerate the configuration file!&lt;br /&gt;
&lt;br /&gt;
=== Keep getting 421 Unexpected failure after RCPT TO ===&lt;br /&gt;
&lt;br /&gt;
Check your exim4 mainlog, it may say something like &amp;quot;no host name found for IP address xxxx:xxx:xxx::xxx. &lt;br /&gt;
Your mail server will only accept mail if you have a valid reverse DNS entry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DKIM signatures are not added ===&lt;br /&gt;
Add some debugging output to your mainlog by setting this debug_print in /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote_smtp:&lt;br /&gt;
  debug_print = &amp;quot;T: remote_smtp for $local_part@$domain, DKIM domain DKIM_DOMAIN DKIM_FILE&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, stop exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service exim4 stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, start exim4 in transport debugging mode in a new terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bd -d+transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can send yourself another email and you should see messages about which DKIM domain and key it is going to use in the debugging output&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=7427</id>
		<title>Projects/Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Projects/Mailserver_with_Debian,_Exim,_spamassassin,_greylistd,_DKIM,_SRS,_SPF,_DMARC,_forwarding,_LDAP,_dovecot,_LMTP,_disk_crypto&amp;diff=7427"/>
		<updated>2020-07-23T18:07:08Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Enable SPF checking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|name=Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto&lt;br /&gt;
|start=2015/03/01&lt;br /&gt;
|contact=WilcoBaanHofman&lt;br /&gt;
|info=This page describes how we set up our mail system and how other people can set up their own full blown modern mail servers.&lt;br /&gt;
|status=Production&lt;br /&gt;
|Picture=Email-icon-vector.jpg&lt;br /&gt;
}}&lt;br /&gt;
This page will talk about how to set up a mail server, and also how to comply with Google mail / gmail&#039;s bizarre, idiotic IPv6 spam policies. &lt;br /&gt;
&lt;br /&gt;
You will need an SPF policy, DKIM and a valid forward/reverse DNS which matches the EHLO your mailserver sends. You will need spam filtering, virus filtering and a valid TLS connection.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Running an external (partial) LDAP slave&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* A (virtual) machine running Debian wheezy or jessie with public IPv4 and IPv6 internet connectivity&lt;br /&gt;
* Possibility to set up reverse DNS for your IPv4 and IPv6 addresses&lt;br /&gt;
* Ability to have a CA sign your certificates (can be done for free with Let&#039;s Encrypt).&lt;br /&gt;
&lt;br /&gt;
== Determine your setup ==&lt;br /&gt;
What kind of setup are you going to run?&lt;br /&gt;
* Single mailserver&lt;br /&gt;
* MTA + Encrypted mail store&lt;br /&gt;
* High-availability setup&lt;br /&gt;
&lt;br /&gt;
=== Single mailserver ===&lt;br /&gt;
In this case, install all packages on the same machine, do not use disk encryption, because your mail server will be unreachable after a power failure.&lt;br /&gt;
&lt;br /&gt;
=== MTA + Encrypted mail store ===&lt;br /&gt;
This is the best scenario for small setups and requires two (virtual) machines, one MTA that handles accepting of emails and spam/virus filtering and one machine that is encrypted. This guide covers this setup. To prepare for this setup, simple install one machine without disk crypto and one with. The MTA will hold mail for up to 3 weeks if you haven&#039;t typed your disk crypto password on boot yet (See the lmtp section).&lt;br /&gt;
&lt;br /&gt;
The setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Encrypted-mailstore.png]]&lt;br /&gt;
&lt;br /&gt;
=== High-availability ===&lt;br /&gt;
Running MTAs in high availability is easy, just duplicate the MTA setup and add two MX records to your domains. (Of course, your bayesian spam filters may train differently..). Running dovecot in high-availability is a different story.. &lt;br /&gt;
&lt;br /&gt;
The safest way to run dovecot in high-availibility mode is to run the mail store on top of a high-performance redundant NAS. This can be a proprietary NAS or some open source HA NFS setup. You will need shared NFS storage. The best performing mailbox format is mdbox, but this is also the easiest store to corrupt the indexes of if two nodes write to it in parallel. Locking may cause performance degradation and has to work reliably on your NFS backend, otherwise the indexes get corrupted. To prevent index corruption and locking overhead, there is the director component, which will pin a user to a node as long as that node is up. The dovecot part of this setup is *not* included in this guide (yet).&lt;br /&gt;
&lt;br /&gt;
This setup will look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Mailserver-HA.png]]&lt;br /&gt;
&lt;br /&gt;
== Install the packages ==&lt;br /&gt;
&lt;br /&gt;
Step 1: Install the required packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install exim4-daemon-heavy spamassassin clamav-daemon greylistd spf-tools-perl sasl2-bin srs pyzor razor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want to run a mailing list server as well, also install mailman and apache2.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install mailman apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If dovecot is going to run on this same host (you&#039;re not doing high-availability or full disk crypto mail store), also install dovecot-imapd, dovecot-ldap and dovecot-lmtpd on the mta. Otherwise, do this on the host(s) where you want to run your dovecot.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-imapd dovecot-ldap dovecot-lmtpd dovecot-sieve dovecot-managesieved&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verify that no interfering packages are installed (like postfix, sendmail, amavis)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ dpkg -l |egrep &#039;(postfix|sendmail|amavis)&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This command should give no output, if it does and starts with ii, remove that package.&lt;br /&gt;
&lt;br /&gt;
== Configuring exim4 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# dpkg-reconfigure exim4-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Choose internet site, set the host name to the value you will set the reverse DNS to, specify all domains you want to receive mail for and choose split files (unless you want to replace every exim4 file name here with exim4.conf.template in this manual).&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim4 ===&lt;br /&gt;
Now try to see if simple address resolution works. This will only test against local system users. It&#039;s good to test this, even if you&#039;re going to add LDAP later.&lt;br /&gt;
Substitute the IP and mail addresses for your own stuff. For now, you can test any local system user @ one of the domains you accepted.&lt;br /&gt;
&lt;br /&gt;
Any line not starting with a number is something you have to type yourself to test this.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:27 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
RCPT TO: &amp;lt;aoeu@bitlair.nl&amp;gt;&lt;br /&gt;
550 Unrouteable address&lt;br /&gt;
QUIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hint; Use let&#039;s encrypt to keep these keys valid.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To generate the key and certificate signing request (replace mail.bitlair.nl with your Fully Qualified Domain Name):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/mail.bitlair.nl-key.pem -out /etc/ssl/mail.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the Common Name field, input your mail hostname (mail.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Copy the certificate signing request to a CA for signing. Allow the CA to sign it, then you&#039;ll receive a certificate from the CA. Place the received certificate in /etc/ssl/mail.your.domain-cert.pem&lt;br /&gt;
&lt;br /&gt;
Put MAIN_TLS_ENABLE=yes near the top in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions and set the following keys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAIN_TLS_CERTIFICATE = /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
MAIN_TLS_PRIVATEKEY = /etc/ssl/private/mail.bitlair.nl-key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the ssl-cert group, allow this group to read in /etc/ssl/private and add the exim user to the ssl-cert group to make sure exim can read the private key:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# groupadd --system ssl-cert&lt;br /&gt;
~# chgrp ssl-cert /etc/ssl/private&lt;br /&gt;
~# chmod 750 /etc/ssl/private&lt;br /&gt;
~# usermod -a -G ssl-cert Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download your chain file from your CA. Store the chain file in /etc/ssl/. &lt;br /&gt;
&lt;br /&gt;
Now append its content to /etc/ssl/your-domain-cert.pem. I have a class 2 certificate, so I used this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# cat /etc/ssl/sub.class2.server.sha2.ca.pem &amp;gt;&amp;gt; /etc/ssl/mail.bitlair.nl-cert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing STARTTLS ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25 &lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 12:37:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
STARTTLS&lt;br /&gt;
220 TLS go ahead&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
STARTTLS should be listed and give a 220 status code.&lt;br /&gt;
&lt;br /&gt;
=== Testing TLS ===&lt;br /&gt;
Unfortunately, openssl s_client does not support IPv6, but this the tests the legacy IP listener as well as TLS:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect mail.bitlair.nl:25 -starttls smtp -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA256&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
Secure Renegotiation IS supported&lt;br /&gt;
Compression: NONE&lt;br /&gt;
Expansion: NONE&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1.2&lt;br /&gt;
    Cipher    : DHE-RSA-AES256-SHA256&lt;br /&gt;
    Session-ID: 82CBCEC7833853A674F6399694A03052566C494E1F6DDC8DE2CD4B3A9F8ED528&lt;br /&gt;
    Session-ID-ctx: &lt;br /&gt;
    Master-Key: BAE67F5D50E5C1C95FBDF355C1BDE18C6251E13F5B8686977292A54657498EFECFF518290211F24F01C40E39929981C4&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    PSK identity: None&lt;br /&gt;
    PSK identity hint: None&lt;br /&gt;
    SRP username: None&lt;br /&gt;
    Start Time: 1426438799&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should give Verify return code 0 at all times. Anything else is wrong.. see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
== SASL Authenticated relay ==&lt;br /&gt;
To enable relaying of messages after authentication, for SPF or just for laptops that are on different connections all the time, SASL authentication needs to be enabled.&lt;br /&gt;
&lt;br /&gt;
=== Enabling other ports than 25 ===&lt;br /&gt;
Port 25 is usually blocked by firewalls, for good reason. An alternative authenticated-only submission port exists on port 587 and a legacy TLS on connect port on 465 also exists.&lt;br /&gt;
&lt;br /&gt;
To enable these, set the following in /etc/default/exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMTPLISTENEROPTIONS=&#039;-oX 25:465:587 -oP /var/run/exim4/exim.pid&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And in /etc/exim4/conf.d/main/03_exim4-config_tlsoptions add the following near the top:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tls_on_connect_ports=465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== SASL authentication ===&lt;br /&gt;
Set the following to /etc/default/saslauthd, this is the default these days&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start saslauthd.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/exim4/conf.d/auth/30_exim4-config_examples, uncomment the section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plain_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = PLAIN&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth2&lt;br /&gt;
  server_prompts = :&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&lt;br /&gt;
login_saslauthd_server:&lt;br /&gt;
  driver = plaintext&lt;br /&gt;
  public_name = LOGIN&lt;br /&gt;
  server_prompts = &amp;quot;Username:: : Password::&amp;quot;&lt;br /&gt;
  # don&#039;t send system passwords over unencrypted connections&lt;br /&gt;
  server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}&lt;br /&gt;
  server_set_id = $auth1&lt;br /&gt;
  .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS&lt;br /&gt;
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}&lt;br /&gt;
  .endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the Debian-exim user to the sasl group.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ swaks -a -tls -q AUTH -s 2a02:2ca0:aaa::a843:657d -au username&lt;br /&gt;
Password: enter_your_password&lt;br /&gt;
=== Trying 2a02:2ca0:aaa::a843:657d:25...&lt;br /&gt;
=== Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
&amp;lt;-  220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 16:04:35 -0400&lt;br /&gt;
 -&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;-  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;-  250-SIZE 52428800&lt;br /&gt;
&amp;lt;-  250-8BITMIME&lt;br /&gt;
&amp;lt;-  250-PIPELINING&lt;br /&gt;
&amp;lt;-  250-STARTTLS&lt;br /&gt;
&amp;lt;-  250 HELP&lt;br /&gt;
 -&amp;gt; STARTTLS&lt;br /&gt;
&amp;lt;-  220 TLS go ahead&lt;br /&gt;
=== TLS started w/ cipher DHE-RSA-AES256-SHA256&lt;br /&gt;
=== TLS peer subject DN=&amp;quot;/C=NL/ST=Utrecht/L=Amersfoort/O=Stichting Bitlair/CN=mail.bitlair.nl&amp;quot;&lt;br /&gt;
 ~&amp;gt; EHLO mail.bitlair.nl&lt;br /&gt;
&amp;lt;~  250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
&amp;lt;~  250-SIZE 52428800&lt;br /&gt;
&amp;lt;~  250-8BITMIME&lt;br /&gt;
&amp;lt;~  250-PIPELINING&lt;br /&gt;
&amp;lt;~  250-AUTH PLAIN LOGIN&lt;br /&gt;
&amp;lt;~  250 HELP&lt;br /&gt;
 ~&amp;gt; AUTH LOGIN&lt;br /&gt;
&amp;lt;~  334 VXNlcm5hbWU6&lt;br /&gt;
 ~&amp;gt; d2lsY28=&lt;br /&gt;
&amp;lt;~  334 UGFzc3dvcmQ6&lt;br /&gt;
 ~&amp;gt; YmxpZXA=&lt;br /&gt;
&amp;lt;~  235 Authentication succeeded&lt;br /&gt;
 ~&amp;gt; QUIT&lt;br /&gt;
&amp;lt;~  221 mail.bitlair.nl closing connection&lt;br /&gt;
Connection closed with remote host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Authentication succeeded is what you want!&lt;br /&gt;
&lt;br /&gt;
=== DNS block lists ===&lt;br /&gt;
Add CHECK_RCPT_IP_DNSBLS to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt, like my list of DNSBLs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_IP_DNSBLS=cbl.abuseat.org:sbl-xbl.spamhaus.org:psbl.surriel.com:b.barracudacentral.org:dul.dnsbl.sorbs.net:spamsources.fabel.dk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove the whole ifdef CHECK_RCPT_IP_DNSBLS section from /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt and place the following section just before the accept rule with relay_to_domains&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  accept&lt;br /&gt;
    domains      = +local_domains : +relay_to_domains&lt;br /&gt;
    dnslists      = list.dnswl.org&lt;br /&gt;
    logwrite      = $sender_host_address is whitelisted&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = ${sender_host_address} is listed at ${dnslist_domain}; See ${dnslist_text}&lt;br /&gt;
    !hosts = +relay_from_hosts&lt;br /&gt;
    !authenticated = *&lt;br /&gt;
    dnslists = CHECK_RCPT_IP_DNSBLS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information exim4 configuration ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/&lt;br /&gt;
&lt;br /&gt;
== Spamassassin ==&lt;br /&gt;
=== Spamassassin configuration ===&lt;br /&gt;
To enable spamd from spamassassin, set the following in /etc/default/spamassassin (these may already be the default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLED=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And add &amp;quot;-u debian-spamd&amp;quot; to the options, you will get something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OPTIONS=&amp;quot;--create-prefs --max-children 5 --helper-home-dir -u debian-spamd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And also enable the cron rules updates by setting&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRON=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will probably want more terse spam reporting, because it will be in the email headers, to get this, add the following to /etc/spamassassin/local.cf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear_report_template&lt;br /&gt;
report _YESNO_, score=_SCORE_ required=_REQD_ autolearn=_AUTOLEARN_&lt;br /&gt;
report tests=_TESTSSCORES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
While you&#039;re there, you may want to enable the bayesian classifier, and set up razor and pyzor, and fix RFC-ignorant rules.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   Use Bayesian classifier (default: 1)&lt;br /&gt;
#&lt;br /&gt;
use_bayes 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#   Bayesian classifier auto-learning (default: 1)&lt;br /&gt;
#&lt;br /&gt;
bayes_auto_learn 1&lt;br /&gt;
bayes_auto_learn_threshold_nonspam -0.001&lt;br /&gt;
bayes_auto_learn_threshold_spam 8.0&lt;br /&gt;
&lt;br /&gt;
# Use razor and pyzor&lt;br /&gt;
use_razor2 1&lt;br /&gt;
use_pyzor 1&lt;br /&gt;
&lt;br /&gt;
# Disable stupid RFC-incompatible spamassassin SPF_NEUTRAL check. Do not add points for SPF_NEUTRAL, as it should be treated the same as having no SPF record.&lt;br /&gt;
score SPF_NEUTRAL 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now, set up razor and pyzor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -create&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -register&lt;br /&gt;
~# razor-admin -home=/etc/mail/spamassassin/.razor -discover&lt;br /&gt;
~# pyzor --homedir /etc/mail/spamassassin discover&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart spamassassin.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service spamassassin restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim spamd integration ===&lt;br /&gt;
Uncomment the following line in /etc/exim4/conf.d/main/02_exim4-config_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spamd_address = 127.0.0.1 783&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#   warn&lt;br /&gt;
#     spam = Debian-exim:true&lt;br /&gt;
#     add_header = X-Spam_score: $spam_score\n\&lt;br /&gt;
#               X-Spam_score_int: $spam_score_int\n\&lt;br /&gt;
#               X-Spam_bar: $spam_bar\n\&lt;br /&gt;
#               X-Spam_report: $spam_report&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also replace Debian-exim with debian-spamd (case sensitive), change _report to -Status and dash/upper case the rest (See section below for result). To bounce messages, also add this directly below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll get something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  warn&lt;br /&gt;
    spam = debian-spamd:true&lt;br /&gt;
    add_header = X-Spam-Score: $spam_score\n\&lt;br /&gt;
              X-Spam-Score-Int: $spam_score_int\n\&lt;br /&gt;
              X-Spam-Bar: $spam_bar\n\&lt;br /&gt;
              X-Spam-Status: $spam_report&lt;br /&gt;
&lt;br /&gt;
  deny&lt;br /&gt;
    message = This message scored $spam_score spam points.&lt;br /&gt;
    spam = debian-spamd&lt;br /&gt;
    condition = ${if &amp;gt;{$spam_score_int}{76}{1}{0}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing spam blocking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ telnet 127.0.0.1 25&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to 127.0.0.1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 13:53:46 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello localhost.localdomain [127.0.0.1]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test            &lt;br /&gt;
&lt;br /&gt;
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
550 This message scored 1002.6 spam points.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here.    &lt;br /&gt;
&lt;br /&gt;
=== More information on spamassassin ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* https://spamassassin.apache.org/&lt;br /&gt;
&lt;br /&gt;
== Antivirus ==&lt;br /&gt;
=== Setting up ClamAV ===&lt;br /&gt;
Update the antivirus database:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# freshclam&lt;br /&gt;
ClamAV update process started at Sun Mar 15 13:57:01 2015&lt;br /&gt;
main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)&lt;br /&gt;
daily.cvd is up to date (version: 20194, sigs: 1348078, f-level: 63, builder: dgoddard)&lt;br /&gt;
bytecode.cvd is up to date (version: 247, sigs: 41, f-level: 63, builder: dgoddard)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You will get a message about outdated ClamAV if you do not have the latest version from stable-updates. Make sure you have it in your sources list and preferably in the unattended-upgrades list. Also see the troubleshooting section.&lt;br /&gt;
&lt;br /&gt;
If you get a message about freshclam.log being locked, this means the clamav database is already up to date, check the freshclam.log for any warnings, like &amp;quot;your version is OUTDATED&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Add clamav to the Debian-exim group, so that clamav-daemon can read the message to scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/clamav/clamd.conf set clamav to use the supplementary group (it may be already enabled by default):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AllowSupplementaryGroups true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart clamav-daemon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service clamav-daemon restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exim clamd integration ===&lt;br /&gt;
In /etc/exim4/conf.d/main/02_exim4-config_options, uncomment the following line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
av_scanner = clamd:/var/run/clamav/clamd.ctl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In /etc/exim4/conf.d/acl/40_exim4-config_check_data, uncomment the following section&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  deny&lt;br /&gt;
    malware = *&lt;br /&gt;
    message = This message was detected as possible malware ($malware_name).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the exim4 config and restart exim.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 14:10:10 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 Accepted&lt;br /&gt;
DATA&lt;br /&gt;
354 Enter message, ending with &amp;quot;.&amp;quot; on a line by itself&lt;br /&gt;
Subject: test&lt;br /&gt;
&lt;br /&gt;
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*&lt;br /&gt;
.&lt;br /&gt;
550 This message was detected as possible malware (Eicar-Test-Signature).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should get error 550 here. This is good.&lt;br /&gt;
&lt;br /&gt;
=== More information on ClamAV ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-content_scanning_at_acl_time.html&lt;br /&gt;
* http://www.clamav.net/index.html&lt;br /&gt;
&lt;br /&gt;
== Setting up DKIM ==&lt;br /&gt;
Contrary to SPF and DMARC, DKIM is actually a good idea. This does not break the internet, I advise everyone to implement DKIM.&lt;br /&gt;
=== Configuring exim for DKIM ===&lt;br /&gt;
The first step to getting DKIM working, is generating an RSA key for DKIM. You will be tempted to use a large key here, but given that you have to add the public key to DNS, do not use more than 1024-bit keys. If you want to use stronger cryptography for this in the future, please consider contributing to the support of ECC crypto in DKIM.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# mkdir -m 0750 /etc/exim4/dkim_keys&lt;br /&gt;
~# chown root:Debian-exim /etc/exim4/dkim_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To generate the RSA key pair (repeat per domain): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl genrsa -out /etc/exim4/dkim_keys/bitlair.nl.private.pem 1024&lt;br /&gt;
~# openssl rsa -in /etc/exim4/dkim_keys/bitlair.nl.private.pem -out /etc/exim4/dkim_keys/bitlair.nl.public.pem -pubout -outform PEM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add the following to the top of /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM_DOMAIN =  ${domain:$return_path}&lt;br /&gt;
DKIM_SELECTOR = exim&lt;br /&gt;
DKIM_FILE = /etc/exim4/dkim_keys/${lc:${domain:$return_path}}.private.pem&lt;br /&gt;
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}&lt;br /&gt;
DKIM_CANON = relaxed&lt;br /&gt;
DKIM_STRICT = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring DNS for DKIM ===&lt;br /&gt;
Update your DNS zones to have the following records:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exim._domainkey    IN    TXT   v=DKIM1; k=rsa; p=MIGfMA... &amp;lt;- your base64-encoded public key here&lt;br /&gt;
_domainkey         IN    TXT   o=~;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Send an email to yourself from your MTA, you should see DKIM headers added to your message, to verify if it really checks out, send an email to check-auth@verifier.port25.com from your MTA. &lt;br /&gt;
&lt;br /&gt;
It should respond with something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DKIM check:         pass&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on DKIM ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://www.iodigitalsec.com/exim-dkim-and-debian-configuration/&lt;br /&gt;
* http://mikepultz.com/2010/02/using-dkim-in-exim/&lt;br /&gt;
* https://www.debian-administration.org/users/lee/weblog/41&lt;br /&gt;
* http://www.dkim.org/&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
Please note, before you add SPF: SPF is very broken. It assumes that people do not forward e-mail. It breaks .forward files, procmail forwards, etc. There is a remedy, called Sender Rewriting Scheme, but people are generally not aware of this. If you want to forward to gmail.com, which is known broken, because it mandates SPF records. &lt;br /&gt;
=== Adding SPF to your domain ===&lt;br /&gt;
You can set limits on who can send on behalf of your domain using DNS. However, extremely few mail forwards have implemented SRS. As stated on wikipedia: &amp;quot;Publishers of SPF FAIL policies must accept the risk that their legitimate emails are being rejected or bounced. They should test (e.g., with a SOFTFAIL policy) until they are satisfied with the results.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, adding SPF to your domain adds to the legitimacy of your domain, and will decrease your chances of getting into a spam box. So it would be wise to set an SPF policy of allowing your mailservers and hosts under your domain, but leave the rest neutral with ?all. -all is guaranteed to break plain mail forwarding. ~all will make sure your mail reaches the spam box.&lt;br /&gt;
&lt;br /&gt;
To have an SPF policy, I advise to not use any fails on your domain, but configure a record like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@ IN TXT &amp;quot;v=spf1 a mx ?all&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will ensure that hosts under your domain can pass SPF, as can your mailservers, but it is neutral for other, potentially forwarding hosts.&lt;br /&gt;
&lt;br /&gt;
=== Adding Sending Rewriting Scheme (SRS) ===&lt;br /&gt;
Be careful with mail forwards, make sure your spam rules are set strictly enough, because your mail server reputation with gmail depends on forwarding mostly non-spam. If you want to do mail forwards to gmail, you need to implement SRS, because gmail on IPv6 is a known broken SPF mail system.&lt;br /&gt;
&lt;br /&gt;
==== Installing srsd ====&lt;br /&gt;
Create /etc/init.d/srsd with content:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          srsd&lt;br /&gt;
# Required-Start:    &lt;br /&gt;
# Required-Stop:     &lt;br /&gt;
# Should-Start:      &lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: SRS daemon&lt;br /&gt;
# Description:       SRS daemon&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# /etc/init.d/srsd: start and stop the srsd daemon&lt;br /&gt;
&lt;br /&gt;
DAEMON=/usr/bin/srsd&lt;br /&gt;
USER=Debian-exim&lt;br /&gt;
SECRETFILE=/etc/srsd.secret&lt;br /&gt;
PIDFILE=/var/run/srsd.pid&lt;br /&gt;
SOCKETFILE=/tmp/srsd&lt;br /&gt;
SRSD_OPTS=&amp;quot;--secretfile ${SECRETFILE}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test -x $DAEMON || exit 0&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
srsd_start() {&lt;br /&gt;
    if start-stop-daemon --start --quiet --background \&lt;br /&gt;
        --chuid $USER \&lt;br /&gt;
        --pidfile $PIDFILE --make-pidfile \&lt;br /&gt;
        --exec $DAEMON \&lt;br /&gt;
        -- $SRSD_OPTS&lt;br /&gt;
    then&lt;br /&gt;
        rc=0&lt;br /&gt;
        sleep 1&lt;br /&gt;
        if ! kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
            log_failure_msg &amp;quot;srsd daemon failed to start&amp;quot;&lt;br /&gt;
            rc=1&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        rc=1&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $rc -eq 0 ]; then&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
    else&lt;br /&gt;
        log_end_msg 1&lt;br /&gt;
        rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
} # srsd_start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
    log_daemon_msg &amp;quot;Starting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        log_progress_msg &amp;quot;apparently already running&amp;quot;&lt;br /&gt;
        log_end_msg 0&lt;br /&gt;
        exit 0&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
  stop)&lt;br /&gt;
    log_daemon_msg &amp;quot;Stopping srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE&lt;br /&gt;
    log_end_msg $?&lt;br /&gt;
    rm -f $PIDFILE&lt;br /&gt;
    rm -f $SOCKETFILE&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  restart)&lt;br /&gt;
    set +e&lt;br /&gt;
    log_daemon_msg &amp;quot;Restarting srsd daemon&amp;quot; &amp;quot;srsd&amp;quot;&lt;br /&gt;
    if [ -s $PIDFILE ] &amp;amp;&amp;amp; kill -0 $(cat $PIDFILE) &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || true&lt;br /&gt;
        sleep 1&lt;br /&gt;
    else&lt;br /&gt;
        log_warning_msg &amp;quot;srsd daemon not running, attempting to start.&amp;quot;&lt;br /&gt;
            rm -f $PIDFILE&lt;br /&gt;
    fi&lt;br /&gt;
        srsd_start&lt;br /&gt;
    ;;&lt;br /&gt;
&lt;br /&gt;
  status)&lt;br /&gt;
    status_of_proc -p $PIDFILE &amp;quot;$DAEMON&amp;quot; srsd&lt;br /&gt;
    exit $?    # notreached due to set -e&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    echo &amp;quot;Usage: /etc/init.d/srsd {start|stop|restart|status}&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now make it executable and run at boot time.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# chmod 755 /etc/init.d/srsd&lt;br /&gt;
~# update-rc.d srsd defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Generate a new random secret:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# touch /etc/srsd.secret&lt;br /&gt;
~# chown Debian-exim /etc/srsd.secret&lt;br /&gt;
~# chmod 600 /etc/srsd.secret&lt;br /&gt;
~# openssl rand -base64 12 &amp;gt; /etc/srsd.secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Start srsd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service srsd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Implement srsd integration into exim4 ====&lt;br /&gt;
Create a file in /etc/exim4/conf.d/router/175_exim4-config_srs with the following content, replace spf-must-die.org to your own SRS rewriting domain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srs_bounce:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_bounce for $local_part@$domain&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  domains = spf-must-die.org&lt;br /&gt;
  local_part_prefix = srs0+ : srs0- : srs0= : srs1+ : srs1- : srs1=&lt;br /&gt;
  caseful_local_part&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}{REVERSE $local_part_prefix$local_part@$domain}{5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  data = ${if match{$address_data}{^ERROR}{:fail: Invalid SRS address}{$address_data}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
srs_forward:&lt;br /&gt;
  debug_print = &amp;quot;R: srs_forward for $local_part@$domain&amp;quot;&lt;br /&gt;
  no_verify&lt;br /&gt;
  senders = ! : ! *@+local_domains&lt;br /&gt;
  address_data = ${readsocket{/tmp/srsd}\&lt;br /&gt;
                {FORWARD $sender_address_local_part@$sender_address_domain spf-must-die.org\n}\&lt;br /&gt;
                                        {5s}{\n}{:defer: SRS daemon failure}}&lt;br /&gt;
  errors_to = ${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&lt;br /&gt;
  headers_add = &amp;quot;X-SRS: Sender address rewritten from &amp;lt;$sender_address&amp;gt; to &amp;lt;${quote_local_part:${local_part:$address_data}}@${domain:$address_data}&amp;gt; by $primary_hostname.&amp;quot;&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  repeat_use = false&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${quote_local_part:$local_part}@$domain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Testing the SRS forwarding ====&lt;br /&gt;
Create an alias in /etc/aliases to your own mailbox, like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user: your@email.address&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
run newaliases to regenerate the hash table&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newaliases&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now try to send email to user@your-mail-server.&lt;br /&gt;
&lt;br /&gt;
You should get it in your mailbox.. look at the message source, you will see the following headers if DKIM and SRS are working (note the d=rewriting domain):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Return-Path: &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt;&lt;br /&gt;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=spf-must-die.org; s=exim;&lt;br /&gt;
        h=Content-Type:Subject:To:MIME-Version:From:Date:Message-ID; bh=Nh/X++v9YcgLCxTBH1lYXZg22kWTVrM8UJ+92lkoOFQ=;&lt;br /&gt;
        b=eC+zN8okGJYoNUgllB9TUb9XDmHVIWYwFiIC+m2gcji5zlM+LIDYEz0Z6tAdZt1vUhugefB7DCLos6aiKwP/jShm2Cn4XTY4U+i0WG1wxf3L9wp8bs1bfo1oJLaI8iyNuSGnUDbQspWwJj1toXp2J1nGkV2MeagggaGr7+GLXro=;&lt;br /&gt;
X-SRS: Sender address rewritten from &amp;lt;wilco@baanhofman.nl&amp;gt; to &amp;lt;SRS0=eCT+=EL=baanhofman.nl=wilco@spf-must-die.org&amp;gt; by mail.bitlair.nl.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable SPF checking ===&lt;br /&gt;
Enabling SPF checking will break mail forwarding to your domain without SRS on domains that have a fail configured. This will likely block much legitimate e-mail, but if you want to forward to the big players, it&#039;s nearly mandatory to do..&lt;br /&gt;
&lt;br /&gt;
To enable inbound SPF checking, add the following to the top of /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHECK_RCPT_SPF=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be careful if you have servers relaying e-mail for you (for instance because your mail server is IPv6 only and want to receive e-mail on IPv4 or as a fallback mailserver). You need to add all addresses of those servers to /etc/exim4/host_local_deny_exceptions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note, there is a bug in the debian default SPF check, causing to bounce mail from senders that use HELO macros, like exists:_i.%{i}._h.%{h}._o.%{o}._spf.belastingdienst.nl .. So, to fix, find the following in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&lt;br /&gt;
[[User:WilcoBaanHofman|WilcoBaanHofman]] ([[User talk:WilcoBaanHofman|talk]])&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {--scope helo --identity ${quote:$sender_helo_name}}}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
[[User:WilcoBaanHofman|WilcoBaanHofman]] ([[User talk:WilcoBaanHofman|talk]])&lt;br /&gt;
&lt;br /&gt;
Replace it with:&lt;br /&gt;
[[User:WilcoBaanHofman|WilcoBaanHofman]] ([[User talk:WilcoBaanHofman|talk]])&lt;br /&gt;
    condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip \&lt;br /&gt;
                   ${quote:$sender_host_address} --identity \&lt;br /&gt;
                   ${if def:sender_address_domain \&lt;br /&gt;
                       {--scope mfrom --identity ${quote:$sender_address}}\&lt;br /&gt;
                       {}} --scope helo --identity ${quote:$sender_helo_name}}\&lt;br /&gt;
                   {no}{${if eq {$runrc}{1}{yes}{no}}}}&lt;br /&gt;
[[User:WilcoBaanHofman|WilcoBaanHofman]] ([[User talk:WilcoBaanHofman|talk]])&lt;br /&gt;
&lt;br /&gt;
=== Testing SPF checking===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 29 Mar 2015 14:37:47 +0200&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;spf-test@openspf.net&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
550-[SPF] 2001:41d0:52:300::107c is not allowed to send mail from openspf.net. &lt;br /&gt;
550 Please see http://www.openspf.org/Why?scope=mfrom;identity=spf-test@openspf.net;ip=2001:41d0:52:300::107c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see a 550 reject here when there is an SPF FAIL.&lt;br /&gt;
&lt;br /&gt;
=== More information on SPF and SRS ===&lt;br /&gt;
&lt;br /&gt;
* https://www.assembla.com/wiki/show/file_sender/Configuring_SRS_with_Exim_(Debian_and_Ubuntu)&lt;br /&gt;
* https://github.com/Exim/exim/wiki/SRS&lt;br /&gt;
* http://www.openspf.org/SPF_Record_Syntax&lt;br /&gt;
&lt;br /&gt;
== Greylisting ==&lt;br /&gt;
Greylisting is bouncing all email from new senders with a temporary failure code. Implementing this helps a good deal against spammers, at the cost of having to wait for an email from a new sender.&lt;br /&gt;
&lt;br /&gt;
=== Set up exim ===&lt;br /&gt;
To set up configuration, simply do&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# greylistd-setup-exim4 add&lt;br /&gt;
~# service greylistd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, if you want to skip greylisting on dnswl listed hosts, which I recommend: add the following line to the defer and deny sections about greylisting in /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    !dnslists = list.dnswl.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will override your local greylistd blacklist and override greylisting for known good senders.&lt;br /&gt;
&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet 2a02:2ca0:aaa::a843:657d 25&lt;br /&gt;
Trying 2a02:2ca0:aaa::a843:657d...&lt;br /&gt;
Connected to 2a02:2ca0:aaa::a843:657d.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
220 mail.bitlair.nl ESMTP Exim 4.80 Sun, 15 Mar 2015 15:27:34 -0400&lt;br /&gt;
EHLO mail.bitlair.nl&lt;br /&gt;
250-mail.bitlair.nl Hello mail.bitlair.nl [2a02:2ca0:aaa::a843:657d]&lt;br /&gt;
250-SIZE 52428800&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250 HELP&lt;br /&gt;
MAIL FROM: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
250 OK&lt;br /&gt;
RCPT TO: &amp;lt;wilco@bitlair.nl&amp;gt;&lt;br /&gt;
451-2a02:2ca0:aaa::a843:657d is not yet authorized to deliver mail from&lt;br /&gt;
451 &amp;lt;wilco@bitlair.nl&amp;gt; to &amp;lt;wilco@bitlair.nl&amp;gt;. Please try later.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
451 is the temporary failure error, this is the desired behaviour.&lt;br /&gt;
&lt;br /&gt;
=== More information on Greylisting ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
Be careful with DMARC, as DMARC with p=reject breaks your outbound e-mail even further than SPF. With p=reject, you will no longer be able to use mailing lists or mail forwarders, even those with SRS enabled. DMARC checks the &#039;From:&#039; header, instead of the envelope sender of the mail, so setting DMARC policies will break all of your forwarding, and will make sure that your mail does not reach its destination. I also recommend that you reject all mail with a DMARC policy set on your mailing lists, because the bounces will cause your members to bounce off the mailing list.&lt;br /&gt;
&lt;br /&gt;
Enable this if the risk of impersonation/identity fraud is greater than the risk of your outgoing emails not arriving at their destination. So, if you are paypal, a bank, linkedin, twitter or facebook.. or using this for internal mail only or to signal that nobody should be sending mail on behalf of a domain. If you do not have full control over your users&lt;br /&gt;
&lt;br /&gt;
It does have useful features, like reporting, so setting a p=none can add at least some value to your mail setup.&lt;br /&gt;
&lt;br /&gt;
=== Set up a mailbox ===&lt;br /&gt;
&lt;br /&gt;
Create a user in whatever system you&#039;re using. If you&#039;re not using LDAP or MySQL or something, this should do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd dmarc&lt;br /&gt;
~# passwd dmarc&lt;br /&gt;
Enter new UNIX password: &lt;br /&gt;
Retype new UNIX password: &lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running a remote mailstore without LDAP/MySQL backend, this procedure has to be repeated on the mail store.&lt;br /&gt;
&lt;br /&gt;
=== Publish a DMARC policy ===&lt;br /&gt;
You can add the following DMARC policy to your domain. p=none is important!&lt;br /&gt;
&lt;br /&gt;
_dmarc     IN     TXT     &amp;quot;v=DMARC1; p=none; rua=dmarc@bitlair.nl; ruf=dmarc@bitlair.nl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Doing something useful with the reports ===&lt;br /&gt;
This section is TODO. I haven&#039;t found a good tool yet.&lt;br /&gt;
&lt;br /&gt;
=== More information on DMARC ===&lt;br /&gt;
* http://lists.dmarc.org/pipermail/dmarc-discuss/2014-April/002445.html&lt;br /&gt;
* http://dmarc.org/overview/&lt;br /&gt;
&lt;br /&gt;
== LDAP integration ==&lt;br /&gt;
This assumes you already have an LDAP running. To set one up, please see the spacefed guide.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
Load the qmail LDAP schema:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# ldapadd -H ldapi:/// -Y EXTERNAL &amp;lt;&amp;lt; EOF&lt;br /&gt;
dn: cn=qmail,cn=schema,cn=config&lt;br /&gt;
objectClass: olcSchemaConfig&lt;br /&gt;
cn: {4}qmail&lt;br /&gt;
olcAttributeTypes: {0}( 1.3.6.1.4.1.7914.1.2.1.1 NAME &#039;qmailUID&#039; DESC &#039;UID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {1}( 1.3.6.1.4.1.7914.1.2.1.2 NAME &#039;qmailGID&#039; DESC &#039;GID of &lt;br /&gt;
 the user on the mailsystem&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115&lt;br /&gt;
 .121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {2}( 1.3.6.1.4.1.7914.1.2.1.3 NAME &#039;mailMessageStore&#039; DESC &lt;br /&gt;
 &#039;Path to the maildir/mbox on the mail system&#039; EQUALITY caseExactIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SIN&lt;br /&gt;
 GLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {3}( 1.3.6.1.4.1.7914.1.2.1.4 NAME &#039;mailAlternateAddress&#039; D&lt;br /&gt;
 ESC &#039;Secondary (alias) mailaddresses for the same user&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {4}( 1.3.6.1.4.1.7914.1.2.1.5 NAME &#039;mailQuota&#039; DESC &#039;The am&lt;br /&gt;
 ount of space the user can use until all further messages get bounced.&#039; SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {5}( 1.3.6.1.4.1.7914.1.2.1.6 NAME &#039;mailHost&#039; DESC &#039;On whic&lt;br /&gt;
 h qmail server the messagestore of this user is located.&#039; EQUALITY caseIgnore&lt;br /&gt;
 IA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.&lt;br /&gt;
 1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {6}( 1.3.6.1.4.1.7914.1.2.1.7 NAME &#039;mailForwardingAddress&#039; &lt;br /&gt;
 DESC &#039;Address(es) to forward all incoming messages to.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {7}( 1.3.6.1.4.1.7914.1.2.1.8 NAME &#039;deliveryProgramPath&#039; DE&lt;br /&gt;
 SC &#039;Program to execute for all incoming mails.&#039; EQUALITY caseExactIA5Match SU&lt;br /&gt;
 BSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {8}( 1.3.6.1.4.1.7914.1.2.1.9 NAME &#039;qmailDotMode&#039; DESC &#039;Int&lt;br /&gt;
 erpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog&#039; EQUALITY &lt;br /&gt;
 caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {9}( 1.3.6.1.4.1.7914.1.2.1.10 NAME &#039;deliveryMode&#039; DESC &#039;mu&lt;br /&gt;
 lti field entries of: nolocal, noforward, noprogram, reply&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )&lt;br /&gt;
olcAttributeTypes: {10}( 1.3.6.1.4.1.7914.1.2.1.11 NAME &#039;mailReplyText&#039; DESC &#039;&lt;br /&gt;
 A reply text for every incoming message&#039; EQUALITY caseIgnoreMatch SUBSTR case&lt;br /&gt;
 IgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE&lt;br /&gt;
  )&lt;br /&gt;
olcAttributeTypes: {11}( 1.3.6.1.4.1.7914.1.2.1.12 NAME &#039;accountStatus&#039; DESC &#039;&lt;br /&gt;
 The status of a user account: active, noaccess, disabled, deleted&#039; EQUALITY c&lt;br /&gt;
 aseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {12}( 1.3.6.1.4.1.7914.1.2.1.14 NAME &#039;qmailAccountPurge&#039; DE&lt;br /&gt;
 SC &#039;The earliest date when a mailMessageStore will be purged&#039; EQUALITY numeri&lt;br /&gt;
 cStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {13}( 1.3.6.1.4.1.7914.1.2.1.15 NAME &#039;mailQuotaSize&#039; DESC &#039;&lt;br /&gt;
 The size of space the user can have until further messages get bounced.&#039; EQUA&lt;br /&gt;
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {14}( 1.3.6.1.4.1.7914.1.2.1.16 NAME &#039;mailQuotaCount&#039; DESC &lt;br /&gt;
 &#039;The number of messages the user can have until further messages get bounced.&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {15}( 1.3.6.1.4.1.7914.1.2.1.17 NAME &#039;mailSizeMax&#039; DESC &#039;Th&lt;br /&gt;
 e maximum size of a single messages the user accepts.&#039; EQUALITY integerMatch &lt;br /&gt;
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {16}( 1.3.6.1.4.1.7914.1.3.1.1 NAME &#039;dnmember&#039; DESC &#039;Group &lt;br /&gt;
 member specified as distinguished name.&#039; EQUALITY distinguishedNameMatch SYNT&lt;br /&gt;
 AX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {17}( 1.3.6.1.4.1.7914.1.3.1.2 NAME &#039;rfc822member&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA5Ma&lt;br /&gt;
 tch SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{&lt;br /&gt;
 256} )&lt;br /&gt;
olcAttributeTypes: {18}( 1.3.6.1.4.1.7914.1.3.1.3 NAME &#039;filtermember&#039; DESC &#039;Gr&lt;br /&gt;
 oup member specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match SUBS&lt;br /&gt;
 TR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} )&lt;br /&gt;
olcAttributeTypes: {19}( 1.3.6.1.4.1.7914.1.3.1.4 NAME &#039;senderconfirm&#039; DESC &#039;S&lt;br /&gt;
 ender to Group has to answer confirmation email.&#039; EQUALITY booleanMatch SYNTA&lt;br /&gt;
 X 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {20}( 1.3.6.1.4.1.7914.1.3.1.5 NAME &#039;membersonly&#039; DESC &#039;Sen&lt;br /&gt;
 der to Group must be group member itself.&#039; EQUALITY booleanMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.7 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {21}( 1.3.6.1.4.1.7914.1.3.1.6 NAME &#039;confirmtext&#039; DESC &#039;Tex&lt;br /&gt;
 t that will be sent with sender confirmation email.&#039; EQUALITY caseIgnoreMatch&lt;br /&gt;
  SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} &lt;br /&gt;
 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {22}( 1.3.6.1.4.1.7914.1.3.1.7 NAME &#039;dnmoderator&#039; DESC &#039;Gro&lt;br /&gt;
 up moderator specified as Distinguished name.&#039; EQUALITY distinguishedNameMatc&lt;br /&gt;
 h SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {23}( 1.3.6.1.4.1.7914.1.3.1.8 NAME &#039;rfc822moderator&#039; DESC &lt;br /&gt;
 &#039;Group moderator specified as normal rfc822 email address.&#039; EQUALITY caseIgno&lt;br /&gt;
 reIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12&lt;br /&gt;
 1.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {24}( 1.3.6.1.4.1.7914.1.3.1.9 NAME &#039;moderatortext&#039; DESC &#039;T&lt;br /&gt;
 ext that will be sent with request for moderation email.&#039; EQUALITY caseIgnore&lt;br /&gt;
 Match SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4&lt;br /&gt;
 096} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {25}( 1.3.6.1.4.1.7914.1.3.1.10 NAME &#039;dnsender&#039; DESC &#039;Allow&lt;br /&gt;
 ed sender specified as distinguished name.&#039; EQUALITY distinguishedNameMatch S&lt;br /&gt;
 YNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {26}( 1.3.6.1.4.1.7914.1.3.1.11 NAME &#039;rfc822sender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as normal rf822 email address.&#039; EQUALITY caseIgnoreIA&lt;br /&gt;
 5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.&lt;br /&gt;
 26{256} )&lt;br /&gt;
olcAttributeTypes: {27}( 1.3.6.1.4.1.7914.1.3.1.12 NAME &#039;filtersender&#039; DESC &#039;A&lt;br /&gt;
 llowed sender specified as ldap search filter.&#039; EQUALITY caseIgnoreIA5Match S&lt;br /&gt;
 UBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {28}( 1.3.6.1.4.1.7914.1.4.1.1 NAME &#039;qladnmanager&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )&lt;br /&gt;
olcAttributeTypes: {29}( 1.3.6.1.4.1.7914.1.4.1.2 NAME &#039;qlaDomainList&#039; DESC &#039;&#039;&lt;br /&gt;
  EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6&lt;br /&gt;
 .1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcAttributeTypes: {30}( 1.3.6.1.4.1.7914.1.4.1.3 NAME &#039;qlaUidPrefix&#039; DESC &#039;&#039; &lt;br /&gt;
 EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.&lt;br /&gt;
 1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {31}( 1.3.6.1.4.1.7914.1.4.1.4 NAME &#039;qlaQmailUid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {32}( 1.3.6.1.4.1.7914.1.4.1.5 NAME &#039;qlaQmailGid&#039; DESC &#039;&#039; E&lt;br /&gt;
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {33}( 1.3.6.1.4.1.7914.1.4.1.6 NAME &#039;qlaMailMStorePrefix&#039; D&lt;br /&gt;
 ESC &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX&lt;br /&gt;
  1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {34}( 1.3.6.1.4.1.7914.1.4.1.7 NAME &#039;qlaMailQuotaSize&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {35}( 1.3.6.1.4.1.7914.1.4.1.8 NAME &#039;qlaMailQuotaCount&#039; DES&lt;br /&gt;
 C &#039;&#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE &lt;br /&gt;
 )&lt;br /&gt;
olcAttributeTypes: {36}( 1.3.6.1.4.1.7914.1.4.1.9 NAME &#039;qlaMailSizeMax&#039; DESC &#039;&lt;br /&gt;
 &#039; EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )&lt;br /&gt;
olcAttributeTypes: {37}( 1.3.6.1.4.1.7914.1.4.1.10 NAME &#039;qlaMailHostList&#039; DESC&lt;br /&gt;
  &#039;&#039; EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.&lt;br /&gt;
 3.6.1.4.1.1466.115.121.1.26{256} )&lt;br /&gt;
olcObjectClasses: {0}( 1.3.6.1.4.1.7914.1.2.2.1 NAME &#039;qmailUser&#039; DESC &#039;QMail-L&lt;br /&gt;
 DAP User&#039; SUP top AUXILIARY MUST mail MAY ( uid $ mailMessageStore $ homeDire&lt;br /&gt;
 ctory $ userPassword $ mailAlternateAddress $ qmailUID $ qmailGID $ mailHost &lt;br /&gt;
 $ mailForwardingAddress $ deliveryProgramPath $ qmailDotMode $ deliveryMode $&lt;br /&gt;
  mailReplyText $ accountStatus $ qmailAccountPurge $ mailQuotaSize $ mailQuot&lt;br /&gt;
 aCount $ mailSizeMax ) )&lt;br /&gt;
olcObjectClasses: {1}( 1.3.6.1.4.1.7914.1.3.2.1 NAME &#039;qmailGroup&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Group&#039; SUP top AUXILIARY MUST ( mail $ mailAlternateAddress $ mailMessag&lt;br /&gt;
 eStore ) MAY ( dnmember $ rfc822member $ filtermember $ senderconfirm $ membe&lt;br /&gt;
 rsonly $ confirmtext $ dnmoderator $ rfc822moderator $ moderatortext $ dnsend&lt;br /&gt;
 er $ rfc822sender $ filtersender ) )&lt;br /&gt;
olcObjectClasses: {2}( 1.3.6.1.4.1.7914.1.4.2.1 NAME &#039;qldapAdmin&#039; DESC &#039;QMail-&lt;br /&gt;
 LDAP Subtree Admin&#039; SUP top AUXILIARY MUST ( qlaDnManager $ qlaDomainList $ q&lt;br /&gt;
 laMailMStorePrefix $ qlaMailHostList ) MAY ( qlaUidPrefix $ qlaQmailUid $ qla&lt;br /&gt;
 QmailGid $ qlaMailQuotaSize $ qlaMailQuotaCount $ qlaMailSizeMax ) )&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Exim LDAP integration ===&lt;br /&gt;
Add the following two routers:&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/450_exim4-config_ldap_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=That would be dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?mailForwardingAddress?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/451_exim4-config_ldap_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=Still not that dumb \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=${quote_ldap:$local_part}@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
/etc/exim4/conf.d/router/454_exim4-config_ldap_accept:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_accept:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  condition = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (uid=${quote_ldap:$local_part})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  transport = lmtp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want wildcard domain matching for your domain add the following (Note: to use wildcards in LDAP set the attribute 		&lt;br /&gt;
mail or mailAlternateAddress to @domain.tld):&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/452_exim4-config_ldap_wildcard_aliases:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_aliases:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                      (objectclass=qmailUser)\&lt;br /&gt;
                      (|\&lt;br /&gt;
                          (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                          (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                      )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/exim4/conf.d/router/453_exim4-config_ldap_wildcard_users:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_wildcard_users:&lt;br /&gt;
  driver = redirect&lt;br /&gt;
  allow_fail&lt;br /&gt;
  allow_defer&lt;br /&gt;
  data = ${lookup ldapm{ \&lt;br /&gt;
                  user=cn=exim,ou=System,dc=bitlair,dc=nl \&lt;br /&gt;
                  pass=!!Not this stupid!! \&lt;br /&gt;
                  ldaps://ldap.bitlair.nl/dc=bitlair,dc=nl?uid?sub?\&lt;br /&gt;
                  (&amp;amp;\&lt;br /&gt;
                       (objectclass=posixAccount)\&lt;br /&gt;
                       (|\&lt;br /&gt;
                           (mail=@${quote_ldap:$domain})\&lt;br /&gt;
                           (mailAlternateAddress=@${quote_ldap:$domain})\&lt;br /&gt;
                       )\&lt;br /&gt;
                  )} {$value} fail }&lt;br /&gt;
  file_transport = address_file&lt;br /&gt;
  pipe_transport = address_pipe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing Exim LDAP integration ===&lt;br /&gt;
To run a lookup: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bt -d+lookup wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To assemble to proper query: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -be&lt;br /&gt;
&amp;gt; ${lookup ldapm{ user=bla pass=bla ldaps://your.ldap.server/dc=your,dc=basedn?mail?sub?mail=wilco@bitlair.nl}}&lt;br /&gt;
wilco@bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give you back your email address.&lt;br /&gt;
&lt;br /&gt;
=== Saslauthd LDAP integration ===&lt;br /&gt;
&lt;br /&gt;
Change the mechanisms to ldap in /etc/default/saslauthd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MECHANISMS=&amp;quot;ldap&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Write up a configuration file like this in /etc/saslauthd.conf (use your own LDAP settings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ldap_bind_dn: cn=exim,ou=System,dc=bitlair,dc=nl&lt;br /&gt;
ldap_bind_pw: Your password&lt;br /&gt;
ldap_servers: ldaps://ldap.bitlair.nl/&lt;br /&gt;
ldap_search_base: dc=bitlair,dc=nl&lt;br /&gt;
ldap_filter: (&amp;amp;(objectclass=posixAccount)(uid=%u))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart saslauthd.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service saslauthd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing saslauthd LDAP integration ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# testsaslauthd -u johndoe -p secret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Should give back something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0: OK &amp;quot;Success.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next up is testing SASL exim, see the SASL integration section for exim, above here.&lt;br /&gt;
&lt;br /&gt;
=== More information on LDAP integration ===&lt;br /&gt;
* https://spacefed.net/wiki/index.php/Howto/Spacenet/Setup_LDAP&lt;br /&gt;
* http://blog.toxa.de/archives/493&lt;br /&gt;
* http://www.slideshare.net/jpmens/exim-and-ldap-1829032&lt;br /&gt;
&lt;br /&gt;
== LMTP delivery ==&lt;br /&gt;
If you want to deliver your e-mail via LMTP, just set dc_localdelivery=&#039;lmtp&#039; in update-exim4.conf.conf. Then follow either the local or remote delivery section of this guide. Using the remote delivery section has the advantage of allowing full disk crypto on the mail store. You cannot do this on the MTA, because it needs to power on automatically to accept new emails instantly.&lt;br /&gt;
&lt;br /&gt;
=== Local delivery ===&lt;br /&gt;
For local delivery to dovecot, add this section in /etc/exim4/conf.d/transport/40-exim4_config-lmtp (create it if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
        driver = lmtp&lt;br /&gt;
        socket = /var/run/dovecot/lmtp&lt;br /&gt;
        #maximum number of deliveries per batch, default 1&lt;br /&gt;
        batch_max = 200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For remote delivery with 3 week hold function via LMTP ===&lt;br /&gt;
Setting up remote delivery via LMTP makes sense, because you can have your mail store encrypted and still receive new emails, because the MTA will keep accepting mails.&lt;br /&gt;
To set this up, update exim&#039;s retry policy for ::1, so that the MTA will hold on to temporarily failed e-mail deliveries for 3 weeks and will retry every 5 minutes.&lt;br /&gt;
&lt;br /&gt;
Add the following in /etc/exim4/conf.d/retry/30_exim4-config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
::::1  *           F,3w,5m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In transport/40-exim4-config-lmtp, add/modify the lmtp section to match this (create the file if it does not exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lmtp:&lt;br /&gt;
  driver = smtp&lt;br /&gt;
  protocol = lmtp&lt;br /&gt;
  port = 24&lt;br /&gt;
  hosts = ::::1&lt;br /&gt;
  allow_localhost&lt;br /&gt;
  return_path_add&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will deliver to localhost on port 24. If you want to use a mail store with full disk crypto seperate from your Mail Transfer Agent, configure a secure tunnel from local port 24 to the LDA. That&#039;s because LMTP with crypto is not supported properly by dovecot.. and exim4 does not support delivery to TLS-on-connect secure tunnels.. so.. we will configure a pair of stunnels.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regenerate the configuration and restart exim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dovecot doesn&#039;t support TLS for LMTP, so install stunnel4 using apt-get install stunnel4 on both the mailstore and the MTA machine. To properly do this, first set up a CA on the mail store with a client cert for all of your MTAs.&lt;br /&gt;
&lt;br /&gt;
The easiest way to set up a CA (use a descriptive name as common name, e.g. My LMTP client CA):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ mkdir CA&lt;br /&gt;
~$ cd CA&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newca&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -newreq-nodes&lt;br /&gt;
~$ /usr/lib/ssl/misc/CA.pl -signreq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will result in a newcert.pem and newkey.pem which need to be transferred to the MTA in /etc/ssl/lmtpcert.pem and /etc/ssl/private/lmtpkey.pem, and in demoCA/cacert.pem is the CA you just created, copy that to /etc/ssl/lmtpca.pem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the MTA, create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
verify = 2&lt;br /&gt;
CAfile = /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
cert = /etc/ssl/lmtpcert.pem&lt;br /&gt;
key = /etc/ssl/private/lmtpkey.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
client = yes&lt;br /&gt;
accept = ::1:24&lt;br /&gt;
connect = imap.bitlair.nl:24&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The other end (in this case dovecot), should have a similar stunnel4 setup. Note that the IMAP certificate is generated in the dovecot section (further down).&lt;br /&gt;
&lt;br /&gt;
Create a /etc/stunnel/lmtp.conf, with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setuid = stunnel4&lt;br /&gt;
setgid = stunnel4&lt;br /&gt;
pid = /var/run/stunnel4/lmtp.pid&lt;br /&gt;
debug = 7&lt;br /&gt;
output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
&lt;br /&gt;
cert = /etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
key = /etc/ssl/private/imap.bitlair.nl-key.pem&lt;br /&gt;
CAfile = /etc/ssl/lmtpca.pem&lt;br /&gt;
verify = 2&lt;br /&gt;
&lt;br /&gt;
options = SINGLE_ECDH_USE&lt;br /&gt;
options = SINGLE_DH_USE&lt;br /&gt;
&lt;br /&gt;
[lmtp]&lt;br /&gt;
accept  = :::24&lt;br /&gt;
connect = /var/run/dovecot/lmtp&lt;br /&gt;
&lt;br /&gt;
; vim:ft=dosini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now on both the MTA and the mail store, start the stunnel services.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service stunnel4 start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing LMTP delivery ===&lt;br /&gt;
To test if LMTP works, you need to have dovecot set up already. Send yourself an e-mail, see if it arrives.&lt;br /&gt;
&lt;br /&gt;
=== More information on LMTP ===&lt;br /&gt;
* http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_lmtp_transport.html&lt;br /&gt;
* http://wiki2.dovecot.org/LMTP&lt;br /&gt;
* https://www.ietf.org/rfc/rfc2033.txt&lt;br /&gt;
== Mailman ==&lt;br /&gt;
Mailman is a mailing list server. Setting this up will enable you to run both public and private, archived mailing lists, compatible with DKIM and SPF. Note that DMARC policies interfere with mailing lists, so either reject mail from DMARC p=reject domains or Munge the from address in the mails..&lt;br /&gt;
&lt;br /&gt;
You will need a mailing list subdomain, for example list.bitlair.nl. This way, Exim will route messages through a pipe if it&#039;s destined for a mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for list.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/list.bitlair.nl-key.pem -out /etc/ssl/list.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (list.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/list.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up Mailman ===&lt;br /&gt;
First thing is to create a mailman mailing list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# newlist mailman&lt;br /&gt;
Enter the email of the person running the list: your@email.address&lt;br /&gt;
Initial mailman password: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the URL and mailing list domain in /etc/mailman/mm_cfg.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default domain for email addresses of newly created MLs&lt;br /&gt;
DEFAULT_EMAIL_HOST = &#039;list.bitlair.nl&#039;&lt;br /&gt;
#-------------------------------------------------------------&lt;br /&gt;
# Default host for web interface of newly created MLs&lt;br /&gt;
DEFAULT_URL_HOST   = &#039;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the following lines near the end in /etc/mailman/mm_cfg.py to streamline message sending.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Max recipients for each message&lt;br /&gt;
SMTP_MAX_RCPTS = 1000&lt;br /&gt;
# Max messages sent in each SMTP connection&lt;br /&gt;
SMTP_MAX_SESSIONS_PER_CONNECTION = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Exim for mailman ===&lt;br /&gt;
Unfortunately, mailman 2.1 does not support LMTP yet. It requires a bit more configuration to get the mailman transport going. Mailman 2.2 (development branch now deprecated in favour of 3.0) does have it, so once mailman 3 arrives, upgrade to a more simple configuration set-up than this.&lt;br /&gt;
&lt;br /&gt;
Configure the mailman exim settings in /etc/exim4/conf.d/main/05_exim4-config_mailman_options:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Mailman macro definitions&lt;br /&gt;
&lt;br /&gt;
# Home dir for the Mailman installation&lt;br /&gt;
MM_HOME=/var/lib/mailman&lt;br /&gt;
&lt;br /&gt;
# User and group for Mailman&lt;br /&gt;
MM_UID=list&lt;br /&gt;
MM_GID=list&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Domains that your lists are in - colon separated list&lt;br /&gt;
# you may wish to add these into local_domains as well&lt;br /&gt;
domainlist mm_domains=list.bitlair.nl&lt;br /&gt;
&lt;br /&gt;
# The path of the Mailman mail wrapper script&lt;br /&gt;
MM_WRAP=MM_HOME/mail/mailman&lt;br /&gt;
#&lt;br /&gt;
# The path of the list config file (used as a required file when&lt;br /&gt;
# verifying list addresses)&lt;br /&gt;
MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure the mailman router in /etc/exim4/conf.d/router/449_exim4-config_mailman_router:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_router:&lt;br /&gt;
  driver = accept&lt;br /&gt;
  domains = +mm_domains&lt;br /&gt;
  require_files = MM_LISTCHK&lt;br /&gt;
  local_part_suffix_optional&lt;br /&gt;
  local_part_suffix = -admin : \&lt;br /&gt;
    -bounces   : -bounces+*  : \&lt;br /&gt;
    -confirm   : -confirm+*  : \&lt;br /&gt;
    -join      : -leave      : \&lt;br /&gt;
    -owner     : -request    : \&lt;br /&gt;
    -subscribe : -unsubscribe&lt;br /&gt;
  transport = mailman_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Configure the mailman transport in /etc/exim4/conf.d/transport/40_exim4-config_mailman_pipe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mailman_transport:&lt;br /&gt;
  driver  = pipe&lt;br /&gt;
  command = MM_WRAP \&lt;br /&gt;
          &#039;${if def:local_part_suffix \&lt;br /&gt;
                {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \&lt;br /&gt;
                {post}}&#039; \&lt;br /&gt;
          $local_part&lt;br /&gt;
  current_directory = MM_HOME&lt;br /&gt;
  home_directory    = MM_HOME&lt;br /&gt;
  user              = MM_UID&lt;br /&gt;
  group             = MM_GID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configure exim to accept mail for list.yourdomain.tld in /etc/exim4/update-exim4.conf.conf, by adding it to the dc_other_hostnames list. This is a semicolon-separated list.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dc_other_hostnames=&#039;bitlair.nl;spf-must-die.org;list.bitlair.nl&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring apache for mailman ===&lt;br /&gt;
Create a site configuration in /etc/apache2/sites-available/list.bitlair.nl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName list.bitlair.nl&lt;br /&gt;
        ServerAdmin your@email.address&lt;br /&gt;
        DocumentRoot /var/www/&lt;br /&gt;
	SSLEngine on&lt;br /&gt;
	SSLCertificateFile    /etc/ssl/list.bitlair.nl-cert.pem&lt;br /&gt;
	SSLCertificateKeyFile /etc/ssl/private/list.bitlair.nl-key.pem&lt;br /&gt;
        SSLCertificateChainFile /etc/ssl/sub.class2.server.sha2.ca.pem&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3&lt;br /&gt;
        SSLHonorCipherOrder on&lt;br /&gt;
        SSLCipherSuite &amp;quot;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \&lt;br /&gt;
              EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 \&lt;br /&gt;
              EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                # This directive allows us to have apache2&#039;s default start page&lt;br /&gt;
                # in /apache2-default/, but still have / go to the right place&lt;br /&gt;
                RedirectMatch ^/$ /cgi-bin/mailman/listinfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/&lt;br /&gt;
        &amp;lt;Directory &amp;quot;/usr/lib/cgi-bin&amp;quot;&amp;gt;&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
	Alias /pipermail /var/lib/mailman/archives/public&lt;br /&gt;
	Alias /images/mailman /usr/share/images/mailman&lt;br /&gt;
	&amp;lt;Directory /var/lib/mailman/archives/public&amp;gt;&lt;br /&gt;
	    DirectoryIndex index.html&lt;br /&gt;
	&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Of course, replace list.bitlair.nl with your own list subdomain.&lt;br /&gt;
&lt;br /&gt;
Give permission to the web user to modify list data by adding www-data to the group list.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G list www-data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the site and ssl module&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# a2enmod ssl&lt;br /&gt;
~# a2ensite list.bitlair.nl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Reload apache&#039;s configuration gracefully&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apache2ctl graceful&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up mailing lists ===&lt;br /&gt;
TODO, guided tour:&lt;br /&gt;
* Set DMARC-policies!&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
=== Testing Mailman ===&lt;br /&gt;
Browse to your list url, e.g. https://list.bitlair.nl. Create a mailing list and subscribe yourself and a test mail address. Play around with the settings until you&#039;re comfortable with it.&lt;br /&gt;
&lt;br /&gt;
To verify your SSL-setup on your URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl s_client -connect list.bitlair.nl:443 -verify 5 -CAfile /etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
... &amp;gt;snip&amp;lt; ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should give you the Verify return code 0 (ok) again, any other status code means there is something wrong with your certificate.&lt;br /&gt;
&lt;br /&gt;
=== More information about mailman ===&lt;br /&gt;
* http://wiki.list.org/DEV/DMARC&lt;br /&gt;
* http://www.exim.org/howto/mailman21.html&lt;br /&gt;
* https://www.debian-administration.org/article/617/Mailman_and_Exim4&lt;br /&gt;
* https://www.gnu.org/software/mailman/&lt;br /&gt;
&lt;br /&gt;
== Dovecot ==&lt;br /&gt;
=== Getting a certificate ===&lt;br /&gt;
Generate a certificate for imap.your.domain and get it signed at a CA.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# openssl req -sha256 -days 3650 -nodes -new -newkey rsa:4096 -keyout /etc/ssl/private/imap.bitlair.nl-key.pem -out /etc/ssl/imap.bitlair.nl-csr.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Input your location and contact information. At the CN field, input your mail hostname (imap.bitlair.nl in my case). Do not enter a challenge password.&lt;br /&gt;
&lt;br /&gt;
Submit the -csr.pem file to a CA, store the certificate you get signed from the CA in /etc/ssl/imap.your.domain-cert.pem.&lt;br /&gt;
&lt;br /&gt;
=== Setting up dovecot ===&lt;br /&gt;
Configuring dovecot should be pretty straightforward. The first step is to disable plain IMAP.&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-master.conf set port = 0 for both imap and pop3 and enable imaps. Only use the TLS-protected ports.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  inet_listener imap {&lt;br /&gt;
          port = 0&lt;br /&gt;
  }&lt;br /&gt;
  inet_listener imaps {&lt;br /&gt;
    port = 993&lt;br /&gt;
    ssl = yes&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-ssl.conf, disable SSLv3, mandate TLS and configure your certificates:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl = required&lt;br /&gt;
ssl_cert = &amp;lt;/etc/ssl/imap.bitlair.nl-cert.pem&lt;br /&gt;
ssl_key = &amp;lt;/etc/dovecot/private/imap.bitlair.nl-key.pem&lt;br /&gt;
ssl_protocols = !SSLv2 !SSLv3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Set the mail location where you want your mail delivered in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_location = mdbox:/srv/mail/%n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you want mailbox sharing between users, dovecot needs to setuid all mailboxes with the same user, so set this in /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mail_uid = vmail&lt;br /&gt;
mail_gid = vmail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable the lmtp service in /etc/dovecot/conf.d/10-master.conf and override the user, so LMTP doesn&#039;t run as root.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service lmtp {&lt;br /&gt;
  user = vmail&lt;br /&gt;
  unix_listener lmtp {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the auth_username_format to %n in /etc/dovecot/conf.d/10-auth.conf, to make sure mail sent to username@domain via LMTP is delivered to the lower case username.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auth_username_format = %Ln&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the autocreate setting properly for the Local Delivery Agent in /etc/dovecot/conf.d/15-lda.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lda_mailbox_autocreate = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create the vmail user and create the mail store&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# useradd --system vmail&lt;br /&gt;
~# mkdir -m 0700 /srv/mail&lt;br /&gt;
~# chown vmail: /srv/mail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set up sieve filters, uncomment the listen section in /etc/dovecot/conf.d/20-managesieve.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service managesieve-login {&lt;br /&gt;
  inet_listener sieve {&lt;br /&gt;
    port = 4190&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are going to change a few things in order to get sieve working properly. &lt;br /&gt;
&lt;br /&gt;
First open and comment out the following in &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#  sieve = ~/.dovecot.sieve&lt;br /&gt;
#  sieve_dir = ~/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the reason we need to comment out the above entries is because a users home directory for mail is  &amp;quot;/srv/mail/%n&amp;quot; (%n = Username)and what the default actually says is check &amp;quot;/home/%n&amp;quot; for the sieve script which will fail due to the fact the vmail user cannot access that directory so we are going to move sieve configs to the users mailbox directory. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now in the same file &amp;quot;/etc/dovecot/conf.d/90-sieve.conf&amp;quot; add the following just under &amp;quot;plugin {&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
    sieve = /srv/mail/%n/.dovecot.sieve&lt;br /&gt;
    sieve_global_path = /etc/dovecot/sieve/default.sieve&lt;br /&gt;
    sieve_dir = /srv/mail/%n&lt;br /&gt;
    sieve_global_dir = /etc/dovecot/sieve/global/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
We need to create the default directories next which will give us global rules for all users. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mkdir -p /etc/dovecot/sieve/global&lt;br /&gt;
chown vmail:vmail -R /etc/dovecot/sieve&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have the directories for global rules for all users.&lt;br /&gt;
&lt;br /&gt;
Now we are going to restart dovecot using the following command to update the configuration of dovecot: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
## service dovecot restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to test this lets add a test global rule by editing &amp;quot;/etc/dovecot/sieve/default.sieve&amp;quot; and adding the following: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
require [&amp;quot;fileinto&amp;quot;];&lt;br /&gt;
# rule:[SPAM]&lt;br /&gt;
if header :contains &amp;quot;X-Spam-Flag&amp;quot; &amp;quot;YES&amp;quot; {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
# rule:[SPAM2]&lt;br /&gt;
elsif header :matches &amp;quot;Subject&amp;quot; [&amp;quot;*money*&amp;quot;,&amp;quot;*Viagra*&amp;quot;,&amp;quot;Cialis&amp;quot;] {&lt;br /&gt;
        fileinto &amp;quot;Junk&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
now to test it send yourself a mail with money in the subject and see if it gets filed into Junk. &lt;br /&gt;
If it does not work try sending it from an external mailserver and see if it works then. &lt;br /&gt;
&lt;br /&gt;
Now if you want to add a rule that applies only to a single user then make add the same rule to the file &amp;quot;/srv/mail/username/.dovecot.sieve&amp;quot; and make sure the file is owned and writeable by the vmail user. &lt;br /&gt;
&lt;br /&gt;
that&#039;s everything you need to know about sieve if an error occurs /var/log/mail.log will tell you and a log file will be created in the same directory as the sieve rule when an issue with the rule occurs. &lt;br /&gt;
&lt;br /&gt;
If you are not using LDAP then the following applies to you:&lt;br /&gt;
&lt;br /&gt;
And also, if you&#039;re not going to use LDAP, set the following overrides in /etc/dovecot/conf.d/auth-system.conf.ext&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  # &amp;lt;doc/wiki/AuthDatabase.Passwd.txt&amp;gt;&lt;br /&gt;
  driver = passwd&lt;br /&gt;
  # [blocking=no]&lt;br /&gt;
  #args =&lt;br /&gt;
&lt;br /&gt;
  # Override fields from passwd&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you&#039;re basically done. If you want LDAP integration, continue with the next section.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integrating LDAP into dovecot ===&lt;br /&gt;
Make sure dovecot-ldap is installed. &lt;br /&gt;
Change /etc/dovecot/conf.d/10-auth.conf to include auth-ldap.conf.ext and not include auth-system.conf.ext&lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-auth.conf and change your overrides in the userdb section:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
userdb {&lt;br /&gt;
  driver = ldap&lt;br /&gt;
  args = /etc/dovecot/dovecot-ldap.conf.ext&lt;br /&gt;
&lt;br /&gt;
  # Default fields can be used to specify defaults that LDAP may override&lt;br /&gt;
  #default_fields = home=/home/virtual/%u&lt;br /&gt;
&lt;br /&gt;
  # Override fields that are always set to this value, regardless of what LDAP returns&lt;br /&gt;
  override_fields = uid=vmail gid=vmail&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now open /etc/dovecot/dovecot-ldap.conf.ext, configure your exim search user, base dn and search filter.&lt;br /&gt;
&lt;br /&gt;
You should be done now.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service dovecot restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
Testing logins:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
1 LOGIN username password&lt;br /&gt;
1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE] Logged in&lt;br /&gt;
2 LOGOUT&lt;br /&gt;
* BYE Logging out&lt;br /&gt;
2 OK Logout completed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing your TLS configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ openssl s_client -connect localhost:993 -CAfile /etc/ssl/certs/ca-certificates.crt -verify 5&lt;br /&gt;
&lt;br /&gt;
... -&amp;gt;snip certificate stuff&amp;lt;- ...&lt;br /&gt;
    Verify return code: 0 (ok)&lt;br /&gt;
---&lt;br /&gt;
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You should see return code: 0 (ok), any other return code is bad.&lt;br /&gt;
&lt;br /&gt;
=== ACL and Shared mailboxs (allowing delegated mailboxes)  ===&lt;br /&gt;
&lt;br /&gt;
To allow users to share mailboxes with each other add the following configuration changes. &lt;br /&gt;
&lt;br /&gt;
Open /etc/dovecot/conf.d/10-mail.conf and uncomment the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace inbox {&lt;br /&gt;
  type = private&lt;br /&gt;
  separator = / &lt;br /&gt;
  #prefix = &lt;br /&gt;
  #location =&lt;br /&gt;
  inbox = yes&lt;br /&gt;
  #hidden = no&lt;br /&gt;
  #list = yes&lt;br /&gt;
  #subscriptions = yes&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that following option is set in the /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
&lt;br /&gt;
# Space separated list of plugins to load for all services. Plugins specific to&lt;br /&gt;
# IMAP, LDA, etc. are added to this list in their own .conf files.&lt;br /&gt;
mail_plugins = acl&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And add the following to the end of the same file (/etc/dovecot/conf.d/10-mail.conf): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  type = shared&lt;br /&gt;
  separator = /&lt;br /&gt;
  prefix = shared/%%n/&lt;br /&gt;
  location = mdbox:/srv/mail/%%n&lt;br /&gt;
  subscriptions = yes&lt;br /&gt;
  list = children&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the file /etc/dovecot/conf.d/20-imap.conf make sure the following changes are made: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
protocol imap {&lt;br /&gt;
  # Space separated list of plugins to load (default is global mail_plugins).&lt;br /&gt;
  mail_plugins = $mail_plugins imap_acl&lt;br /&gt;
&lt;br /&gt;
  # Maximum number of IMAP connections allowed for a user from each IP address.&lt;br /&gt;
  # NOTE: The username is compared case-sensitively.&lt;br /&gt;
  #mail_max_userip_connections = 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And finally add the following to the /etc/dovecot/conf.d/90-acl.conf: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plugin {&lt;br /&gt;
   #acl = vfile:/etc/dovecot/global-acls:cache_secs=300&lt;br /&gt;
   acl = vfile&lt;br /&gt;
   #acl_shared_dict = file:/etc/dovecot/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# To let users LIST mailboxes shared by other users, Dovecot needs a&lt;br /&gt;
# shared mailbox dictionary. For example:&lt;br /&gt;
plugin {&lt;br /&gt;
  #acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes&lt;br /&gt;
  acl_shared_dict = file:/srv/mail/shared-mailboxes.db&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardening ==&lt;br /&gt;
=== Exim4 rate limiting ===&lt;br /&gt;
First, we need to make sure only 1 message is sent per connection, we also want to limit the number of simultaneous connections. For most small mail providers, allowing 20 simulataneous connections should be plenty.&lt;br /&gt;
&lt;br /&gt;
Create a file in /etc/exim4/conf.d/main/04_ratelimiting with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smtp_accept_max_per_connection = 1&lt;br /&gt;
smtp_accept_max_per_host = 1&lt;br /&gt;
smtp_accept_max = 20&lt;br /&gt;
acl_smtp_connect = acl_check_connect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And create the ACL file /etc/exim4/conf.d/acl/50_exim4-connectdelay with contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl_check_connect:&lt;br /&gt;
  accept&lt;br /&gt;
    delay = 3s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And regenerate the configuration and restart exim4&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Testing the banner delay ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ telnet ::1 25&lt;br /&gt;
Trying ::1...&lt;br /&gt;
Connected to ::1.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
EHLO boe&lt;br /&gt;
554 SMTP synchronization error&lt;br /&gt;
Connection closed by foreign host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SMTP banner should only appear after 3 seconds of not giving any inputs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rate limiting hosts with iptables ===&lt;br /&gt;
Make sure you input something like this into your firewall. The mask here implies throttling new connections for entire /64s:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For legacy IP:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle&lt;br /&gt;
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes sure that nobody can connect more than 6 times per minute to your SMTP server.&lt;br /&gt;
I also have a port scan wrapper which auto-blacklists bad people, so my firewall looks like this in my executable /etc/network/if-pre-up.d/ip6tables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
(ip6tables -F&lt;br /&gt;
ip6tables -X&lt;br /&gt;
ipset flush local6&lt;br /&gt;
ipset destroy local6&lt;br /&gt;
)&amp;amp;&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipset create local6 hash:net hashsize 1024 family inet6&lt;br /&gt;
ipset add local6 2001:470:7b66::/48&lt;br /&gt;
ipset add local6 fe80::/16&lt;br /&gt;
ipset add local6 ::1/128&lt;br /&gt;
&lt;br /&gt;
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -m set --match-set local6 src -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp -m state --state NEW -m recent --rcheck --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set --name smtpthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --name smtpthrottle --seconds 60 --hitcount 6 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name sshthrottle --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name sshthrottle --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 25 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 \! --icmpv6-type redirect -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 1:21 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --set --name badpeople --mask ffff:ffff:ffff:ffff::&lt;br /&gt;
ip6tables -A INPUT -p tcp --dport 26:1023 -m state --state NEW -m recent --update --name badpeople --seconds 3600 --hitcount 5 --mask ffff:ffff:ffff:ffff:: -j DROP&lt;br /&gt;
ip6tables -A INPUT -j DROP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More information on hardening ===&lt;br /&gt;
* http://michaelfranzl.com/2013/09/07/setting-up-exim4-mail-transfer-agent-with-spam-filtering-greylisting-and-anti-virus/&lt;br /&gt;
* http://techsadmin.blogspot.nl/2012/11/exim-hardening-practices.html&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
In general, look at the log files /var/log/exim4/mainlog and /var/log/exim4/paniclog. For Clamav, look at /var/log/clamav/clamav.log. For spamd, check out the main syslog in /var/log/syslog.&lt;br /&gt;
&lt;br /&gt;
Most issues are caused by forgetting to regenerate the configuration, try regenerating and restarting exim4 to see if your problem persists.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to add the clamav user to the exim group ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 14:13:46 1YXD2f-0000D2-BL malware acl condition: clamd: ClamAV &lt;br /&gt;
   returned: /var/spool/exim4/scan/1YXD2f-0000D2-BL/1YXD2f-0000D2-BL.eml: lstat() failed: Permission denied. ERROR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G Debian-exim clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Not using wheezy-updates or jessie-updates repository ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WARNING: Your ClamAV installation is OUTDATED!&lt;br /&gt;
WARNING: Local version: 0.98.5 Recommended version: 0.98.6&lt;br /&gt;
DON&#039;T PANIC! Read http://www.clamav.net/support/faq&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Can be fixed by adding the -updates repository to /etc/apt/sources.list, for wheezy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian wheezy-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For Debian jessie:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://ftp.debian.org/debian jessie-updates main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Forgetting to add the exim to sasl group ===&lt;br /&gt;
You&#039;ll see something like this in the mainlog:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-15 16:01:54 plain_saslauthd_server authenticator failed for (mail.bitlair.nl) [2a02:2ca0:aaa::a843:657d]: &lt;br /&gt;
    435 Unable to authenticate at present (set_id=wilco): cannot connect to saslauthd daemon at /var/run/saslauthd/mux: Permission denied&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And swaks will tell you:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;~* 435 Unable to authenticate at present&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Running the following will fix it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# usermod -a -G sasl Debian-exim&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== auth-ldap and dovecot-ldap.conf files missing ===&lt;br /&gt;
You cannot find the auth-ldap files in the /etc/dovecot/conf.d or the dovecot-ldap file in /etc/dovecot.&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Forgetting to install dovecot-lmtpd ===&lt;br /&gt;
You&#039;ve enabled the lmtp service, but when starting dovecot, the UNIX socket /var/run/dovecot/lmtp is not created.&lt;br /&gt;
&lt;br /&gt;
Exim will give messages like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-03-31 09:43:57 1Ycqq4-0004Q8-NP == wilco@bitlair.nl &amp;lt;root@bitlair.nl&amp;gt; R=ldap_users T=lmtp defer (-1): &lt;br /&gt;
    Failed to connect to socket /var/run/dovecot/lmtp for lmtp transport: No such file or directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can be fixed with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install dovecot-lmtpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Spamassassin hits rule URIBL_BLOCKED on every mail message ===&lt;br /&gt;
You keep getting spamassassin URIBL_BLOCKED on every message.. this is likely caused by using large caching DNS servers.&lt;br /&gt;
&lt;br /&gt;
Set up your own DNS server on your box to fix it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# apt-get install bind9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Test it with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~$ host www.google.nl ::1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If it works, change your resolv.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# echo nameserver ::1 &amp;gt; /etc/resolv.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== You keep getting 550 relay not permitted for local email addresses ===&lt;br /&gt;
You most likely forgot to include your domain as a local domain.&lt;br /&gt;
&lt;br /&gt;
You can change this in /etc/exim4/update-exim4.conf.conf. There is a semicolon-separated list of dc_other_hostnames. These are the hostnames to accept mail for.&lt;br /&gt;
&lt;br /&gt;
After adding your domains to this file, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# update-exim4.conf&lt;br /&gt;
~# service exim4 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  Unable to verify the first certificate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Verify return code: 21 (unable to verify the first certificate)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means you forgot to append the chain file to the certificate. See the TLS section on appending the certificate chain and check the certificate chain you see in the s_client output.&lt;br /&gt;
&lt;br /&gt;
Verify that there are two certificates in /etc/ssl/your-mailserver-cert.pem. The first one should be your mail certificate and the second one should be the chain file.&lt;br /&gt;
&lt;br /&gt;
=== TLS not available and Error while reading file message in exim4.log ===&lt;br /&gt;
You will get output from s_client like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
139736697235088:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:774:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or &amp;quot;TLS is currently unavailable&amp;quot; when issueing the STARTTLS command in SMTP.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll see this message in the log:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015-04-12 18:31:50 TLS error on connection from localhost (openssl.client.net) [127.0.0.1] (cert/key setup: cert=/etc/ssl/mail.bitlair.nl-cert.pem key=/etc/ssl/private/mail.bitlair.nl-key.pem): Error while reading file.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be fixed by setting the access rights appropriately (see the TLS section). Don&#039;t forget to restart exim4! The problem may also be caused by not restarting exim4 adding Debian-exim to the ssl-cert group. It may also be caused by the certificates being missing or a typo in the location in the configuration file. After editing, regenerate the configuration file!&lt;br /&gt;
&lt;br /&gt;
=== Keep getting 421 Unexpected failure after RCPT TO ===&lt;br /&gt;
&lt;br /&gt;
Check your exim4 mainlog, it may say something like &amp;quot;no host name found for IP address xxxx:xxx:xxx::xxx. &lt;br /&gt;
Your mail server will only accept mail if you have a valid reverse DNS entry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DKIM signatures are not added ===&lt;br /&gt;
Add some debugging output to your mainlog by setting this debug_print in /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remote_smtp:&lt;br /&gt;
  debug_print = &amp;quot;T: remote_smtp for $local_part@$domain, DKIM domain DKIM_DOMAIN DKIM_FILE&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, stop exim4:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# service exim4 stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, start exim4 in transport debugging mode in a new terminal:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~# exim -bd -d+transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can send yourself another email and you should see messages about which DKIM domain and key it is going to use in the debugging output&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Coronamaatregelen&amp;diff=7308</id>
		<title>Coronamaatregelen</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Coronamaatregelen&amp;diff=7308"/>
		<updated>2020-05-25T11:41:22Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Reserveersysteem spacedagen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tijdelijke aanvullende regels (vanaf 1 juni 2020) ==&lt;br /&gt;
* De standaard RIVM regels moeten in acht worden genomen:&lt;br /&gt;
** Houdt 1.5 meter afstand&lt;br /&gt;
** Blijf thuis bij verkoudheid, koorts of iedere andere indicator van het virus&lt;br /&gt;
** Blijf twee weken thuis wanneer je met iemand in contact bent (geweest) die het virus heeft&lt;br /&gt;
** Altijd handen wassen met zeep bij aankomst&lt;br /&gt;
* Wordt je ziek en vermoed je dat je het virus onder de leden hebt? Laat dit direct aan het bestuur weten (bestuur@bitlair.nl) of bestuurslid&lt;br /&gt;
* Eten&lt;br /&gt;
** Bij het opwarmen van eten, gebruik alleen de magnetron. Dus geen maaltijden koken/bereiden op de space!&lt;br /&gt;
** Het tosti-ijzer is ook beschikbaar mits deze schoongemaakt wordt.&lt;br /&gt;
** Na gebruik, handvaten/knoppen schoonmaken met IPA wanneer apparaat afgekoeld is&lt;br /&gt;
** Maak gebruik van normaal bestek en was dit zelf af met heet water en afwasmiddel&lt;br /&gt;
* Schoonmaken:&lt;br /&gt;
** Bij vertrek de plek waaraan je gezeten hebt schoonmaken, inclusief het evt. gebruikte gereedschap&lt;br /&gt;
** Als je de laatste bent die de space verlaat maak je alle deurklinken, raamklinken, barcodescanner, toetsenbord revbank en deurklink koel/vries combinatie schoon met 70% IPA oplossing&lt;br /&gt;
** Laat de deuren zoveel mogelijk open ivm goede ventilatie en niet aan hoeven aanraken&lt;br /&gt;
** Zet bij binnenkomst alle ramen open ivm ventilatie, bij vertrek sluit je alle ramen en neemt de klink af met een tissue met IPA oplossing.&lt;br /&gt;
** Laat het licht op het toilet aan zodat de ventilatie actief blijft&lt;br /&gt;
** De wc’s worden minimaal 1x in de week schoon gemaakt&lt;br /&gt;
* Bar:&lt;br /&gt;
** Barcodescanner vastschroeven en in zelfscanmodus plaatsen&lt;br /&gt;
** Houd een badge met je naam bij je, liggen geprint op de bar&lt;br /&gt;
* Kies een dag en daar houd je je voorlopig aan (dat wordt voorlopig je standaard spacedag), schrijf je hieronder in&lt;br /&gt;
** De overige dagen ben je tijdelijk niet welkom&lt;br /&gt;
** Niet van dag wisselen per week, mocht je toch willen wisselen door omstandigheden overleg dan met het bestuur&lt;br /&gt;
** Er is plaats voor maximaal 12 man in de space, is een dag vol kies een andere dag&lt;br /&gt;
** De dag is van 6.00 tot 6.00 de volgende dag&lt;br /&gt;
* Zie je dat iemand de regels overtreed spreek deze persoon erop aan&lt;br /&gt;
* Al deze regels zijn zijn onderhevig aan de huidige situatie in Nederland&lt;br /&gt;
&lt;br /&gt;
== Reserveersysteem spacedagen ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aantal !! Maandag !! Dinsdag !! Woensdag !! Donderdag !! Zondag&lt;br /&gt;
|-&lt;br /&gt;
|1 ||  ||  Manfred  || Hobbybob || ||  Linor&lt;br /&gt;
|-&lt;br /&gt;
|2 ||  ||  || Robotnik ||  ||  AK&lt;br /&gt;
|-&lt;br /&gt;
|3 ||  ||  || Procyon  ||  ||  Jeroen&lt;br /&gt;
|-&lt;br /&gt;
|4 ||  ||  ||  ||  ||  Sportgekje&lt;br /&gt;
|-&lt;br /&gt;
|5 ||  ||  ||  ||  ||  Bob&lt;br /&gt;
|-&lt;br /&gt;
|6 ||  ||  ||  ||  ||  Kuro Maii&lt;br /&gt;
|-&lt;br /&gt;
|7 ||  ||  ||  ||  || Bart-Jan&lt;br /&gt;
|-&lt;br /&gt;
|8 ||  ||  ||  ||  || Jolo &lt;br /&gt;
|-&lt;br /&gt;
|9 ||  ||  ||  ||  ||  polyfloyd&lt;br /&gt;
|-&lt;br /&gt;
|10 ||  ||  ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
|11 ||  ||  ||  ||  ||  &lt;br /&gt;
|-&lt;br /&gt;
|12 ||  || Wilco (ovb)  ||  FooBar (ovb) ||  ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
NB: Vrijdag en zaterdag zijn niet beschikbaar omdat deze beschikbaar zijn gesteld aan DJO.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2019-06-29_DJO_opruiming&amp;diff=6923</id>
		<title>Events/2019-06-29 DJO opruiming</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2019-06-29_DJO_opruiming&amp;diff=6923"/>
		<updated>2019-06-15T12:13:33Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: Created page with &amp;quot;{{Event |name=DJO ruimt op! |start=2019/06/29 14:00:00  |end=2019/06/29 18:00:00  |location=Bitlair, Computerweg 20A }} DJO ruimt spullen op.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=DJO ruimt op!&lt;br /&gt;
|start=2019/06/29 14:00:00 &lt;br /&gt;
|end=2019/06/29 18:00:00 &lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
DJO ruimt spullen op.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_of_Hack42&amp;diff=6569</id>
		<title>Events/2018-11-04 Invasion of Hack42</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_of_Hack42&amp;diff=6569"/>
		<updated>2018-10-17T14:00:39Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-11-04 Invasion of Hack42 to Events/2018-11-04 Invasion by Hack42&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Events/2018-11-04 Invasion by Hack42]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6568</id>
		<title>Events/2018-11-04 Invasion by Hack42</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6568"/>
		<updated>2018-10-17T14:00:39Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-11-04 Invasion of Hack42 to Events/2018-11-04 Invasion by Hack42&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Invasion by Hack42&lt;br /&gt;
|start=2018/11/04 20:45:00 &lt;br /&gt;
|end=2018/11/04 21:45:00 &lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
We will be invaded by a bus full of #42 folk. See https://hack42.nl/wiki/Hack42_on_Tour for more information&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6567</id>
		<title>Events/2018-11-04 Invasion by Hack42</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6567"/>
		<updated>2018-10-17T14:00:26Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Invasion by Hack42&lt;br /&gt;
|start=2018/11/04 20:45:00 &lt;br /&gt;
|end=2018/11/04 21:45:00 &lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
We will be invaded by a bus full of #42 folk. See https://hack42.nl/wiki/Hack42_on_Tour for more information&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6566</id>
		<title>Events/2018-11-04 Invasion by Hack42</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-11-04_Invasion_by_Hack42&amp;diff=6566"/>
		<updated>2018-10-17T13:59:27Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: Created page with &amp;quot;{{Event |name=Invasion of Hack42 |start=2018/11/04 20:45:00  |end=2018/11/04 21:45:00  |location=Bitlair, Computerweg 20A }} We will be invaded by a bus full of #42 folk. See...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Invasion of Hack42&lt;br /&gt;
|start=2018/11/04 20:45:00 &lt;br /&gt;
|end=2018/11/04 21:45:00 &lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
We will be invaded by a bus full of #42 folk. See https://hack42.nl/wiki/Hack42_on_Tour for more information&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-06-9_Hack_in_the_Class_meetup&amp;diff=6371</id>
		<title>Events/2018-06-9 Hack in the Class meetup</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-06-9_Hack_in_the_Class_meetup&amp;diff=6371"/>
		<updated>2018-05-03T14:54:42Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-06-9 Hack in the Class meetup to Events/2018-06-09 Hack in the Class meetup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Events/2018-06-09 Hack in the Class meetup]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-06-09_Hack_in_the_Class_meetup&amp;diff=6370</id>
		<title>Events/2018-06-09 Hack in the Class meetup</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-06-09_Hack_in_the_Class_meetup&amp;diff=6370"/>
		<updated>2018-05-03T14:54:42Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-06-9 Hack in the Class meetup to Events/2018-06-09 Hack in the Class meetup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Hack in the Class meetup&lt;br /&gt;
|start=2018/06/09 02:00:00 PM&lt;br /&gt;
|end=2018/06/09 06:00:00 PM&lt;br /&gt;
|location=Bitlair, Computerweg 20A&lt;br /&gt;
}}&lt;br /&gt;
Hack in the Class meetup voor o.a. het ontwikkelen van nieuw lesmateriaal voor workshops&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-12&amp;diff=6369</id>
		<title>Events/2018-05-12</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-12&amp;diff=6369"/>
		<updated>2018-05-03T14:34:58Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-05-12 to Events/2018-05-12 Hack in the class meetup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Events/2018-05-12 Hack in the class meetup]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-12_Hack_in_the_class_meetup&amp;diff=6368</id>
		<title>Events/2018-05-12 Hack in the class meetup</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-12_Hack_in_the_class_meetup&amp;diff=6368"/>
		<updated>2018-05-03T14:34:58Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-05-12 to Events/2018-05-12 Hack in the class meetup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Hack in the Class Meet-up&lt;br /&gt;
|start=2018/05/12 02:00:00 PM&lt;br /&gt;
|end=2018/05/12 06:00:00 PM&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Hack in the class meeting om o.a. lesmateriaal te ontwikkelen voor nieuwe workshops.&lt;br /&gt;
&lt;br /&gt;
Wil je meehelpen / meer info? Stuur Nemo een berichtje.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6354</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6354"/>
		<updated>2018-04-27T14:59:10Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|start=2018/04/28 14:00:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
De workshop wordt gegeven door Wilco Baan Hofman.&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Wij gaan op geen enkele manier spammen, tenzij je handmatig aanmeldt op onze announce of general mailing list op https://list.bitlair.nl. &lt;br /&gt;
&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Rogue || rogue@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Rowan8k || rowan8k@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Edef || edef.incognitus@protonmail.com ||&lt;br /&gt;
|-&lt;br /&gt;
|Tabitha || ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6353</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6353"/>
		<updated>2018-04-27T14:58:20Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|start=2018/04/28 02:00:00 PM&lt;br /&gt;
|end=2018/04/28 06:00:00 PM&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
De workshop wordt gegeven door Wilco Baan Hofman.&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Wij gaan op geen enkele manier spammen, tenzij je handmatig aanmeldt op onze announce of general mailing list op https://list.bitlair.nl. &lt;br /&gt;
&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Rogue || rogue@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Rowan8k || rowan8k@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Edef || edef.incognitus@protonmail.com ||&lt;br /&gt;
|-&lt;br /&gt;
|Tabitha || ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6257</id>
		<title>Events/2018-04-21 Openingsfeest Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6257"/>
		<updated>2018-04-10T15:35:47Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Openingsfeest Space3.0&lt;br /&gt;
|start=2018/04/21 01:37:00 PM&lt;br /&gt;
|end=2018/04/21 11:59:00 PM&lt;br /&gt;
|location=Bitlair&lt;br /&gt;
|date=2018/04/21&lt;br /&gt;
}}&lt;br /&gt;
Openingsfeest voor onze ruimte op de computerweg 20A! Omdat wij een nieuwe ruimte hebben die nodig ingewijd moet worden, geven wij een feestje op 21 april 2018.&lt;br /&gt;
&lt;br /&gt;
Wij bestaan sinds 15 maart 2011, dus omdat wij 7 jaar bestaan is dat extra reden voor een feestje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DJO &amp;amp; Bitlair met vrije toegang voor hackers en geïnteresseerden.&lt;br /&gt;
&lt;br /&gt;
* We zijn open vanaf &amp;lt;b&amp;gt;13:37&amp;lt;/b&amp;gt;.&lt;br /&gt;
* Om &amp;lt;b&amp;gt;16:00&amp;lt;/b&amp;gt; is de officiële opening!&lt;br /&gt;
&lt;br /&gt;
== Nomz! ==&lt;br /&gt;
We organiseren een BBQ die start rond &amp;lt;b&amp;gt;19:00&amp;lt;/b&amp;gt;. De kosten voor de BBQ zijn &amp;lt;b&amp;gt;10 euro&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zet jezelf op de lijst, of vraag iemand dit voor je te doen, bijvoorbeeld door op [[Contact|IRC]] te vragen.&lt;br /&gt;
&lt;br /&gt;
=== Inschrijvingen ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;BBQParticipants&amp;quot;&lt;br /&gt;
! Naam/Nick !! Vlees !! Vega !! Opmerkingen&lt;br /&gt;
{{BBQParticipant|Participant=AK47|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Maeddoc|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=rowan8k|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=polyfloyd|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Tjalling|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Tjempie|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Cecil|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Anus|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Rogue|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Eightdot|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Mro|Vlees=2}}&lt;br /&gt;
{{BBQParticipant|Participant=Hobbybob|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Jeroen|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Juerd|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=benadski|Vega=1}}|Wil best vega regelen&lt;br /&gt;
{{BBQParticipant|Participant=WilcoBaanHofman|Vega=1}}|Vegan&lt;br /&gt;
{{BBQParticipant|Participant=Nemoriety|Vega=1}}|Vegan&lt;br /&gt;
|-&lt;br /&gt;
! Subtotaal || {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|limit=50|format=sum}} ||{{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVega|limit=50|format=sum}} ||&lt;br /&gt;
|-&lt;br /&gt;
! Totaal ||colspan=&amp;quot;2&amp;quot;| {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|?BBQVega|limit=70|format=sum}} || max: 70&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6256</id>
		<title>Events/2018-04-21 Openingsfeest Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6256"/>
		<updated>2018-04-10T13:36:55Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Openingsfeest Space3.0&lt;br /&gt;
|start=2018/04/21 01:37:00 PM&lt;br /&gt;
|end=2018/04/21 11:59:00 PM&lt;br /&gt;
|location=Bitlair&lt;br /&gt;
|date=2018/04/21&lt;br /&gt;
}}&lt;br /&gt;
Openingsfeest voor onze ruimte op de computerweg 20A! Omdat wij een nieuwe ruimte hebben die nodig ingewijd moet worden, geven wij een feestje op 21 april 2018.&lt;br /&gt;
&lt;br /&gt;
Wij bestaan sinds 15 maart 2011, dus omdat wij 7 jaar bestaan is dat extra reden voor een feestje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DJO &amp;amp; Bitlair met vrije toegang voor hackers en geïnteresseerden.&lt;br /&gt;
&lt;br /&gt;
* We zijn open vanaf &amp;lt;b&amp;gt;13:37&amp;lt;/b&amp;gt;.&lt;br /&gt;
* Om &amp;lt;b&amp;gt;16:00&amp;lt;/b&amp;gt; is de officiële opening!&lt;br /&gt;
&lt;br /&gt;
== Nomz! ==&lt;br /&gt;
We organiseren een BBQ die start rond &amp;lt;b&amp;gt;19:00&amp;lt;/b&amp;gt;. De kosten voor de BBQ zijn &amp;lt;b&amp;gt;10 euro&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zet jezelf op de lijst, of vraag iemand dit voor je te doen, bijvoorbeeld door op [[Contact|IRC]] te vragen.&lt;br /&gt;
&lt;br /&gt;
=== Inschrijvingen ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;BBQParticipants&amp;quot;&lt;br /&gt;
! Naam/Nick !! Vlees !! Vega !! Opmerkingen&lt;br /&gt;
{{BBQParticipant|Participant=AK47|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Maeddoc|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=rowan8k|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=polyfloyd|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Tjalling|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Tjempie|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Cecil|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Anus|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Rogue|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Eightdot|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Mro|Vlees=2}}&lt;br /&gt;
{{BBQParticipant|Participant=Hobbybob|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Jeroen|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=Juerd|Vlees=1}}&lt;br /&gt;
{{BBQParticipant|Participant=benadski|Vega=1}}|Wil best vega regelen&lt;br /&gt;
{{BBQParticipant|Participant=WilcoBaanHofman|Vega=1}}|Vegan&lt;br /&gt;
{{BBQParticipant|Participant=Nemoriety|Vega=1}}|Vegan&lt;br /&gt;
! Subtotaal || {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|limit=50|format=sum}} ||{{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVega|limit=50|format=sum}} ||&lt;br /&gt;
|-&lt;br /&gt;
! Totaal ||colspan=&amp;quot;2&amp;quot;| {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|?BBQVega|limit=70|format=sum}} || max: 70&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-03-31_Open_Dag&amp;diff=6223</id>
		<title>Events/2018-03-31 Open Dag</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-03-31_Open_Dag&amp;diff=6223"/>
		<updated>2018-03-29T10:14:41Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Wie is erbij en wat neem je mee? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Landelijke Hackerspaces Open Dag&lt;br /&gt;
|start=2018/03/31 02:00:00 PM&lt;br /&gt;
|end=2018/03/31 06:00:00 PM&lt;br /&gt;
|location=Bitlair&lt;br /&gt;
}}&lt;br /&gt;
== Informatie voor bezoekers ==&lt;br /&gt;
Het hackersevenement HAR2009 gaf de start aan een golf van hackerspaces in Nederland, momenteel zijn er 16 gevestigde hackerspaces. Dit zijn locaties waar mensen met een technische, creatieve en nieuwsgierige mindset bijeenkomen om te werken aan projecten, elkaar te ontmoeten en te praten over onderwerpen die hen interesseren. Tijdens de open dag is het mogelijk om zelf te ontdekken wat hacken inhoudt en te zien wat er allemaal mogelijk is in een hackerspace. Tipje van de sluier? Iemands verbeeldingskracht is de meest beperkende factor! Iedereen is welkom om een kijkje te komen nemen tijdens deze jaarlijks terugkerende open dag. Vanaf 14:00 uur &#039;s middags zijn de deuren geopend en om 18:00 is het dagprogramma afgelopen. Sommige hackerspaces blijven ‘s avonds geopend. Per hackerspace zijn verschillende presentaties te zien van de individuele projecten die in de hackerspace worden uitgevoerd. Enkele voorbeelden van geplande activiteiten zijn:&lt;br /&gt;
&lt;br /&gt;
Kennis opdoen over de juiste bescherming van je persoonsgegevens. 3D-printen, lasersnijden of solderen.&lt;br /&gt;
&lt;br /&gt;
Hackers vinden ethiek belangrijk, daarom wordt er binnen de hackerspaces gesproken over hoe hackers proberen de wereld te verbeteren door kritisch en fris naar de maatschappij, techniek en organisaties te kijken en kennis te delen. Daarnaast zijn hackerspaces plekken waar mensen komen die mooie, grappige en creatieve dingen maken. Een plek onder gelijkgestemden waar ze welkom zijn en waar zij een gemeenschappelijke ruimte, gereedschappen en informatie kunnen delen. Een plek die inspiratie geeft!&lt;br /&gt;
&lt;br /&gt;
Aanmelden voor de open dag is niet nodig, het wordt op prijs gesteld als pers zich vooraf meldt en de privacy van de aanwezigen respecteert.&lt;br /&gt;
&lt;br /&gt;
Je bent welkom vanaf &#039;&#039;&#039;14:00&#039;&#039;&#039; bij Bitlair op de &#039;&#039;&#039;Computerweg 20a, Amersfoort&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Informatie voor deelnemers ==&lt;br /&gt;
Neem je projecten mee om te laten zien!&lt;br /&gt;
&lt;br /&gt;
=== Wie is erbij en wat neem je mee? ===&lt;br /&gt;
* polyfloyd, demo&#039;s met mijn kubus en andere LEDs&lt;br /&gt;
* Linor, R2-D2 en gerelateerde hobby projectjes&lt;br /&gt;
* Gopper, mensen Mario laten spelen en koffie drinken&lt;br /&gt;
* Wilco, 2 3D-printers, alarm dialer?&lt;br /&gt;
* (jij?)&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Workshops&amp;diff=6198</id>
		<title>Workshops</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Workshops&amp;diff=6198"/>
		<updated>2018-03-15T09:25:00Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
= Gepland =&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 28 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco Baan Hofman&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [Events/2018-04-28_Workshop_Episch_web_hacken &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Showlasers ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 19 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Dimitri Modderman&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [Events/2018-05-19_Workshop_showlasers &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grafana Dash: Creating management-approved dashboards with Grafana ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; &lt;br /&gt;
** 29 mei start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Geen, donaties welkom!&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Arjan Koopen&lt;br /&gt;
 [Events/2018-05-26_Workshop_Grafana_Dashboards &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Vraag en Aanbod =&lt;br /&gt;
Wil je graag een workshop geven maar zoek je een onderwerp?&lt;br /&gt;
&lt;br /&gt;
Heb je ideeën voor workshops en zoek je iemand die hem zou willen geven?&lt;br /&gt;
&lt;br /&gt;
* 3D printing (RepRap World?) (+1)&lt;br /&gt;
* 3D printer software&lt;br /&gt;
* Fibre splicing (+2)&lt;br /&gt;
* Basic/home WiFi (+1)&lt;br /&gt;
* Advanced WiFi (+4)&lt;br /&gt;
* Routering met dynamische protocollen (OSPF, IS-IS, BGPv4)&lt;br /&gt;
* Episch hacken (+3)&lt;br /&gt;
* Domotica (+3)&lt;br /&gt;
* Pen-testing (+3) - Wat voor pen? Een regenboogpen&lt;br /&gt;
* Lasers (+4)&lt;br /&gt;
* Chemie (Timothy?) (+1)&lt;br /&gt;
* Drones (Michel Rietveld?)&lt;br /&gt;
* $programmeertaal (polyfloyd)&lt;br /&gt;
* 2D (en misschien 3D?) raytracing met GLSL of SPIR-V (polyfloyd)&lt;br /&gt;
* Website scrapers maken (polyfloyd)(+3)&lt;br /&gt;
* Time-series data, metrics, dashboarding, etc. (Grafana/Graphite/etc) (door AK47) (+3)&lt;br /&gt;
* Robot arm maken (+1) (bv http://www.thingiverse.com/thing:2433)&lt;br /&gt;
* fusion 360 leren gebruiken (+5)&lt;br /&gt;
* Git gebruiken en begrijpen (polyfloyd) (+1)&lt;br /&gt;
* Leren naaien door Bitlair kussens te maken :-)&lt;br /&gt;
* 64x64x6 LED matrix kubus (a la https://www.flickr.com/photos/wwward0/13023336793/lightbox)&lt;br /&gt;
* Lockpicking (jwrm22)&lt;br /&gt;
* Impressioning (jwrm22)(Key impressioning = Sleuteljes vijlen)&lt;br /&gt;
&lt;br /&gt;
= Archief =&lt;br /&gt;
== 2016 ==&lt;br /&gt;
=== Arduino for beginners ===&lt;br /&gt;
 [https://bitlair.nl/Projects/Arduino_Workshop_for_Beginners &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039;&lt;br /&gt;
** 4 Februari 2017, start 14:00&lt;br /&gt;
** 1 juli 2017, start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Kartoffel&lt;br /&gt;
 [https://bitlair.nl/Projects/word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Na een ontzettend succesvolle [http://www.randomdata.nl/wiki/index.php/Workshops#Word_clock_workshop.2C_December_2nd.2C_2016 workshop bij randomdata], gaan we nu ook bij bitlair onze eigen word clocks bouwen. Deze klokken verbinden via WiFi om automatisch de tijd binnen te halen. Daarnaast zijn ze erg eenvoudig te herprogrammeren, en staat de [https://github.com/niekproductions/word-clock code] online.&lt;br /&gt;
&lt;br /&gt;
=== Naaimachine ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 14 januari 2017&lt;br /&gt;
** zaterdag 18 maart&lt;br /&gt;
** zaterdag 1 april (nee geen grapje)&lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
** zaterdag 27 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Nicoline&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen&lt;br /&gt;
 [https://bitlair.nl/Events/Naaimachine_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Arduino voor beginners ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;:&lt;br /&gt;
**Donderdag 30 maart 2017 19:30  Arduino voor beginners les 1 &lt;br /&gt;
**Donderdag  6 april 2017 19:30  Arduino voor beginners les 2 &lt;br /&gt;
**Donderdag 13 april 2017 19:30  Arduino voor beginners les 3&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: MRO/Jeroen/Rogue&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: €25 voor materiaal, donaties welkom!&lt;br /&gt;
[https://bitlair.nl/Events/ArduinoWorkshop201703 &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
=== Reverse Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 22 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/ReverseEngineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 29 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/WebHacking_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/IPv6_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Social Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 10 juni&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Ijskimo&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/2017-06-10_Social_Engineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 1 Juli start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Jeroen/MRO&lt;br /&gt;
 [https://bitlair.nl/Projects/herhaling_word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Herhaling van de woordklokworkshop van februari wegens grote belangstelling&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 4 Juli start 19:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Gratis&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Rust Utrecht&lt;br /&gt;
 [https://bitlair.nl/Events/2017-07-04_Rust_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Bitlair is gastheer voor de workshop van Rust Utrecht. Rust is een nieuwe programmeertaal ontwikkeld door medewerkers van Mozilla en vergelijkbaar met C en C++.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Workshops&amp;diff=6197</id>
		<title>Workshops</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Workshops&amp;diff=6197"/>
		<updated>2018-03-15T09:24:45Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
= Gepland =&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 28 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco Baan Hofman&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [Events/2018-04-28_Workshop_Episch_web_hacken &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Showlasers ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 19 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Dimitri Modderman&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [Events/2018-05-19_Workshop_showlasers &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grafana Dash: Creating management-approved dashboards with Grafana ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; &lt;br /&gt;
** 29 mei start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://bitlair.nl/Contact#Locatie Bitlair]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Geen, donaties welkom!&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Arjan Koopen&lt;br /&gt;
 [Events/2018-05-26_Workshop_Grafana_Dashboards &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Herhaling van de woordklokworkshop van februari wegens grote belangstelling&lt;br /&gt;
= Vraag en Aanbod =&lt;br /&gt;
Wil je graag een workshop geven maar zoek je een onderwerp?&lt;br /&gt;
&lt;br /&gt;
Heb je ideeën voor workshops en zoek je iemand die hem zou willen geven?&lt;br /&gt;
&lt;br /&gt;
* 3D printing (RepRap World?) (+1)&lt;br /&gt;
* 3D printer software&lt;br /&gt;
* Fibre splicing (+2)&lt;br /&gt;
* Basic/home WiFi (+1)&lt;br /&gt;
* Advanced WiFi (+4)&lt;br /&gt;
* Routering met dynamische protocollen (OSPF, IS-IS, BGPv4)&lt;br /&gt;
* Episch hacken (+3)&lt;br /&gt;
* Domotica (+3)&lt;br /&gt;
* Pen-testing (+3) - Wat voor pen? Een regenboogpen&lt;br /&gt;
* Lasers (+4)&lt;br /&gt;
* Chemie (Timothy?) (+1)&lt;br /&gt;
* Drones (Michel Rietveld?)&lt;br /&gt;
* $programmeertaal (polyfloyd)&lt;br /&gt;
* 2D (en misschien 3D?) raytracing met GLSL of SPIR-V (polyfloyd)&lt;br /&gt;
* Website scrapers maken (polyfloyd)(+3)&lt;br /&gt;
* Time-series data, metrics, dashboarding, etc. (Grafana/Graphite/etc) (door AK47) (+3)&lt;br /&gt;
* Robot arm maken (+1) (bv http://www.thingiverse.com/thing:2433)&lt;br /&gt;
* fusion 360 leren gebruiken (+5)&lt;br /&gt;
* Git gebruiken en begrijpen (polyfloyd) (+1)&lt;br /&gt;
* Leren naaien door Bitlair kussens te maken :-)&lt;br /&gt;
* 64x64x6 LED matrix kubus (a la https://www.flickr.com/photos/wwward0/13023336793/lightbox)&lt;br /&gt;
* Lockpicking (jwrm22)&lt;br /&gt;
* Impressioning (jwrm22)(Key impressioning = Sleuteljes vijlen)&lt;br /&gt;
&lt;br /&gt;
= Archief =&lt;br /&gt;
== 2016 ==&lt;br /&gt;
=== Arduino for beginners ===&lt;br /&gt;
 [https://bitlair.nl/Projects/Arduino_Workshop_for_Beginners &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039;&lt;br /&gt;
** 4 Februari 2017, start 14:00&lt;br /&gt;
** 1 juli 2017, start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Kartoffel&lt;br /&gt;
 [https://bitlair.nl/Projects/word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Na een ontzettend succesvolle [http://www.randomdata.nl/wiki/index.php/Workshops#Word_clock_workshop.2C_December_2nd.2C_2016 workshop bij randomdata], gaan we nu ook bij bitlair onze eigen word clocks bouwen. Deze klokken verbinden via WiFi om automatisch de tijd binnen te halen. Daarnaast zijn ze erg eenvoudig te herprogrammeren, en staat de [https://github.com/niekproductions/word-clock code] online.&lt;br /&gt;
&lt;br /&gt;
=== Naaimachine ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 14 januari 2017&lt;br /&gt;
** zaterdag 18 maart&lt;br /&gt;
** zaterdag 1 april (nee geen grapje)&lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
** zaterdag 27 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Nicoline&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen&lt;br /&gt;
 [https://bitlair.nl/Events/Naaimachine_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Arduino voor beginners ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;:&lt;br /&gt;
**Donderdag 30 maart 2017 19:30  Arduino voor beginners les 1 &lt;br /&gt;
**Donderdag  6 april 2017 19:30  Arduino voor beginners les 2 &lt;br /&gt;
**Donderdag 13 april 2017 19:30  Arduino voor beginners les 3&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: MRO/Jeroen/Rogue&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: €25 voor materiaal, donaties welkom!&lt;br /&gt;
[https://bitlair.nl/Events/ArduinoWorkshop201703 &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
=== Reverse Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 22 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/ReverseEngineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 29 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/WebHacking_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/IPv6_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Social Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 10 juni&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Ijskimo&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/2017-06-10_Social_Engineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 1 Juli start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Jeroen/MRO&lt;br /&gt;
 [https://bitlair.nl/Projects/herhaling_word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Herhaling van de woordklokworkshop van februari wegens grote belangstelling&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 4 Juli start 19:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Gratis&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Rust Utrecht&lt;br /&gt;
 [https://bitlair.nl/Events/2017-07-04_Rust_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Bitlair is gastheer voor de workshop van Rust Utrecht. Rust is een nieuwe programmeertaal ontwikkeld door medewerkers van Mozilla en vergelijkbaar met C en C++.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6192</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6192"/>
		<updated>2018-03-14T21:20:58Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
|start=2018/04/28 14:30:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
De workshop wordt gegeven door Wilco Baan Hofman.&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Wij gaan op geen enkele manier spammen, tenzij je handmatig aanmeldt op onze announce of general mailing list op https://list.bitlair.nl. &lt;br /&gt;
&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6191</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6191"/>
		<updated>2018-03-14T21:19:19Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana. Workshop given by Arjan Koopen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wat we&#039;ll do ==&lt;br /&gt;
- Creating awesome dashboards with grafana&lt;br /&gt;
&lt;br /&gt;
- Querying data from graphite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior knowledge ==&lt;br /&gt;
It helps to have some reasonable computer expertise.&lt;br /&gt;
&lt;br /&gt;
== Costs ==&lt;br /&gt;
This workshop is free! &lt;br /&gt;
&lt;br /&gt;
== I will join! ==&lt;br /&gt;
It could be that there will be some changes, please leave your e-mail so we can notify you if something changes. We will not spam you in any way unless you manually subscribe to our announce or general mailing list at https://list.bitlair.nl.&lt;br /&gt;
Max. 30 participants.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Arjan || ak47@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Your name || your@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-19_Workshop_showlasers&amp;diff=6190</id>
		<title>Events/2018-05-19 Workshop showlasers</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-19_Workshop_showlasers&amp;diff=6190"/>
		<updated>2018-03-14T21:13:45Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Workshop Showlasers&lt;br /&gt;
|start=2018/05/19 03:00:00 PM&lt;br /&gt;
|end=2018/05/19 06:00:00 PM&lt;br /&gt;
|location=Bitlair, Computerweg 20A, Hoofdruimte&lt;br /&gt;
}}&lt;br /&gt;
The workshop will be held in Bitlair&#039;s Main room (because of distance / safety) and can have a maximum of 15 participants.&lt;br /&gt;
In this workshop Dimitri Modderman will explain:&lt;br /&gt;
&lt;br /&gt;
- Safety (rules, dangers)&lt;br /&gt;
&lt;br /&gt;
- Different type of lasers existing (Gas, Diode, Solid, MetalVapor), the lasers specifically used for lasershows.&lt;br /&gt;
&lt;br /&gt;
- Optics (Divergence, beam combining, Dichroic filters, Waveplates)&lt;br /&gt;
&lt;br /&gt;
- How to build your own projector (where to source parts, what to avoid, where to find information?)&lt;br /&gt;
&lt;br /&gt;
- Software (generic effect building, how to set up safety zones, playing a show)&lt;br /&gt;
&lt;br /&gt;
- Demo time&lt;br /&gt;
&lt;br /&gt;
Participants:&lt;br /&gt;
&lt;br /&gt;
1. Manfred&lt;br /&gt;
&lt;br /&gt;
2.&lt;br /&gt;
&lt;br /&gt;
3.&lt;br /&gt;
&lt;br /&gt;
4.&lt;br /&gt;
&lt;br /&gt;
5.&lt;br /&gt;
&lt;br /&gt;
6.&lt;br /&gt;
&lt;br /&gt;
7.&lt;br /&gt;
&lt;br /&gt;
8.&lt;br /&gt;
&lt;br /&gt;
9.&lt;br /&gt;
&lt;br /&gt;
10.&lt;br /&gt;
&lt;br /&gt;
11.&lt;br /&gt;
&lt;br /&gt;
12.&lt;br /&gt;
&lt;br /&gt;
13.&lt;br /&gt;
&lt;br /&gt;
14.&lt;br /&gt;
&lt;br /&gt;
15.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6189</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6189"/>
		<updated>2018-03-14T21:13:24Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
|start=2018/04/28 14:30:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
De workshop wordt gegeven door Wilco Baan Hofman.&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6188</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6188"/>
		<updated>2018-03-14T21:12:58Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana. Workshop given by Arjan Koopen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wat we&#039;ll do ==&lt;br /&gt;
- Creating awesome dashboards with grafana&lt;br /&gt;
- Querying data from graphite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior knowledge ==&lt;br /&gt;
It helps to have some reasonable computer expertise.&lt;br /&gt;
&lt;br /&gt;
== Costs ==&lt;br /&gt;
This workshop is free! &lt;br /&gt;
&lt;br /&gt;
== I will join! ==&lt;br /&gt;
It could be that there will be some changes, please leave your e-mail so we can notify you if something changes. We will not spam you in any way unless you manually subscribe to our announce or general mailing list at https://list.bitlair.nl.&lt;br /&gt;
Max. 30 participants.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Arjan || ak47@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Your name || your@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6187</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6187"/>
		<updated>2018-03-14T21:12:41Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wat we&#039;ll do ==&lt;br /&gt;
- Creating awesome dashboards with grafana&lt;br /&gt;
- Querying data from graphite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior knowledge ==&lt;br /&gt;
It helps to have some reasonable computer expertise.&lt;br /&gt;
&lt;br /&gt;
== Costs ==&lt;br /&gt;
This workshop is free! &lt;br /&gt;
&lt;br /&gt;
== I will join! ==&lt;br /&gt;
It could be that there will be some changes, please leave your e-mail so we can notify you if something changes. We will not spam you in any way unless you manually subscribe to our announce or general mailing list at https://list.bitlair.nl.&lt;br /&gt;
Max. 30 participants.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Arjan || ak47@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Your name || your@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6186</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6186"/>
		<updated>2018-03-14T21:12:22Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wat we&#039;ll do ==&lt;br /&gt;
- Creating awesome dashboards with grafana&lt;br /&gt;
- Querying data from graphite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior knowledge ==&lt;br /&gt;
It helps to have some reasonable computer expertise.&lt;br /&gt;
&lt;br /&gt;
== Costs ==&lt;br /&gt;
This workshop is free! &lt;br /&gt;
&lt;br /&gt;
== I will join! ==&lt;br /&gt;
It could be that there will be some changes, please leave your e-mail so we can notify you if something changes. We will not spam you in any way unless you manually subscribe to our announce or general mailing list at https://list.bitlair.nl.&lt;br /&gt;
Max. 30 participants.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Your name || your@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6185</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6185"/>
		<updated>2018-03-14T21:12:04Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wat we&#039;ll do ==&lt;br /&gt;
- Creating awesome dashboards with grafana&lt;br /&gt;
- Querying data from graphite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior knowledge ==&lt;br /&gt;
It helps to have some reasonable computer expertise.&lt;br /&gt;
&lt;br /&gt;
== Costs ==&lt;br /&gt;
This workshop is free! &lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
It could be that there will be some changes, please leave your e-mail so we can notify you if something changes. We will not spam you in any way unless you manually subscribe to our announce or general mailing list at https://list.bitlair.nl.&lt;br /&gt;
Max. 30 participants.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Your name || your@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6184</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6184"/>
		<updated>2018-03-14T20:54:35Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/26 14:00:00 &lt;br /&gt;
|end=2018/05/26 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6183</id>
		<title>Events/2018-04-21 Openingsfeest Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6183"/>
		<updated>2018-03-14T20:46:01Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Openingsfeest Space3.0&lt;br /&gt;
|start=2018/04/21 02:00:00 PM&lt;br /&gt;
|end=2018/04/21 11:59:00 PM&lt;br /&gt;
|location=Bitlair&lt;br /&gt;
|date=2018/04/21&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Openingsfeest voor onze ruimte op de computerweg 20A! Omdat wij een nieuwe ruimte hebben die nodig ingewijd moet worden, geven wij een feestje op 21 april 2018.&lt;br /&gt;
&lt;br /&gt;
Wij bestaan sinds 15 maart 2011, dus omdat wij 7 jaar bestaan is dat extra reden voor een feestje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DJO &amp;amp; Bitlair met vrije toegang voor hackers en geïnteresseerden.&lt;br /&gt;
&lt;br /&gt;
Om &amp;lt;b&amp;gt;13:37&amp;lt;/b&amp;gt; is de officiële opening!&lt;br /&gt;
&lt;br /&gt;
== Nomz! ==&lt;br /&gt;
We organiseren een BBQ welke start rond 19:00. De kosten voor de BBQ zijn &amp;lt;b&amp;gt;10 euro&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Inschrijvingen ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;BBQParticipants&amp;quot;&lt;br /&gt;
! Naam/Nick !! Vlees !! Vega !! Opmerkingen&lt;br /&gt;
{{BBQParticipant|Participant=AK47|Vlees=1}}&lt;br /&gt;
|-&lt;br /&gt;
! Subtotaal || {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|limit=999|format=sum}} ||{{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVega|limit=999|format=sum}} ||&lt;br /&gt;
|-&lt;br /&gt;
! Totaal ||colspan=&amp;quot;2&amp;quot;| {{#ask:[[-Has subobject::{{FULLPAGENAME}}]]|?BBQVlees|?BBQVega|limit=999|format=sum}} || max: 50&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6178</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6178"/>
		<updated>2018-03-14T20:13:01Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/15 14:00:00 &lt;br /&gt;
|end=2018/05/15 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
Creating management-compliant dashboards with Grafana&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6177</id>
		<title>Events/2018-05-26 Workshop Grafana Dashboards</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-26_Workshop_Grafana_Dashboards&amp;diff=6177"/>
		<updated>2018-03-14T20:10:31Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: Created page with &amp;quot;{{Event |name=Creating management-compliant dashboards with Grafana |start=2018/05/15 14:00:00  |end=2018/05/15 18:00:00  |location=Computerweg 20A, Amersfoort }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Creating management-compliant dashboards with Grafana&lt;br /&gt;
|start=2018/05/15 14:00:00 &lt;br /&gt;
|end=2018/05/15 18:00:00 &lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Episch_web_hacken&amp;diff=6176</id>
		<title>Events/2018-04-28 Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Episch_web_hacken&amp;diff=6176"/>
		<updated>2018-03-14T20:05:44Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-04-28 Episch web hacken to Events/2018-04-28 Workshop Episch web hacken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Events/2018-04-28 Workshop Episch web hacken]]&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6175</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6175"/>
		<updated>2018-03-14T20:05:44Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: WilcoBaanHofman moved page Events/2018-04-28 Episch web hacken to Events/2018-04-28 Workshop Episch web hacken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
|start=2018/04/28 14:30:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6171</id>
		<title>Events/2018-04-21 Openingsfeest Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-21_Openingsfeest_Space3.0&amp;diff=6171"/>
		<updated>2018-03-14T19:55:14Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Openingsfeest Space3.0&lt;br /&gt;
|start=2018/04/21 02:00:00 PM&lt;br /&gt;
|end=2018/04/21 11:59:00 PM&lt;br /&gt;
|location=Bitlair&lt;br /&gt;
|date=2017/04/21&lt;br /&gt;
}}&lt;br /&gt;
Placeholder.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6165</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6165"/>
		<updated>2018-03-14T19:35:15Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
|start=2018/04/28 14:30:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Het niveau kan worden aangepast aan de bezoekers :)&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6164</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6164"/>
		<updated>2018-03-14T19:30:18Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Web Hacking workshop&lt;br /&gt;
|date=2018/04/28&lt;br /&gt;
|start=2018/04/28 14:30:00&lt;br /&gt;
|end=2018/04/28 18:00:00&lt;br /&gt;
|location=Computerweg 20A, Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
== Workshop ==&lt;br /&gt;
[[File:Saycyberonemoretime.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
Introductie tot Episch Web Hacken; Gebruikmaken van veelgemaakte fouten in webpagina&#039;s om toegang tot het achterliggende systeem te verkrijgen. In deze workshop worden de technieken uitgelegd van de kunst achter het uitbuiten van deze fouten.&lt;br /&gt;
&lt;br /&gt;
Als er veel nieuwe mensen zijn dan gaan we over alle slides heen, als het niveau hoger moet, dan kan dat altijd ;-)&lt;br /&gt;
&lt;br /&gt;
== Slides ==&lt;br /&gt;
[[File:Webhackingworkshop.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Wat we behandelen ==&lt;br /&gt;
* SQL injection&lt;br /&gt;
* Path Traversal&lt;br /&gt;
* Cross Site Scripting (XSS)&lt;br /&gt;
* Cross Site Request Forgery (CSRF/XSRF)&lt;br /&gt;
&lt;br /&gt;
== Voorkennis ==&lt;br /&gt;
Computervaardigheid is vereist, basis-programmeerkennis helpt enorm.&lt;br /&gt;
&lt;br /&gt;
== Kosten ==&lt;br /&gt;
Deze workshop is gratis, maar ook kleine donaties zijn erg welkom!&lt;br /&gt;
&lt;br /&gt;
==Inschrijvingen==&lt;br /&gt;
Het zou kunnen dat er wijzigingen zijn in de planning. Niet-deelnemers moeten hun e-mailadres even achterlaten, zodat we jullie op de hoogte kunnen houden.&lt;br /&gt;
Maximaal 30 inschrijvingen.&lt;br /&gt;
{| &lt;br /&gt;
| &amp;lt;b&amp;gt;Naam&amp;lt;/b&amp;gt; ||&amp;lt;b&amp;gt;Email&amp;lt;/b&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|Wilco || wilco@bitlair.nl ||&lt;br /&gt;
|-&lt;br /&gt;
|Jouw naam || jouw@email ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6163</id>
		<title>Events/2018-04-28 Workshop Episch web hacken</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-04-28_Workshop_Episch_web_hacken&amp;diff=6163"/>
		<updated>2018-03-14T19:26:52Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: Created page with &amp;quot;{{Event |name=Episch web hacken |start=2018/04/28 00:00:00  |end=2018/04/28 00:00:00  |location=Bitlair, Hoofdruimte }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Episch web hacken&lt;br /&gt;
|start=2018/04/28 00:00:00 &lt;br /&gt;
|end=2018/04/28 00:00:00 &lt;br /&gt;
|location=Bitlair, Hoofdruimte&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Events/2018-05-19_Workshop_showlasers&amp;diff=6162</id>
		<title>Events/2018-05-19 Workshop showlasers</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Events/2018-05-19_Workshop_showlasers&amp;diff=6162"/>
		<updated>2018-03-14T19:15:37Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: Created page with &amp;quot;{{Event |name=Workshop Showlasers |start=2018/05/19 15:00:00  |end=2018/05/19 18:00:00  |location=Bitlair, Hoofdruimte }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|name=Workshop Showlasers&lt;br /&gt;
|start=2018/05/19 15:00:00 &lt;br /&gt;
|end=2018/05/19 18:00:00 &lt;br /&gt;
|location=Bitlair, Hoofdruimte&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Hoofdpagina&amp;diff=6130</id>
		<title>Hoofdpagina</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Hoofdpagina&amp;diff=6130"/>
		<updated>2018-02-19T13:06:09Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Openingstijden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{Template:Hoofdpagina/Banner}}&lt;br /&gt;
== Hackerspace Bitlair ==&lt;br /&gt;
Een hackerspace is een ruimte waar deelnemers aan hun [[projects|eigen of gezamenlijke projecten]] kunnen werken met het [[gereedschap]] van de space.&lt;br /&gt;
Bitlair is de hackerspace van Amersfoort, Leusden, Soest, Utrecht, Baarn, Barneveld, Nijkerk, Harderwijk, Zeist, Bunschoten-Spakenburg, Hoevelaken, Blaricum, Hilversum en de rest van de wereld.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;float:left; width:47%;vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Openingstijden ==&lt;br /&gt;
&lt;br /&gt;
Bezoekers zijn welkom:&lt;br /&gt;
* Iedere zondagmiddag en avond vanaf 14:00&lt;br /&gt;
* Iedere woensdagavond vanaf 19:00&lt;br /&gt;
* Andere tijden wanneer er deelnemers aanwezig zijn.&lt;br /&gt;
** Controleer &amp;lt;!--de [https://koekeloeren.bitlair.nl/ webcams] en!--&amp;gt; het IRC-chatkanaal voor activiteit&lt;br /&gt;
** De [https://keetweej.vanheusden.com/bitlair/openhm.php open-heatmap] bevat de geschiedenis&lt;br /&gt;
** Kijk linksboven op deze pagina bij het Bitlair logo of we open zijn&lt;br /&gt;
&lt;br /&gt;
Openingstijden voor [[Members| deelnemers]]:&lt;br /&gt;
* 24/7&lt;br /&gt;
** Behalve vrijdag 19-22h, zaterdag 9-14h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;width:47%; float:right; vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Hoofdpagina/Tour}}&lt;br /&gt;
{{Hoofdpagina/Projects}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;float:left; width:47%;vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Hoofdpagina/Nieuws}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;width:47%; float:right; vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Contact}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Hoofdpagina&amp;diff=6129</id>
		<title>Hoofdpagina</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Hoofdpagina&amp;diff=6129"/>
		<updated>2018-02-19T13:05:19Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Hackerspace Bitlair */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{Template:Hoofdpagina/Banner}}&lt;br /&gt;
== Hackerspace Bitlair ==&lt;br /&gt;
Een hackerspace is een ruimte waar deelnemers aan hun [[projects|eigen of gezamenlijke projecten]] kunnen werken met het [[gereedschap]] van de space.&lt;br /&gt;
Bitlair is de hackerspace van Amersfoort, Leusden, Soest, Utrecht, Baarn, Barneveld, Nijkerk, Harderwijk, Zeist, Bunschoten-Spakenburg, Hoevelaken, Blaricum, Hilversum en de rest van de wereld.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;float:left; width:47%;vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Openingstijden ==&lt;br /&gt;
&lt;br /&gt;
Bezoekers zijn welkom:&lt;br /&gt;
* Iedere zondagmiddag en avond vanaf 14:00&lt;br /&gt;
* Iedere woensdagavond vanaf 19:00&lt;br /&gt;
* Andere tijden wanneer er deelnemers aanwezig zijn.&lt;br /&gt;
** Check &amp;lt;!--de [https://koekeloeren.bitlair.nl/ webcams] en!--&amp;gt; het IRC-chatkanaal voor activiteit&lt;br /&gt;
** De [https://keetweej.vanheusden.com/bitlair/openhm.php open-heatmap] bevat de geschiedenis&lt;br /&gt;
** Kijk linksboven op deze pagina bij het Bitlair logo of we open zijn&lt;br /&gt;
&lt;br /&gt;
Openingstijden voor [[Members| deelnemers]]:&lt;br /&gt;
* 24/7&lt;br /&gt;
** Behalve vrijdag 19-22h, zaterdag 9-14h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;width:47%; float:right; vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Hoofdpagina/Tour}}&lt;br /&gt;
{{Hoofdpagina/Projects}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;float:left; width:47%;vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Hoofdpagina/Nieuws}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block;width:47%; float:right; vertical-align:top&amp;quot;&amp;gt;&lt;br /&gt;
{{Contact}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Deelnemer_Worden&amp;diff=6114</id>
		<title>Deelnemer Worden</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Deelnemer_Worden&amp;diff=6114"/>
		<updated>2018-02-09T15:13:17Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: /* Contributie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Deelnemer worden bij Bitlair ==&lt;br /&gt;
&lt;br /&gt;
Om deelnemer te worden:&lt;br /&gt;
* Maak € 25,- per maand over (via een periodieke overboeking) op {{IBAN}}.&lt;br /&gt;
* Vul onderstaand formulier in en stuur deze per email naar bestuur[at]bitlair.nl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ingevuld formulier voor inschrijving&lt;br /&gt;
&lt;br /&gt;
Naam:&lt;br /&gt;
&lt;br /&gt;
Email (indien afwijkend):&lt;br /&gt;
&lt;br /&gt;
Telefoonnummer:&lt;br /&gt;
&lt;br /&gt;
Nickname (dit wordt gebruikt voor jouw accountnaam):&lt;br /&gt;
&lt;br /&gt;
Naam bar account (voor snacks, eten en drinken in de space. Indien afwijkend van nickname):&lt;br /&gt;
&lt;br /&gt;
Referentie (hoe heb je Bitlair gevonden?):&lt;br /&gt;
&lt;br /&gt;
Opmerkingen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [[Special:UserLogin|Maak een account aan op deze wiki]]&lt;br /&gt;
** Ga naar [[Form:Member|het deelnemersformulier]]&lt;br /&gt;
** Zet de [[Template:Member|deelnemerstemplate]] op jouw gebruikerpagina&lt;br /&gt;
* Optioneel: schrijf je in op de [https://hackerspaces.nl/hackerspaces-nl/contact/ landelijke hackerspaces mailinglist]&lt;br /&gt;
&lt;br /&gt;
== Contributie ==&lt;br /&gt;
Om de space draaiende te houden zijn we afhankelijk van de contributie van onze&lt;br /&gt;
deelnemers. Indien je vaker gebruik maakt van de space stellen wij het erg op&lt;br /&gt;
prijs als je deelnemer wordt om ons te helpen om onze vaste lasten te betalen.&lt;br /&gt;
* De maandelijkse bijdrage is € 25,- en moet voor de 27ste van de maand worden overgemaakt.&lt;br /&gt;
* Als dit meer is dan jij je kan veroorloven, overleg met [[Bestuur|het bestuur]].&lt;br /&gt;
&lt;br /&gt;
== Jonger dan 18 jaar? ==&lt;br /&gt;
Indien je jonger bent dan 18 jaar dient er een schriftelijke overeenkomst getekend te worden door jouw ouders of voogd.&lt;br /&gt;
Neem hiervoor contact op met [[Bestuur|het bestuur]].&lt;br /&gt;
&lt;br /&gt;
== Goodies ==&lt;br /&gt;
* Een iButton (€ 15,- eenmalig) bruikbaar voor:&lt;br /&gt;
** 50% korting op gebruik van de lasersnijder&lt;br /&gt;
** Na 3 maanden deelnemerschap: toegang tot de space&lt;br /&gt;
* Spacenet (een soort van eduroam) account voor de federated wifi bij Bitlair, andere aangesloten hackerspaces en evenementen&lt;br /&gt;
* Account op onze shell VM voor bijvoorbeeld IRSSI&lt;br /&gt;
* &amp;lt;nickname&amp;gt;@bitlair.nl forwards naar een email adres naar keuze&lt;br /&gt;
&lt;br /&gt;
== Algemene voorwaarden ==&lt;br /&gt;
* [[Huishoudelijk Reglement]]&lt;br /&gt;
* Alle deelnemersvormen zijn persoonsgebonden&lt;br /&gt;
* De sleutel van de deelnemer wordt uitgegeven na 3 maanden deelnemerschap. De kosten voor de sleutel zijn 15 euro. De sleutel blijft eigendom van de deelnemer&lt;br /&gt;
* Je mag ook voor iemand anders het deelnemerschap betalen en daarmee iemand anders sponsoren, deze persoon wordt dan volwaardig deelnemer&lt;br /&gt;
* De looptijd van het deelnemerschap is minimaal 1 jaar&lt;br /&gt;
* Het deelnemerschap gaat in op de eerste van de volgende maand, tenzij je anders aangeeft.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Workshops&amp;diff=5968</id>
		<title>Workshops</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Workshops&amp;diff=5968"/>
		<updated>2018-01-21T17:39:02Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
= Gepland =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Vraag en Aanbod =&lt;br /&gt;
Wil je graag een workshop geven maar zoek je een onderwerp?&lt;br /&gt;
&lt;br /&gt;
Heb je ideeën voor workshops en zoek je iemand die hem zou willen geven?&lt;br /&gt;
&lt;br /&gt;
* 3D printing (RepRap World?) (+1)&lt;br /&gt;
* 3D printer software&lt;br /&gt;
* Fibre splicing (+2)&lt;br /&gt;
* Basic/home WiFi (+1)&lt;br /&gt;
* Advanced WiFi (+3)&lt;br /&gt;
* Routering met dynamische protocollen (OSPF, IS-IS, BGPv4)&lt;br /&gt;
* Episch hacken (+3)&lt;br /&gt;
* Domotica (+3)&lt;br /&gt;
* Pen-testing (+2) - Wat voor pen? Een regenboogpen&lt;br /&gt;
* Lasers (+4)&lt;br /&gt;
* Chemie (Timothy?) (+1)&lt;br /&gt;
* Drones (Michel Rietveld?)&lt;br /&gt;
* $programmeertaal (polyfloyd)&lt;br /&gt;
* 2D (en misschien 3D?) raytracing met GLSL of SPIR-V (polyfloyd)&lt;br /&gt;
* Website scrapers maken (polyfloyd)(+2)&lt;br /&gt;
* Time-series data, metrics, dashboarding, etc. (Grafana/Graphite/etc) (door AK47) (+2)&lt;br /&gt;
* Robot arm maken (+1) (bv http://www.thingiverse.com/thing:2433)&lt;br /&gt;
* fusion 360 leren gebruiken (+5)&lt;br /&gt;
* Git gebruiken en begrijpen (polyfloyd)&lt;br /&gt;
* Leren naaien door Bitlair kussens te maken :-)&lt;br /&gt;
* 64x64x6 LED matrix kubus (a la https://www.flickr.com/photos/wwward0/13023336793/lightbox)&lt;br /&gt;
&lt;br /&gt;
= Archief =&lt;br /&gt;
== 2016 ==&lt;br /&gt;
=== Arduino for beginners ===&lt;br /&gt;
 [https://bitlair.nl/Projects/Arduino_Workshop_for_Beginners &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039;&lt;br /&gt;
** 4 Februari 2017, start 14:00&lt;br /&gt;
** 1 juli 2017, start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Kartoffel&lt;br /&gt;
 [https://bitlair.nl/Projects/word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Na een ontzettend succesvolle [http://www.randomdata.nl/wiki/index.php/Workshops#Word_clock_workshop.2C_December_2nd.2C_2016 workshop bij randomdata], gaan we nu ook bij bitlair onze eigen word clocks bouwen. Deze klokken verbinden via WiFi om automatisch de tijd binnen te halen. Daarnaast zijn ze erg eenvoudig te herprogrammeren, en staat de [https://github.com/niekproductions/word-clock code] online.&lt;br /&gt;
&lt;br /&gt;
=== Naaimachine ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 14 januari 2017&lt;br /&gt;
** zaterdag 18 maart&lt;br /&gt;
** zaterdag 1 april (nee geen grapje)&lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
** zaterdag 27 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Nicoline&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen&lt;br /&gt;
 [https://bitlair.nl/Events/Naaimachine_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Arduino voor beginners ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;:&lt;br /&gt;
**Donderdag 30 maart 2017 19:30  Arduino voor beginners les 1 &lt;br /&gt;
**Donderdag  6 april 2017 19:30  Arduino voor beginners les 2 &lt;br /&gt;
**Donderdag 13 april 2017 19:30  Arduino voor beginners les 3&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: MRO/Jeroen/Rogue&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: €25 voor materiaal, donaties welkom!&lt;br /&gt;
[https://bitlair.nl/Events/ArduinoWorkshop201703 &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
=== Reverse Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 22 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/ReverseEngineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 29 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/WebHacking_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/IPv6_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Social Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 10 juni&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Ijskimo&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/2017-06-10_Social_Engineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 1 Juli start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Jeroen/MRO&lt;br /&gt;
 [https://bitlair.nl/Projects/herhaling_word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Herhaling van de woordklokworkshop van februari wegens grote belangstelling&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 4 Juli start 19:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Gratis&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Rust Utrecht&lt;br /&gt;
 [https://bitlair.nl/Events/2017-07-04_Rust_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Bitlair is gastheer voor de workshop van Rust Utrecht. Rust is een nieuwe programmeertaal ontwikkeld door medewerkers van Mozilla en vergelijkbaar met C en C++.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Workshops&amp;diff=5967</id>
		<title>Workshops</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Workshops&amp;diff=5967"/>
		<updated>2018-01-21T17:37:18Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
= Gepland =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Vraag en Aanbod =&lt;br /&gt;
Wil je graag een workshop geven maar zoek je een onderwerp?&lt;br /&gt;
&lt;br /&gt;
Heb je ideeën voor workshops en zoek je iemand die hem zou willen geven?&lt;br /&gt;
&lt;br /&gt;
* 3D printing (RepRap World?) (+1)&lt;br /&gt;
* 3D printer software&lt;br /&gt;
* Fibre splicing (+2)&lt;br /&gt;
* Basic/home WiFi (+1)&lt;br /&gt;
* Advanced WiFi (+3)&lt;br /&gt;
* Routering met dynamische protocollen (OSPF, IS-IS, BGPv4)&lt;br /&gt;
* Episch hacken (+3)&lt;br /&gt;
* Domotica (+3)&lt;br /&gt;
* Pen-testing (+2) - Wat voor pen? Een regenboogpen&lt;br /&gt;
* Lasers (+4)&lt;br /&gt;
* Chemie (Timothy?) (+1)&lt;br /&gt;
* Drones (Michel Rietveld?)&lt;br /&gt;
* $programmeertaal (polyfloyd)&lt;br /&gt;
* 2D (en misschien 3D?) raytracing met GLSL of SPIR-V (polyfloyd)&lt;br /&gt;
* Website scrapers maken (polyfloyd)(+2)&lt;br /&gt;
* Time-series data, metrics, dashboarding, etc. (Grafana/Graphite/etc) (door AK47) (+2)&lt;br /&gt;
* Robot arm maken (+1) (bv http://www.thingiverse.com/thing:2433)&lt;br /&gt;
* fusion 360 leren gebruiken (+5)&lt;br /&gt;
* Git gebruiken en begrijpen (polyfloyd)&lt;br /&gt;
* Leren naaien door Bitlair kussens te maken :-)&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
= Archief =&lt;br /&gt;
== 2016 ==&lt;br /&gt;
=== Arduino for beginners ===&lt;br /&gt;
 [https://bitlair.nl/Projects/Arduino_Workshop_for_Beginners &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
== 2017 ==&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039;&lt;br /&gt;
** 4 Februari 2017, start 14:00&lt;br /&gt;
** 1 juli 2017, start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Kartoffel&lt;br /&gt;
 [https://bitlair.nl/Projects/word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Na een ontzettend succesvolle [http://www.randomdata.nl/wiki/index.php/Workshops#Word_clock_workshop.2C_December_2nd.2C_2016 workshop bij randomdata], gaan we nu ook bij bitlair onze eigen word clocks bouwen. Deze klokken verbinden via WiFi om automatisch de tijd binnen te halen. Daarnaast zijn ze erg eenvoudig te herprogrammeren, en staat de [https://github.com/niekproductions/word-clock code] online.&lt;br /&gt;
&lt;br /&gt;
=== Naaimachine ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 14 januari 2017&lt;br /&gt;
** zaterdag 18 maart&lt;br /&gt;
** zaterdag 1 april (nee geen grapje)&lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
** zaterdag 27 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Nicoline&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen&lt;br /&gt;
 [https://bitlair.nl/Events/Naaimachine_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Arduino voor beginners ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;:&lt;br /&gt;
**Donderdag 30 maart 2017 19:30  Arduino voor beginners les 1 &lt;br /&gt;
**Donderdag  6 april 2017 19:30  Arduino voor beginners les 2 &lt;br /&gt;
**Donderdag 13 april 2017 19:30  Arduino voor beginners les 3&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: MRO/Jeroen/Rogue&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: €25 voor materiaal, donaties welkom!&lt;br /&gt;
[https://bitlair.nl/Events/ArduinoWorkshop201703 &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
=== Reverse Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 22 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/ReverseEngineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Web hacking ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 29 april&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/WebHacking_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== IPv6 ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 6 mei&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Wilco&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/IPv6_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Social Engineering ===&lt;br /&gt;
*&#039;&#039;&#039;Wanneer&#039;&#039;&#039;: &lt;br /&gt;
** zaterdag 10 juni&lt;br /&gt;
* &#039;&#039;&#039;Waar&#039;&#039;&#039;: [https://bitlair.nl/Contact#Locatie the space]&lt;br /&gt;
* &#039;&#039;&#039;Wie&#039;&#039;&#039;: Ijskimo&lt;br /&gt;
* &#039;&#039;&#039;Kosten&#039;&#039;&#039;: Geen, donaties welkom!&lt;br /&gt;
(Opgeven in de detailpagina)&lt;br /&gt;
 [https://bitlair.nl/Events/2017-06-10_Social_Engineering_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
&lt;br /&gt;
=== Woordklok ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 1 Juli start 14:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Om en nabij de 40 euro&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Jeroen/MRO&lt;br /&gt;
 [https://bitlair.nl/Projects/herhaling_word_clock_workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Herhaling van de woordklokworkshop van februari wegens grote belangstelling&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* &#039;&#039;&#039;Wanneer:&#039;&#039;&#039; 4 Juli start 19:00&lt;br /&gt;
* &#039;&#039;&#039;Waar:&#039;&#039;&#039; [https://goo.gl/maps/RtH7CqUNCiz De space]&lt;br /&gt;
* &#039;&#039;&#039;Kosten:&#039;&#039;&#039; Gratis&lt;br /&gt;
* &#039;&#039;&#039;Wie:&#039;&#039;&#039; Rust Utrecht&lt;br /&gt;
 [https://bitlair.nl/Events/2017-07-04_Rust_Workshop &#039;&#039;&#039;Details&#039;&#039;&#039;]&lt;br /&gt;
Bitlair is gastheer voor de workshop van Rust Utrecht. Rust is een nieuwe programmeertaal ontwikkeld door medewerkers van Mozilla en vergelijkbaar met C en C++.&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Space3.0&amp;diff=5698</id>
		<title>Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Space3.0&amp;diff=5698"/>
		<updated>2017-10-17T11:25:31Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|name=Space 3.0 &lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
|start=2017/10/16&lt;br /&gt;
|URL=https://bitlair.nl&lt;br /&gt;
|contact=AK47, Polyfloyd, Maeddoc, you?!&lt;br /&gt;
|info=Space 3.0 Options&lt;br /&gt;
|status=Alpha&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Zie ook [[Projects/Verhuizen]]&lt;br /&gt;
Nothing has been decided yet, but this is one of 5 options.. &lt;br /&gt;
&lt;br /&gt;
==Financieel==&lt;br /&gt;
Vanuit bestuur DJO &amp;amp; Bitlair zijn we graag “in control” over de benodigde uitgaven voor de nieuwe space. Hiervoor hebben we een budget opgesteld en we monitoren hoeveel geld er nog over is binnen de diverse budgetposten.&lt;br /&gt;
 &lt;br /&gt;
We vragen jullie het volgende: wil je iets gaan kopen voor de nieuwe space overleg het dan eerst even met een bestuurslid. Bij voorkeur met Jeroen of Wilco (penningmeester van DJO en resp. Bitlair). Bij afwezigheid graag met een ander bestuurslid opnemen.&lt;br /&gt;
&lt;br /&gt;
== Activiteiten &amp;amp; afhankelijkheden ==&lt;br /&gt;
TBA&lt;br /&gt;
&lt;br /&gt;
== Foto&#039;s ==&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
	<entry>
		<id>https://bitlair.nl/index.php?title=Space3.0&amp;diff=5697</id>
		<title>Space3.0</title>
		<link rel="alternate" type="text/html" href="https://bitlair.nl/index.php?title=Space3.0&amp;diff=5697"/>
		<updated>2017-10-17T11:24:50Z</updated>

		<summary type="html">&lt;p&gt;WilcoBaanHofman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|name=Space 3.0 &lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
|start=2017/10/16&lt;br /&gt;
|URL=https://bitlair.nl&lt;br /&gt;
|contact=AK47, Polyfloyd, Maeddoc, you?!&lt;br /&gt;
|info=Space 3.0 Options&lt;br /&gt;
|status=Alpha&lt;br /&gt;
|Picture=computerweg-20a.jpg&lt;br /&gt;
}}&lt;br /&gt;
Zie ook [[Projects/Verhuizen]]&lt;br /&gt;
Nothing has been decided yet, but this is one of 5 options.. &lt;br /&gt;
&lt;br /&gt;
==Financieel==&lt;br /&gt;
Vanuit bestuur DJO &amp;amp; Bitlair zijn we graag “in control” over de benodigde uitgaven voor de nieuwe space. Hiervoor hebben we een budget opgesteld en we monitoren hoeveel geld er nog over is binnen de diverse budgetposten.&lt;br /&gt;
 &lt;br /&gt;
We vragen jullie het volgende: wil je iets gaan kopen voor de nieuwe space overleg het dan eerst even met een bestuurslid. Bij voorkeur met Jeroen of Wilco (penningmeester van DJO en resp. Bitlair). Bij afwezigheid graag met een ander bestuurslid opnemen.&lt;br /&gt;
&lt;br /&gt;
== Activiteiten &amp;amp; afhankelijkheden ==&lt;br /&gt;
TBA&lt;br /&gt;
&lt;br /&gt;
== Foto&#039;s ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:plattegrond-space3.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>WilcoBaanHofman</name></author>
	</entry>
</feed>