Mailserver med OpenBSD

vpopmail

http://www.inter7.com/?page=vpopmail

För guiden används vpopmail för att hantera virtuella domäner och mailkonton.

/etc/tcp.smtp.cdb, /home/vpopmail/etc/tcp.smtp.cdb eller /etc/tcp/smtp.cdb ?

Efter många delade meningar om vart man ska lägga CDB filerna för tcpserver, så har jag bestämt mig för att följa den metod som JMS använder, dvs att lägga filerna inne i /etc/tcp. Fördelen är att alla cdb filer ligger samlade under samma ställe, och att man kan se till att 'tcprules' får rättigheter att uppdatera filerna. Som JMS förklarar så är tcpserver är inte enbart för qmail, av den anledningen ska inte filerna heller läggas inne i qmail's katalogstruktur, och inte heller under '/home/vpopmail'.

1. Skapa användare för vpopmail och inställningar för databasen

Den "klassiska" installationen av vpopmail har alltid använt UID och GID 89 för vchkpw användaren och gruppen. I OpenBSD har dessa idn varit upptagna sedan ett bra tag tillbaks, och vi måste därför antingen låta systemet välja UID och GID själv, eller tilldela egna IDn vid skapande av grupper och användare.

För att få samma id på alla servrar som installeras, och ev. ska dela filsystem för mailboxarna senare så väljer vi att tilldela egna UID och GID.

groupadd -g 2109 vchkpw
useradd -g vchkpw -m -d /home/vpopmail -s /sbin/nologin -u 7797 vpopmail
mkdir -p ~vpopmail/etc/
echo "localhost|0|vpopmail_edit|vpass|vpopmail" > ~vpopmail/etc/vpopmail.mysql
chmod 640 ~vpopmail/etc/vpopmail.mysql

2. Tillåt alltid localhost att skicka mail till vem som helst (SMTP relay)

mkdir -p /etc/tcp
echo '127.0.0.1:allow,RELAYCLIENT=""' >/etc/tcp/smtp
qmailctl cdb

3. Installera Bzip2 (bunzip)

pkg_add bzip2

4. Hämta källkod, kompilera och installera

cd /usr/local/src
wget http://switch.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.27.tar.bz2 
tar xfj vpopmail-5.4.27.tar.bz2 
cd vpopmail-5.4.27/
./configure --enable-roaming-users=y --enable-ip-alias-domains=y \
--enable-auth-module=mysql --enable-libdir=/usr/local/mysql/lib/mysql \
--disable-many-domains --enable-auth-logging=y --enable-sql-logging=y \
--enable-clear-passwd=y --enable-qmail-ext --enable-logging=e \
--enable-tcpserver-path=/etc/tcp/ --enable-tcpserver-file=/etc/tcp/smtp \
--enable-tcprules-prog=/usr/local/bin/tcprules \
--enable-rebuild-tcpserver-file --enable-mysql-limits \
--enable-valias=y
Förklaringar till alla parametrar till 'configure' (popup)
make
make install-strip
echo >>//var/cron/tabs/root "# Remove comment on the line below to clean up expired entries in the relay db"
echo >>//var/cron/tabs/root "#42 * * * * /home/vpopmail/bin/clearopensmtp 2>&1 >/dev/null"
EDITOR=ee crontab -e
Efter att du aktiverat den automatiska rensningen av relay DBn så länkar du in qmail-pop3d i /services för att starta POP3 servicen:
ln -s /var/qmail/supervise/qmail-pop3d /service

Testa att allt fungerar

Om du har något domännamn över, så kan du utföra testerna skarpt, dvs med MX satt så att den pekar på din qmail-server. I annat fall kan du göra testerna från en annan dator ditt lokala nätverk.

Skapa en domän med användare och ta bort den

