Inhaltsverzeichnis

!!! ACHTUNG - evtl. veraltet - ACHTUNG !!!

Diese Seite wurde zuletzt am 9. Juli 2014 um 08:53 Uhr geändert.

Grundlage für dieses kleine HowTo ist ein (v)Server mit Debian GNU/Linux „Squeeze“.

Wem die ganzen Abschnitte „händisch“ in die Konsole zu „tippen“ (dazu zähle ich auch einfach mal das „mit linker Maustaste markieren und mit mittlerer Maustaste einfügen), der kann sich auch alles als deletantisches Skript (ftp://ftp.bluemetaljackets.de/qmail/netqmail_with_qmqp.sh enthält alles bis einschließlich „optional: Client (mutt)“) downloaden, ausführbar machen und „starten“ (… dann ist das hier halt die Dokumentation dazu).

Debian-Pakete installieren

Distribution

 aptitude install daemontools daemontools-run ucspi-tcp build-essential

(ggf. sollte hier bereits ein alter MTA deinstalliert werden, z. B. exim4 und sendmail!)

eigene

 cd /usr/local/src
 wget ftp://ftp.bluemetaljackets.de/qmail/qmail-dummy_1.0_all.de
 dpkg --purge --force-depends exim4 exim4-base exim4-config exim4-daemon-light
 dpkg --install qmail-dummy_1.0_all.deb

(System-) Gruppen und Benutzer anlegen

 addgroup --system nofiles
 adduser --system --ingroup nofiles --home /var/qmail/alias --no-create-home alias
 adduser --system --ingroup nofiles --home /var/qmail --no-create-home qmaild
 adduser --system --ingroup nofiles --home /var/qmail --no-create-home qmaill
 adduser --system --ingroup nofiles --home /var/qmail --no-create-home qmailp
 addgroup --system qmail
 adduser --system --ingroup qmail --home /var/qmail --no-create-home qmailq
 adduser --system --ingroup qmail --home /var/qmail --no-create-home qmailr
 adduser --system --ingroup qmail --home /var/qmail --no-create-home qmails
 adduser postmaster

(da qmail-getpw den Benutzer mit der UID „0“ ignoriert, ist ein „echter“ lokaler Benutzer für den Empfang von E-Mails von Nöten!)

Verzeichnisse erstellen

 mkdir /var/qmail
 mkdir /etc/qmail
 ln -s /etc/qmail /var/qmail/control
 mkdir -p /var/log/qmail/{qmqpd,smtpd}
 chown -R qmaill.nofiles /var/log/qmail
 ln -s /var/log/qmail /var/qmail/log

kompilieren

 cd /usr/local/src
 wget http://qmail.org/netqmail-1.06.tar.gz
 tar xzf netqmail-1.06.tar.gz
 cd netqmail-1.06
 make
 make setup check
 ln -s /var/qmail/bin/sendmail /usr/lib/
 ln -s /var/qmail/bin/sendmail /usr/sbin/

konfigurieren

 ./config

(sollte der DNS-Server den MAIL-vServer nicht kennen, schafft “./config-fast <FQDN>„ abhilfe!)

/etc/tcp.smtp

 cat <<EOF > /etc/tcp.smtp
 127.:allow,RELAYCLIENT=""
>deny
 EOF
 chmod 644 /etc/tcp.smtp

/etc/tcp.qmqp

 cat <<EOF > /etc/tcp.qmqp
 10.:allow
>deny
 EOF
 chmod 644 /etc/tcp.qmqp

/var/qmail/bin/qmailctl

 cat <<EOF > /var/qmail/bin/qmailctl
 #!/bin/sh
 PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
 export PATH
 QMAILDUID=\$( id -u qmaild )
 NOFILESGID=\$( id -g qmaild )
 case "\$1" in
   start)
     echo "Starting qmail"
     if svok /etc/service/qmail-send ; then
       svc -u /etc/service/qmail-send /etc/service/qmail-send/log
     else
       echo "qmail-send supervise not running"
     fi
     if svok /etc/service/qmail-smtpd ; then
       svc -u /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
     else
       echo "qmail-smtpd supervise not running"
     fi
     if svok /etc/service/qmail-qmqpd ; then
       svc -u /etc/service/qmail-qmqpd /etc/service/qmail-qmqpd/log
     else
       echo "qmqpd supervise not running"
     fi
     if [[|-d /var/lock/subsys ]]; then
       touch /var/lock/subsys/qmail
     fi
     ;;
   stop)
     echo "Stopping qmail..."
     echo "  qmail-smtpd"
     svc -d /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
     echo "  qmail-qmqpd"
     svc -d /etc/service/qmail-qmqpd /etc/service/qmail-qmqpd/log
     echo "  qmail-send"
     svc -d /etc/service/qmail-send /etc/service/qmail-send/log
     if [[|-f /var/lock/subsys/qmail ]]; then
       rm /var/lock/subsys/qmail
     fi
     ;;
   stat)
     svstat /etc/service/qmail-send
     svstat /etc/service/qmail-send/log
     svstat /etc/service/qmail-smtpd
     svstat /etc/service/qmail-smtpd/log
     svstat /etc/service/qmail-qmqpd
     svstat /etc/service/qmail-qmqpd/log
     qmail-qstat
     ;;
   doqueue|alrm|flush)
     echo "Flushing timeout table and sending ALRM signal to qmail-send."
     /var/qmail/bin/qmail-tcpok
     svc -a /etc/service/qmail-send
     ;;
   queue)
     qmail-qstat
     qmail-qread
     ;;
   reload|hup)
     echo "Sending HUP signal to qmail-send."
     svc -h /etc/service/qmail-send
     ;;
   pause)
     echo "Pausing qmail-send"
     svc -p /etc/service/qmail-send
     echo "Pausing qmail-smtpd"
     svc -p /etc/service/qmail-smtpd
     echo "Pausing qmail-qmqpd"
     svc -p /etc/service/qmail-qmqpd
     ;;
   cont)
     echo "Continuing qmail-send"
     svc -c /etc/service/qmail-send
     echo "Continuing qmail-smtpd"
     svc -c /etc/service/qmail-smtpd
     echo "Continuing qmail-qmqpd"
     svc -c /etc/service/qmail-qmqpd
     ;;
   restart)
     echo "Restarting qmail:"
     echo "* Stopping qmail-smtpd."
     svc -d /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
     echo "* Stopping qmail-qmqpd."
     svc -d /etc/service/qmail-qmqpd /etc/service/qmail-qmqpd/log
     echo "* Sending qmail-send SIGTERM and restarting."
     svc -t /etc/service/qmail-send /etc/service/qmail-send/log
     echo "* Restarting qmail-smtpd."
     svc -u /etc/service/qmail-smtpd /etc/service/qmail-smtpd/log
     echo "* Restarting qmail-qmqpd."
     svc -u /etc/service/qmail-qmqpd /etc/service/qmail-qmqpd/log
     ;;
   cdb)
     tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
     chmod 644 /etc/tcp.smtp.cdb
     tcprules /etc/tcp.qmqp.cdb /etc/tcp.qmqp.tmp < /etc/tcp.qmqp
     chmod 644 /etc/tcp.qmqp.cdb
     echo "Reloaded /etc/tcp.smtp and /etc/tcp.qmqp."
     ;;
   help)
     cat <<HELP
     stop -- stops mail service (smtp connections refused, nothing goes out)
     start -- starts mail service (smtp connection accepted, mail can go out)
     pause -- temporarily stops mail service (connections accepted, nothing leaves)
     cont -- continues paused mail service
     stat -- displays status of mail service
     cdb -- rebuild the tcpserver cdb file for smtp
     restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
     doqueue -- schedules queued messages for immediate delivery
     reload -- sends qmail-send HUP, rereading locals and virtualdomains
     queue -- shows status of queue
     alrm -- same as doqueue
     flush -- same as doqueue
     hup -- same as reload 
 HELP
     ;;
   *)
     echo "Usage: \$0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
     exit 1
     ;;
 esac
 exit 0
 EOF
 chmod 755 /var/qmail/bin/qmailctl
 ln -s /var/qmail/bin/qmailctl /usr/sbin/

