qmail-Install

Warnung
Diese Informationen sind veraltet und ich das hier beschriebene Verfahren wird unter Umständen nicht funktionieren!

Allgemeines
Diese Anleitung Beschreibt die Installation von qmail mit folgenden Komponenten:

  • vpopmail 5.4.3
  • smtp auth 0.4.3
  • chkusr
  • tcpserver

Wichtig
Ich weiß das man die Installation so schnell wie möglich hinter sich bringen will, um dann das System testen zu können, aber ich empfehle dringend, die Anleitung erst einmal durch zu lesen. Nur wenn man sich sicher sein kann, alles verstanden zu haben, wird die Installation schnell und ohne viele Fehler über die Bühne gehen.

Letztes Update: 22.04.2004

Vorwort
qmail ist ein effektiver, schneller und sicherer Mail-Server. Viele Tools und Patches erweitern qmail mit dutzenden Funktionen.

Ein besonderes merkmal von qmail ist, das er (er, der Mail-Server) modular aufgebaut ist. Bei den meisten Anwendungen die zu qmail gehören, lassen sich als parameter die Pfade zu anderen Programmen übergeben, die die eigentlichen Aufgaben Erledigen. Bei dieser Installation kommt das besonders durch die Nutzung von vpopmail zu gunsten. Dies bedeutet aber auch, das qmail selbst nicht auf dem Netzwerk lauscht (was nicht unbedingt unüblich ist). Aus diesem Grunde muss man eine andere Anwendung dazu bringen, für qmail auf dem Netzwerk zu lauschen. Hier gibt es mehrere Wege. Ein einfacher, jedoch selten genutzer Weg ist über xinetd.

Einer der beliebtesten Wege ist über den tcpserver (ucspi). In vielen Fällen wird das ganze noch mit den daemontools kombiniert. daemontools ist ein Programm, das Dienste startet, stoppt und überwacht. Falls einer der überwachten Dienste nicht mehr läuft, startet daemontools diesen automatisch neu. Auf dieses Tool verzichten wir hier jedoch.

Genug der schlauen Worte, gehen wir ans Werk!

Dateien kopieren
Als erstes holen wir uns die benötigten Dateien:

# cd /usr/src

# mkdir tarballs

# cd tarballs

# wget cr.yp.to/software/qmail-1.03.tar.gz

# wget cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz

# wget switch.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.3.tar.gz

# wget www.funnydingo.de/projects/qmail-install/rc.txt

# cd ..

# mkdir patches

# cd patches

# wget www.interazioni.it/qmail/easy-way-1.0.patch

# wget tyskyshop.com/patches/qmail-1.03.errno.patch

# wget www.fehcom.de/qmail/auth/qmail-smtpd-auth-043_tgz.bin

Hier nochmal die URL’s als Links.

Installation vom tcpserver
Der tcpserver ist ein kleines Programm das auf einem angegebenem Port lauscht und bei eingehenden Verbindungen ein definiertes Programm startet. Wir nutzen den tcpserver um auf Port 25 und 110 zu lauschen. Dieses programm brauchen wir, weil qmail selbst nicht auf den Netzwerkports lauscht, sondern nur daten verarbeitet, die in die entsprechenden Pprogramme gepiped werden.

# cd ..

# cp tarballs/ucspi-tcp-0.88.tar.gz ./

# gzip -d ucspi-tcp-0.88.tar.gz

# tar -xvf ucspi-tcp-0.88.tar

# cd ucspi-tcp-0.88

Nun müssen wir noch eine Kleinigkeit an den Sourcen ändern! Öffne mit einem beliebigen Editor die Datei error.h und ersetzte die Zeile

extern int errno;

mit

#include <errno.h>

Nun können wir den tcpserver kompilieren und installieren.

# make

# make setup check

So, der tcpserver ist nun installiert.

Installation von vpopmail
Wir machen weiter mit vpopmail. In den meisten Anleitungen zu qmail wird vpopmail nach qmail installiert. Wir installieren vpopmail aber vor qmail, da ein Patch verschiedene Include-Dateien von vpopmail benötigt. In der fünften Zeile wird das Home-Directory vom user vpopmail gesetzt. Solltest du vpopmail nicht nach /var/qamil/vpopmail installiert haben wollen (die vpopmail Installations-Routine nutzt diesen Pfad als Installationsverzeichnis), so musst du hier den Pfad ändern. Natürlich gilt das dann auch für alle anderen Pfade zu vpopmail. Ich empfehle den angegebenen Pfade bei zu behalten.

# cd ..

# mkdir /var/qmail