För att kolla om kopplingen mot databasen fungerar som det ska kan du börja med att skapa en domän med några användare:
/home/vpopmail/bin/vadddomain test.com testpw
/home/vpopmail/bin/vadduser nisse@test.com nissepw
/home/vpopmail/bin/vadduser kalle@test.com kallepw
För att undvika problem framöver med att ta bort mailkonton eller domäner måste tabellen 'vlog' skapas. Detta görs enklast genom att göra en misslyckad inloggning mot servern via POP3, och om du inte vill prata POP med servern, så kan du ladda ner eller skapa en liten PHP fil som gör det åt dig:

fixa-vlog-problem

<?php
$pop3=fsockopen('localhost',110);
$line = fgets($pop3, 1024); print $line;
fputs($pop3,"user fixa_vlog@problemet.nu\r\n");
$line = fgets($pop3, 1024); print $line;
fputs($pop3,"pass fel_pass\r\n");
$line = fgets($pop3, 1024); print $line;
?>

wget http://www.bsd-guide.net/openbsd-mailserver/files/qmail/fixa-vlog-problem
php fixa-vlog-problem

Felmeddelandet om att tabellen 'vpopmail.problemet_nu' inte finns kan du strunta i. Det är en del av lösningen på problemet.

Kolla att domänen lagts upp i databasen:

mysql -u vpopmail_edit -pvpass vpopmail -e "show tables"
Du bör få upp:
+--------------------+
| Tables_in_vpopmail |
+--------------------+
| deny_from          |
| dir_control        |
| lastauth           |
| limits             |
| relay              |
| test_com           |
| vlog               |
+--------------------+

Kolla sen att de användare du skapade ("nisse" och "kalle") finns i tabellen för domänen:

mysql -u vpopmail_edit -pvpass vpopmail -e "select * from test_com"
Det du får upp bör se ut något såhär:
+------------+------------------------------------+--------+--------+------------+--------------------------------------------+----------+-----------------+
| pw_name    | pw_passwd                          | pw_uid | pw_gid | pw_gecos   | pw_dir                                     | pw_shell | pw_clear_passwd |
+------------+------------------------------------+--------+--------+------------+--------------------------------------------+----------+-----------------+
| postmaster | $1$GXUNSzAJ$8BjCRmwSVv1no2.o6rfTt0 |      0 |      0 | Postmaster | /home/vpopmail/domains/test.com/postmaster | NOQUOTA  | testpw          |
| nisse      | $1$GXUNSzAJ$y5Kyq3QTVY5WT5HrpT8Y01 |      0 |      0 | nisse      | /home/vpopmail/domains/test.com/nisse      | NOQUOTA  | nissepw         |
| kalle      | $1$GXUNSzAJ$jf03l3ccjIQS6b175ipqu. |      0 |      0 | kalle      | /home/vpopmail/domains/test.com/kalle      | NOQUOTA  | kallepw         |
+------------+------------------------------------+--------+--------+------------+--------------------------------------------+----------+-----------------+

Kolla att det skapats kataloger för att lagra domänens och användarnas mail i ("pw_dir" i ovanstående resultat ska existera):

find /home/vpopmail/domains/test.com -type d
Alla kataloger i "test.com" i "/home/vpopmail" listas:
/home/vpopmail/domains/test.com
/home/vpopmail/domains/test.com/postmaster
/home/vpopmail/domains/test.com/postmaster/Maildir
/home/vpopmail/domains/test.com/postmaster/Maildir/new
/home/vpopmail/domains/test.com/postmaster/Maildir/cur
/home/vpopmail/domains/test.com/postmaster/Maildir/tmp
/home/vpopmail/domains/test.com/nisse
/home/vpopmail/domains/test.com/nisse/Maildir
/home/vpopmail/domains/test.com/nisse/Maildir/new
/home/vpopmail/domains/test.com/nisse/Maildir/cur
/home/vpopmail/domains/test.com/nisse/Maildir/tmp
/home/vpopmail/domains/test.com/kalle
/home/vpopmail/domains/test.com/kalle/Maildir
/home/vpopmail/domains/test.com/kalle/Maildir/new
/home/vpopmail/domains/test.com/kalle/Maildir/cur
/home/vpopmail/domains/test.com/kalle/Maildir/tmp