/var/qmail/control/concurrencyincoming

 echo "20" > /var/qmail/control/concurrencyincoming
 chmod 644 /var/qmail/control/concurrencyincoming

(Könnte man analog zu smtpd auch für qmqpd machen, aber dort gefallen mir die „voreingestellten“ 40 eigentlich ganz gut!)

/var/qmail/control/defaultdelivery

 echo "./Maildir/" > /var/qmail/control/defaultdelivery
 chmod 644 /var/qmail/control/defaultdelivery

/var/qmail/rc

 cat <<EOF > /var/qmail/rc
 #!/bin/sh
 exec env - PATH="/var/qmail/bin:\$PATH" \\
 qmail-start "\$( cat /var/qmail/control/defaultdelivery )"
 EOF
 chmod 755 /var/qmail/rc

(dash versteht leider kein $( < /var/qmail/control/defaultdelivery ) mehr!)

/var/qmail/supervise/qmail-qmqpd/run

 mkdir -p /var/qmail/supervise/qmail-qmqpd/log
 cat <<EOF > /var/qmail/supervise/qmail-qmqpd/run
 #!/bin/sh
 QMAILDUID=\$( id -u qmaild )
 NOFILESGID=\$( id -g qmaild )
 exec /usr/bin/softlimit -m 4000000 \\
 /usr/bin/tcpserver -v -x /etc/tcp.qmqp.cdb \\
 -u "\$QMAILDUID" -g "\$NOFILESGID" 0 628 /var/qmail/bin/qmail-qmqpd 2>&1
 EOF
 chmod 755 /var/qmail/supervise/qmail-qmqpd/run