# mkdir /var/qmail/vpopmail

# groupadd vchkpw

# useradd -g vchkpw -d /var/qmail/vpopmail vpopmail

# cp tarballs/vpopmail-5.4.3.tar.gz

# gzip -d vpopmail-5.4.3.tar.gz

# tar -xvf vpopmail-5.4.3.tar

# cd vpopmail-5.4.3

# ./configure

# make

# make install-strip

# chown root.root /var/qmail/vpopmail/bin/vchkpw

# chmod 4755 /var/qmail/vpopmail/bin/vchkpw

vpopmail ist nun auch installiert. Gehen wir nun über zu qmail!

Installation von qmail
Als erstes legen wir die User für qmail an und installieren den smtp-auth- und errno-Patch. Der smtp-auth-Patch ermöglicht es, das ein User sich zum versenden von Emails, die nicht auf dem Server verwaltet werden, authentifizieren muss. Das beugt sehr effektiv Relaying vor. Der errno-Patch behebt ein paar kleine Fehler in den Source-Dateien, die einen Fehler beim kompilieren hervorrufen.

# cd ..

# groupadd nofiles

# useradd -g nofiles -d /var/qmail/alias alias

# useradd -g nofiles -d /var/qmail qmaild

# useradd -g nofiles -d /var/qmail qmaill

# useradd -g nofiles -d /var/qmail qmailp

# groupadd qmail

# useradd -g qmail -d /var/qmail qmailq

# useradd -g qmail -d /var/qmail qmailr

# useradd -g qmail -d /var/qmail qmails

# cp tarballs/qmail-1.03.tar.gz ./

# gzip -d qmail-1.03.tar.gz

# tar -xvf qmail-1.03.tar

# cd qmail-1.03

# cp ../patches/qmail-smtpd-auth-043_tgz.bin ./

# mv qmail-smtpd-auth-043_tgz.bin qmail-smtpd-auth-043.tar.gz

# gzip -d qmail-smtpd-auth-043.tar.gz

# tar -xvf qmail-smtpd-auth-043.tar

# rm qmail-smtpd-auth-043.tar

# ./install_auth.sh

# patch < ../patches/qmail-1.03.errno.patch

Nun müssen wir noch ein paar Änderungen an qmail vornehmen. Das ist der “qmail-smtpd-chkusr”-Patch. Den originalen Patch findest du hier. Ich habe ihn für diese Anleitung ein wenig geändert. Das normale Verhalten von qmail ist, das er jede Email für lokale Domains annimmt, prüft ob der User existiert und im Fehlerfall eine Bouncemail (Fehlermail) zurück schickt. Dieser Patch sorgt dafür, das qmail vor dem annehmen der Email prüft ob der User exisitiert und im Fehlerfall die Email sofort abweißt. Dieses Verfahren kann einiges an Traffic sparen, gerade wenn es sich um Spam handelt.