Om allt är ok så här långt (och om det inte är det så får du felsöka), så är det dags att prova ta bort en användare. Med kommandot vdeluser tar man bort en användare:

/home/vpopmail/bin/vdeluser kalle@test.com
Kör samma kommandon som tidigare för att se att användaren försvunnit från databasen och från "/home/vpopmail/test.com":
mysql -u vpopmail_edit -pvpass vpopmail -e "select * from test_com"
find /home/vpopmail/domains/test.com -type d

om "kalle" har försvunnit både från databas och "/home/vpopmail/test.com" så är allt ok.

Dags att ta bort test-domänen:

/home/vpopmail/bin/vdeldomain test.com
Kolla igen att allt fungerat som det ska:
# mysql -u vpopmail_edit -pvpass vpopmail -e "select * from test_com"
ERROR 1146 (42S02) at line 1: Table 'vpopmail.test_com' doesn't exist
# find /home/vpopmail/domains/test.com -type d
find: /home/vpopmail/domains/test.com: No such file or directory
Om det ser ut sådär så är domänen och de kvarvarande användarna borttagna.

Fel som kan uppstå när man ska ta bort användare

Eftersom problemet är löst under förutsättning att du följt min guide, så har jag valt att dölja informationen om felen som orsakas av att 'vlog' tabellen inte finns.
Visa/dölj information

Skapa en domän och några mailboxar

För att kunna testa måste du börja med att skapa en virtuell domän i qmail (med hjälp av vpopmail), och sen lägga upp ett par testmailkonton där:
/home/vpopmail/bin/vadddomain test.com testpw
/home/vpopmail/bin/vadduser nisse@test.com nissepw
/home/vpopmail/bin/vadduser kalle@test.com kallepw

Nu kan du, för att testa, skicka ett mail genom att prata SMTP med servern (byt ut min IP mot den adress du använder på servern, testa gärna från en annan dator på ditt nät för att se att relay-biten fungerar som den ska):

$ telnet 192.168.0.3 25
Trying 192.168.0.3...
Connected to 192.168.0.3.
Escape character is '^]'.
220 spambox3.bsd-guide.net ESMTP
helo testburken.com
250 spambox3.bsd-guide.net
ehlo testburken.com
250-spambox3.bsd-guide.net
250-STARTTLS
250-SIZE 0
250-PIPELINING
250 8BITMIME
mail from: <din riktiga mailadress>
250 ok
rcpt to: <nisse@test.com>
250 ok
data
354 go ahead
Subject: testar lite smtp-prat

testar skriva ett mail genom att prata lite smtp med servern.
.
250 ok 1210459033 qp 866
quit
221 spambox3.bsd-guide.net
Connection closed by foreign host.
$

Testa också att skicka ett mail till din riktiga mailadress, ex:

mail from: <nisse@test.com>
rcpt to: <peo@bsd-guide.net>

Detta ska avbrytas efter 'rcpt to' kommandot om du provar från en annan datorn på ditt nätverk:

553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

Om allt ser ut ungefär så, så är allt ok, annars har du inte följt min guide.. Nu bör du kunna hämta mailet via POP, och det testar vi genom att prata POP3 med servern:

$ telnet 192.168.0.3 110
Trying 192.168.0.3...
Connected to 192.168.0.3.
Escape character is '^]'.
+OK <18927.1210459559@spambox3.bsd-guide.net>
user nisse@test.com
+OK
pass nissepw
+OK
list
+OK
1 372
.
retr 1
+OK
Return-Path: <peo@bsd-guide.net>
Delivered-To: nisse@test.com
Received: (qmail 32687 invoked from network); 11 May 2008 00:45:07 +0200
Received: from blaha.blaha.net (HELO testburken.com) (213.xx.xxx.xx)
  by spambox3.bsd-guide.net with SMTP; 11 May 2008 00:45:07 +0200
Subject: testar lite smtp-prat