/var/qmail/supervise/qmail-qmqpd/log/ru

 cat <<EOF > /var/qmail/supervise/qmail-qmqpd/log/run
 #!/bin/sh
 exec /usr/bin/setuidgid qmaill /usr/bin/multilog t /var/log/qmail/qmqpd
 EOF
 chmod 755 /var/qmail/supervise/qmail-qmqpd/log/run

/var/qmail/supervise/qmail-send/run

 mkdir -p /var/qmail/supervise/qmail-send/log
 cat <<EOF > /var/qmail/supervise/qmail-send/run
 #!/bin/sh
 exec /var/qmail/rc
 EOF
 chmod 755 /var/qmail/supervise/qmail-send/run

/var/qmail/supervise/qmail-send/log/run

 cat <<EOF > /var/qmail/supervise/qmail-send/log/run
 #!/bin/sh
 exec /usr/bin/setuidgid qmaill /usr/bin/multilog t /var/log/qmail
 EOF
 chmod 755 /var/qmail/supervise/qmail-send/log/run

/var/qmail/supervise/qmail-smtpd/run

 mkdir -p /var/qmail/supervise/qmail-smtpd/log
 cat <<EOF > /var/qmail/supervise/qmail-smtpd/run
 #!/bin/sh
 QMAILDUID=\$( id -u qmaild )
 NOFILESGID=\$( id -g qmaild )
 MAXSMTPD=\$( cat /var/qmail/control/concurrencyincoming )
 LOCAL=\$( head -1 /var/qmail/control/me )
 if [[|-z "\$QMAILDUID" -o -z "\$NOFILESGID" -o -z "\$MAXSMTPD" -o -z "\$LOCAL" ]]; then
   echo QMAILDUID, NOFILESGID, MAXSMTPD or LOCAL is unset in
   echo /var/qmail/supervise/qmail-smtpd/run
   exit 1
 fi
 if [[|! -f /var/qmail/control/rcpthosts ]]; then
   echo "No /var/qmail/control/rcpthosts!"
   echo "Refusing to start SMTP listener because it'll create an open relay."
   exit 1
 fi
 exec /usr/bin/softlimit -m 4000000 \\
 /usr/bin/tcpserver -v -R -l "\$LOCAL" -x /etc/tcp.smtp.cdb -c "\$MAXSMTPD" \\
 -u "\$QMAILDUID" -g "\$NOFILESGID" 0 25 \\
 /var/qmail/bin/qmail-smtpd 2>&1
 EOF
 chmod 755 /var/qmail/supervise/qmail-smtpd/run

/var/qmail/supervise/qmail-smtpd/log/run

 cat <<EOF > /var/qmail/supervise/qmail-smtpd/log/run
 #!/bin/sh
 exec /usr/bin/setuidgid qmaill /usr/bin/multilog t /var/log/qmail/smtpd
 EOF
 chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Aliase

 echo postmaster > /var/qmail/alias/.qmail-root
 ln -s .qmail-root /var/qmail/alias/.qmail-mailer-daemon
 ln -s .qmail-root /var/qmail/alias/.qmail-abuse
 chmod 644 /var/qmail/alias/.qmail-root

Maildir

 su - postmaster -c /var/qmail/bin/maildirmake ~/Maildir

(sollte jeder Benutzer vor dem ersten Maileingang mit seinen Rechten ausführen!)

(automatisch) starten

 ln -s /var/qmail/supervise/qmail-qmqpd /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /etc/service/

optional: Client (mutt)

 aptitude install mutt
 cat <<EOF >> /etc/Muttrc
 set mbox_type=Maildir
 set folder="~/Maildir"
 set mbox="~/Maildir"
 set record="+.Sent"
 set postponed="+.Drafts"
 set spoolfile="~/Maildir"
 EOF

Jetzt fehlen nur noch die anderen (v)Server:

andere (v)Server

/var/qmail/control/locals auf dem Mail-(v)Server

Hier müssen alle (v)Server mit ihrem FQDM dazugetragen (einer/Zeile) werden, die den qmail-qmqpd-Dienst nutzen sollen, z. B.:

 <DOMAIN>
 mail.<DOMAIN>
 **dns1.**<DOMAIN>
 **dns2.**<DOMAIN>
 **db.**<DOMAIN>
 **http.**<DOMAIN>
 [[...]]

platzhalter

Konfiguration neu laden

 qmailctl reload

die anderen (v)Server

nullmailer

Mittlerweile favorisiere ich „nullmailer“ vor mini-qmail, weil

  1. er als Debian-Paket verfügbar ist (Faulheit siegt)
  2. er andere MTAs ersetzt (uns somit das selbstgebaute qmail-dummy-Paket dort überflüssig ist)
  3. er eine eigene Queue hat (falls der Mail-(v)Server mal offline sein sollte)

… und so wird er installiert:

 aptitude install nullmailer mailutils

Test

im (v)Server

 hostname -f | mail postmaster

im Mail-(v)Server

… dann sollte eine E-Mail ohne Betreff und Co. mit dem FQDN des (v)Servers im Mail-(v)Server eintrudeln, was man auf dem Mail-(v)Server nun wie folgt überprüfen kann:

 su - postmaster -c mutt