Als erstes die Datei qmail-smtpd.c öffnen. Nach dem letzten #include folgendes einfügen:
[c]#include <pwd.h>#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include “open.h”
#include “/var/qmail/vpopmail/include/vpopmail.h”
#include “/var/qmail/vpopmail/include/vauth.h”
#include “/var/qmail/vpopmail/include/vpopmail_config.h”[/c]
Dann suchst du die Funktion “addrallowed()” und fügst folgenden Code davor ein (Achtung, längerer Code folgt!):
[c]void err_realrcpt() { out(“550 sorry, no mailbox here by that name (#5.1.1)rn”); }int realrcpt_check()
{
stralloc user = {0};
stralloc domain = {0};
stralloc domain_path = {0};
stralloc bounce_path = {0};
stralloc alias_name = {0};
stralloc alias_path = {0};
stralloc mailing_path = {0};
int count;
int retstat = 0;
struct vqpasswd *user_passwd = null;
int fd_file = -1;
int read_char;
dir *dir_file = null;
uid_t eff_uid;
gid_t eff_gid;
int offset;
char read_buf[1024];
/* if not local rcpthost we cannot control mailbox */
if (!addrallowed()) { return 1; }
/* set up our variables */
/* qmail-smtpd is running now as (effective) qmaild:qnofiles */
/* save the effective uid & gid (qmaild:qnofiles) */
eff_uid = geteuid ();
eff_gid = getegid ();
/* search the ‘@’ character */
count = byte_rchr(addr.s,addr.len,’@');
/* the following lines could interest people using # instead of @ in e-mail address */
/* if ‘@’ not found search the ‘%’ character */
/*
if (count >= addr.len) {
count = byte_rchr(addr.s,addr.len,’%');
}
*/
/*
* give extra room to variables used often or used outside stralloc_x calls
* this should make all safer and even faster
* (when these fields are used by stralloc_x routines)
*/
if (!stralloc_ready (&domain, 200)) die_nomem();
if (!stralloc_ready (&domain_path, 200)) die_nomem();
if (count < addr.len) {
if (!stralloc_copyb (&user, addr.s, count)) die_nomem();
if (!stralloc_0 (&user)) die_nomem();
if (!stralloc_copys (&domain, addr.s + count + 1)) die_nomem();
if (!stralloc_0 (&domain)) die_nomem();
}
else {
if (!stralloc_copys (&user, addr.s)) die_nomem();
if (!stralloc_0 (&user)) die_nomem();
if (!stralloc_copys (&domain, default_domain)) die_nomem();
if (!stralloc_0 (&domain)) die_nomem();
}
/* my personal control: continue only if a domain (default or not) is specified */
if (domain.len == 1)
return 0;
/* now set new effective uid & gid, getting it from real uid & gid (vpopmail:vchkpw) */
setegid (getgid());
seteuid (getuid());
/* qmail-smtpd is running now as effective vpopmail:vchkpw */
case_lowers (user.s);
case_lowers (domain.s);
/* check if domain is a real domain */
if (!stralloc_0 (&domain)) die_nomem();
vget_real_domain(domain.s, domain.a);
domain.len = strlen (domain.s);
if (domain.len > (domain.a – 1)) die_nomem();
/* let’s get domain’s real path */
vget_assign(domain.s, domain_path.s, 156, null, null);
domain_path.len = strlen (domain_path.s);
/* now let’s start the test suite */
switch (0) {
case 0:
/* check if domain has bouncing enabled */
/* allocate room for bounce_path */
if (!stralloc_ready (&bounce_path, 200)) die_nomem();
if (!stralloc_copy (&bounce_path, &domain_path)) die_nomem();
if (!stralloc_cats (&bounce_path, “/.qmail-default”))
die_nomem();
if (!stralloc_0 (&bounce_path)) die_nomem();
read_char = 0;
fd_file = open_read (bounce_path.s);
if (fd_file != -1) {
read_char = read (fd_file, read_buf,
sizeof(read_buf) – 1);
close (fd_file);
if (read_char < 0) read_char = 0;}
read_buf[read_char] = 0;
if ( strstr(read_buf, “bounce-no-mailbox”) == null ) {
retstat = 1;
break;
}
case 1:
/* user control: check the existance of a real user */
user_passwd = vauth_getpw (user.s, domain.s);
if (user_passwd != null) {
/* if user exists check if he has bounce_mail flag set */
if (user_passwd->pw_gid & bounce_mail)
retstat = 0;
else
retstat = 1;
break;
}
case 2:
/* check for aliases/forwards – valias*/
if (valias_select (user.s, domain.s) != null) {
retstat = 1;
break;
}
case 3:
/* check for aliases/forwards – .qmail-x files */
/* allocate room for alias_path */
if (!stralloc_ready (&alias_path, 200)) die_nomem();
if (!stralloc_copy (&alias_name, &user)) die_nomem();
/* change all ‘.’ in ‘:’ before continuing on aliases */
for (count = 0; count < alias_name.len; ++count)
if (*(alias_name.s + count) == ‘.’) *(alias_name.s + count) = ‘:’;
if (!stralloc_copy (&alias_path, &domain_path)) die_nomem();
if (!stralloc_cats (&alias_path, “/.qmail-”)) die_nomem();
if (!stralloc_cats (&alias_path, alias_name.s)) die_nomem();
if (!stralloc_0 (&alias_path)) die_nomem();
/* access executes anyway as real (vpopmail:vchkpw), that’s ok */
if (access (alias_path.s, f_ok) == 0) {
retstat = 1;
break;
}
case 4:
/* let’s check for mailing lists */
/* allocate room for mailing_path */
if (!stralloc_ready (&mailing_path, 300)) die_nomem();
/* search for the outer ‘-’ character */
for (offset = user.len – 1; offset > 0; –offset)
if (*(user.s + offset) == ‘-’) {
if (!stralloc_copy (&mailing_path, &domain_path)) die_nomem();
if (!stralloc_cats (&mailing_path, “/”)) die_nomem();
if (!stralloc_catb (&mailing_path, user.s, offset)) die_nomem();
if (!stralloc_cats (&mailing_path, “/mailinglist”)) die_nomem();
if (!stralloc_0 (&mailing_path)) die_nomem();
/* access executes anyway as real (vpopmail:vchkpw), that’s ok */
if (access (mailing_path.s, f_ok) == 0) {
retstat = 1;
break;
}
}
/*
* add this code if another case is following
if (retstat == 1)
break;
*/
} /* end switch */

/* now switch back effective to saved uid & gid (qmaild:qnofiles) */
setegid (eff_gid)
seteuid (eff_uid);
/* qmail-smtpd is running again as (effective) qmaild:qnofiles */
return retstat;
}[/c]
Dann suchst du folgende Zeile
[c]if (!addrallowed()) { err_nogateway(); return; }[/c]
und fügst darunter diese Zeile ein:
[c]if (!realrcpt_check()) { err_realrcpt(); return; }[/c]
Optional kann man noch die zeile
[c]void err_nogateway() { out(“553 sorry, that domain isn’t in my list of allowed rcpthosts( #5.7.1)rn”); }[/c]
in
[c]void err_nogateway() { out(“553 sorry, that domain isn’t on of my local domains (#5.7.1)rn”); }[/c]
ändern (ich finde die Meldung hört sich besser an ;-) Die Datei speichern und schliesen. Dann öffnets du die Datei makefile und suchst die folgende Zeile:

qmail-smtpd:

Den kompletten Abschnitt (Änderungen gibt es eigentlich nur in den letzten 3 zeilen!) änderst du nun in:

qmail-smtpd: 

load qmail-smtpd.o rcpthosts.o commands.o timeoutread.o 

timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o 

date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a 

open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a 

fs.a auto_qmail.o base64.o socket.lib

  ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o 

  timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o 

  received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a 

  datetime.a getln.a open.a sig.a case.a env.a stralloc.a 

  alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o 

  -lcrypt /var/qmail/vpopmail/lib/libvpopmail.a 

  `cat socket.lib`

Datei speichern und schliesen. nun können wir qmail kompilieren und installieren:

# make

# make setup check

Jetzt müssen wir noch das RC-Script einrichten.

# cd ../tarballs

# cp rc.txt rc

Öffne die Datei rc und ersetzte in dieser Zeile

mailserver=mail.domain.tld

den Namen “mail.domain.tld” mit deinem FQDN. Datei speichern und schliesen. So, nun nur noch

# cp rc /var/qmail/

# chmod 755 /var/qmail/rc

und schon solltest du qmail mit

# /var/qmail/rc start

starten können. Zum schluss entfernen wir noch die ganzen tar-Dateien

# rm /usr/src/*.tar

Auf meinem System konnte ich mit diesem Verfahren qmail installieren und bin sehr zufrieden über das Ergebnis!

Sollten in dieser Anleitung irgendwelche Fehler oder Verbesserungsmöglichkeiten auftauchen, würde ich mich über eine kurze Info sehr freuen!
Viel spaß damit!

3 Gedanken zu “qmail-Install

  1. Schönes Tut, nur leider funktioniert das ganze wohl nicht mit netqmail-1.05

    Habe versucht es anzupassen, nur leider kann er mit einigen Variablen (z.B. bounce_mail) und null nix anfangen.

    LG Marcus

  2. netqmail ist, soweit ich weiß, stark angepasst worden. Mitterweile arbeite ich auch mit Postfix (zusammen mit courier-imap und MySQL), daher bin ich da auch nicht auf dem aktuellen Stand.

  3. Tag.

    leider funkioniert das wohl nicht so recht,

    zudohf:/usr/src/qmail/qmail-1.03# make
    ./compile qmail-smtpd.c
    qmail-smtpd.c: In function ‘realrcpt_check’:
    qmail-smtpd.c:382: error: ‘null’ undeclared (first use in this function)
    qmail-smtpd.c:382: error: (Each undeclared identifier is reported only once
    qmail-smtpd.c:382: error: for each function it appears in.)
    qmail-smtpd.c:388: error: ‘dir’ undeclared (first use in this function)
    qmail-smtpd.c:388: error: ‘dir_file’ undeclared (first use in this function)
    qmail-smtpd.c:556: error: ‘bounce_mail’ undeclared (first use in this function)
    qmail-smtpd.c:606: error: ‘f_ok’ undeclared (first use in this function)
    qmail-smtpd.c: At top level:
    qmail-smtpd.c:673: error: expected identifier or ‘(‘ before ‘}’ token
    qmail-smtpd.c: In function ‘main’:
    qmail-smtpd.c:1334: warning: return type of ‘main’ is not ‘int’
    make: *** [qmail-smtpd.o] Fehler 1

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>