testar skriva ett mail genom att prata lite smtp med servern.

.
quit
+OK
Connection closed by foreign host.
$

Efter att du hämtat mail från servern så ska du också kunna skicka mail ("POP before SMTP"). Den IP-adress du visade för servern när du hämtade mail ska alltså automatiskt ha hamnat i /etc/tcp/smtp.cdb och i relay-tabellen i databasen för vpopmail. Detta kan du kolla genom att lista allt i relay-tabellen på samma sätt som exemlpena med användarna ovan använde:

mysql -u vpopmail_edit -pvpass vpopmail -e "select * from relay"

Du kan kolla att det går att skicka mail till andra adresser (utanför servern) genom att prata SMTP med servern igen (använd ex. nisse@test.com som avsändare och en av dina riktiga mailadresser som mottagare)

För att det ska fungera krävs det givetvis att du testar från samma dator du provade POP-funktionen från, och att denna dator inte är hårdkodad i din /etc/tcp/smtp fil (som localhost ovan).
De enda adresser som alltid ska finnas i /etc/tcp/smtp är de som alltid ska kunna skicka mail till vem som helst, utan att behöva ha ett giltigt mailkonto på din server. Ofta är detta enbart "localhost" + kanske ett fåtal fasta IP-adresser (interna eller publika) till servrar som ingår i det nät mailservern läggs upp för.

smtp.cdb innehåller tillfälligt fler adresser, efter att dessa autentiserat sig via POP3 inloggning. Att kolla innehållet i en CDB fil görs enklast med DJB's CDB paket (installationen beskrivs på nästa sida):

cdbdump < /etc/tcp/smtp.cdb
 
 
Visar de 30 senaste vägarna in till guiden. Visa alla
G o o g l e (www.google.se), sökning efter 'mail server openbsd'
G o o g l e (www.google.se), sökning efter 'mail server openbsd'
G o o g l e (www.google.se), sökning efter 'mail server openbsd'
http://www.bing.com/search?q=%22%40src%2ecom%2esg%22+loc%3ASE&filt=all&first=140&FORM=PERE
G o o g l e (www.google.se), sökning efter 'smtp auth'
G o o g l e (www.google.se), sökning efter 'bsd mail server'
G o o g l e (www.google.se), sökning efter 'bsd mail server'
G o o g l e (www.google.se), sökning efter 'mail server guide'
G o o g l e (www.google.se), sökning efter 'mail server guide'
http://www.bing.com/search?q=smpt+f%C3%B6r+live.se&form=CMDTDF&pc=CMDTDF&src=IE-SearchBox
http://new.bsd-guide.net/openbsd-mailserver/index.php?
G o o g l e (www.google.se), sökning efter 'mail server openbsd'
http://new.bsd-guide.net/openbsd-mailserver/index.php?
http://new.bsd-guide.net/openbsd-mailserver/index.php?
http://new.bsd-guide.net/?
http://new.bsd-guide.net/?
G o o g l e (www.google.se), sökning efter 'google.se/webbmail'
G o o g l e (www.google.se), sökning efter 'google.se/webbmail'
G o o g l e (www.google.se), sökning efter 'google.se/webbmail'
http://new.bsd-guide.net/openbsd-mailserver/index.php?
http://new.bsd-guide.net/openbsd-mailserver/index.php?page=4
G o o g l e (www.google.se), sökning efter 'bsd kommandon'
G o o g l e (www.google.se), sökning efter 'bsd kommandon'
G o o g l e (www.google.ru), sökning efter 'dovecot "disable_pop"'
G o o g l e (www.google.se), sökning efter 'virtuell domäner'
G o o g l e (www.google.se), sökning efter 'google.se/webbmail'
G o o g l e (www.google.se), sökning efter 'openbsd mailserver'
G o o g l e (www.google.se), sökning efter 'qmail disable smtp auth'
http://new.bsd-guide.net/openbsd-mailserver/index.php?
http://new.bsd-guide.net/openbsd-mailserver/index.php?page=1