Feb 04, 2012

postfix, mysql, dovecot, domainkeys, dkim, spamassassin, clamav, amavisd, spf на Slackware 13.37 HOWTO for SLACKWARE

Hristo C. Simeonov
Rev 2: 04 Feb 2012

Преди няколко дни ми се наложи да си преместя мейл сървъра на друг сървър. От доста време му бях набрал на моя мейл сървър, който беше на qmail. Нямам нищо против qmail, просто вече е морално остарял. Първата сигурна версия на Qmail 1.3 се появи през 1998 година и общо взето от тогава кода му не е мръднал много много, което от своя страна си е малко неудобство. За всяко ново нещо което ти потрябва, трябва да търсиш разни пачове из мрежата, пък те не били цели, нещо не им работило ... общо взето, ако искаш да го инсталираш с малко по нови неща, може да си строшиш нервите. На този адрес има една страница, която бях писал през 2005 година и актуализирал до 2010 как да си инсталираме qmail. Вече не я обновявам, тъй като смятам, че qmail си е загуба на време.

Операционна система: Slackware 13.37

Необходим софтуер който приемаме, че са инсталирани:

OpenSSL >= 0.9.8q 2 Dec 2010
MySQL >= 5.1.53
Perl > = 5.12.2
Също така всички програми, които теглим ще приемаме, че са свалени в /usr/local/src

Dovecot

Официалния сайт на продукта dovecot е: www.dovecot.org.
В тази документация съм използвал версия 2.0.17. Да преминем към инсталирането на софтуера. Първо трябва да си създадем базата в MySQL-а. Може да не се вживявате с много сложни пароли, пуснете MySQL-а бинднат на 127.0.0.1 само, това е достатъчно. Ако някой влезе в сървъра ви, няма да е през dovecot юзера който ще създадем, а това автоматично означава, че ще има права по един или друг начин да прочете файла, на който е записана паролата за базата.

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE `dovecot` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `dovecot` . * TO 'dovecot'@'localhost' IDENTIFIED BY 'dovecot' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Ако ви се наложи да дропнете базата с потребителя, ето какво трябва да направите:

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> REVOKE ALL PRIVILEGES ON * . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> REVOKE ALL PRIVILEGES ON `dovecot` . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> REVOKE GRANT OPTION ON `dovecot` . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS `dovecot`;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Сега трябва да създадем юзера и групата, под които ще работи dovecot, също и мейл юзера, под който ще се записват писмата

groupadd dovecot
useradd dovecot -g dovecot -c 'Dovecot mail server' -s /bin/false
groupadd vmail
useradd vmail -g vmail -c 'Vmail server' -s /sbin/nologin

и продължаваме към инсталиране и конфигуриране на dovecot.

tar xzvf dovecot-2.0.21.tar.gz
chown -R root.root dovecot-2.0.21
cd dovecot-2.0.21
./configure --with-mysql
make
make install
cd /usr/local/share/doc/dovecot/
cp -r example-config /usr/local/etc/dovecot
cd /usr/local/etc/dovecot
vi dovecot.conf

При мен конфигурационния файл изглежда по следния начин, както ще видите - бинднал съм imap, който не изисква енкрипция на 127.0.0.1 само, това е с цел да се използва само от уеб емайл-а, тъй като няма нужда процесора да се натоварва излишно с безмисленна енкрипция, след като само локалния хост ще се връзва с него. Всички останали правят конекция през ssl порта. Там където в конфигурационния файл пише uid=1004 gid=1005, това са userid и groupid -то на потребителя vmail!

# 2.0.21: /usr/local/etc/dovecot/dovecot.conf
# OS: Linux 3.2.4 i686 Slackware 13.37.0 ext4
auth_mechanisms = plain login
base_dir = /usr/local/var/run/dovecot/
default_login_user = nobody
dict {
  driver = sql
  quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}
mail_location = maildir:/var/spool/postmail/%d/%n/Maildir
mail_privileged_group = vmail
passdb {
  args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocols = pop3 imap
service imap-login {
  inet_listener imap {
    address = 127.0.0.1
    port = 143
  }
}
ssl_cert = </etc/postfix/ssl/mail.example.com.crt
ssl_key = </etc/postfix/ssl/mail.example.com.key
userdb {
   driver = static
   args = uid=1004 gid=1005 home=/var/spool/postmail/%d/%u allow_all_users=yes
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
!include conf.d/*.conf

Както и файла dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix
default_pass_scheme = CRYPT
password_query = SELECT username AS user, password FROM mailbox WHERE username = '%u';

След това отивате в директорията conf.d и трябва да промените следните файлове:
10-auth.conf
Коментирайте реда: !include auth-system.conf.ext да стане на: #!include auth-system.conf.ext и размаркирайте долния ред да стане на: !include auth-sql.conf.ext
10-mail.conf Тук трябва да намерите параметъра: mail_location = и да кажете къде и в какъв формат ще се записват писмата. За тази статия аз съм избрал те да се записват в /var/spool/postmail директорията. Нека сега да я създадем, за да не я забравим после. Внимание, ако променяте тази директория, не забравяйте да я промените и в dovecot.conf файла.

mkdir /var/spool/postmail
chown -R vmail.vmail /var/spool/postmail

след като сме готови трябва да създадем таблицата в базата ни:

mysql -u dovecot -p dovecot
Enter password:
mysql> CREATE TABLE users (
    userid VARCHAR(128) NOT NULL,
    domain VARCHAR(128) NOT NULL,
    password VARCHAR(64) NOT NULL,
    home VARCHAR(255) NOT NULL,
    uid INTEGER NOT NULL,
    gid INTEGER NOT NULL
);
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Dovecot когато работи с SQL сървър има възможност да се връзва към сокет, аз специално срещнах някакъв проблем и тъй като вече ми работи сървъра нямам голямо желание да го тествам. Сокета се описва по следния начин в dovecot-sql.conf файл:

# The mysqld.sock socket may be in different locations in different systems
driver = mysql
connect = host=/var/run/mysqld/mysqld.sock dbname=mails user=admin password=pass

Ако някой го пробва и работи да метне един емайл да каже.
Генерираме сертификата и сме готови.

openssl req -new -x509 -days 365 -nodes -out "example.cert" -keyout "example.key"
chmod 600 example.key
cp -a /root/example.cert /etc/postfix/ssl/certs/dovecot.pem
cp -a /root/example.key /etc/postfix/ssl/private/dovecot.pem

Стига толкова за dovecot, нека продължим по нататък.

Postfix

Официалния сайт на продукта Postfix е: www.postfix.org.
Използвал съм версия 2.8.8, добавяме потребителя, под който ще работи postfix.

groupadd postfix
groupadd postdrop
useradd postfix -g postfix -c 'Postfix daemon user account' -d /var/spool/postfix -s /bin/false

Postfix може да ви даде грешка когато го компилирате с MySQL подръжка, тъй като както postfix, така и MySQL инклудват един и същи файл events.h, за това трябва да преименувате единия файл (този на MySQL-а).

cd /usr/include/mysql/
mv events.h events.h.bak
cd /usr/local/src
tar xzvf postfix-2.9.3.tar.gz
chown -R root.root postfix-2.9.3
cd postfix-2.9.3
make -f Makefile.init makefiles \
        'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_TLS -DUSE_DOVECOT_SASL -I/usr/include/sasl' \
        'AUXLIBS=-L/usr/lib/sasl2 -L/usr/lib -lmysqlclient -lz -lm -L/usr/lib -lssl -lcrypto -lsasl2'
make
make install
ln -s /usr/sbin/sendmail /usr/lib/sendmail

Сега ще създадем и ключа за да не го забравим после.

perl /etc/ssl/misc/CA.pl
CA certificate filename (or enter to create)

Making CA certificate ...
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
....................++++++
.....++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:някъв пасс

Сега ще създадем ключа без парола за нашия хост aaa.example.net и неподписан ключ.

openssl req -new -nodes -keyout aaa-key.pem -out aaa-req.pem -days 365
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
........................................++++++
....++++++
writing new private key to 'aaa-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BG
State or Province Name (full name) [Some-State]:Stara Zagora
Locality Name (eg, city) []:Stara Zagora
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Condor
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:aaa.example.net
Email Address []:owner@example.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:някъв пасс
An optional company name []:

Подписваме публичния сертифика за aaa.example.net със удостоверяващия частен ключ които създадохме преди няколко стъпки.

openssl ca -out aaa-cert.pem -infiles aaa-req.pem
Using configuration from /etc/ssl/openssl.cnf
Enter PEM pass phrase:някъв пасс
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName           :PRINTABLE:'BG'
stateOrProvinceName   :PRINTABLE:'Stara Zagora'
localityName          :PRINTABLE:'Stara Zagora'
organizationName      :PRINTABLE:'Condor'
commonName            :PRINTABLE:'aaa.example.net'
emailAddress          :IA5STRING:'owner@example.net'
Certificate is to be certified until Nov 21 19:40:56 2012 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Инсталираме публичния и частния ключ както и удостоверяващия частен ключ.

cp demoCA/cacert.pem aaa-key.pem aaa-cert.pem /etc/postfix
chmod 644 /etc/postfix/aaa-cert.pem /etc/postfix/cacert.pem
chmod 400 /etc/postfix/aaa-key.pem

Сега ги инсталираме в /etc/postfix/main.cf файла за всички клиенти. Давам примерни параметри, в конфигурационните файлове които съм дал името на ключа е различно тъй като тази част е допълвана в последствие след като видях, че съм я пропуснал.

/etc/postfix/main.cf:
        smtp_tls_CAfile = /etc/postfix/cacert.pem
        smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
        smtp_tls_security_level = may
        smtpd_tls_CAfile = /etc/postfix/cacert.pem
        smtpd_tls_cert_file = /etc/postfix/aaa-cert.pem
        smtpd_tls_key_file = /etc/postfix/aaa-key.pem
        smtpd_tls_received_header = yes
        smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
        tls_random_source = dev:/dev/urandom
        smtpd_tls_security_level = may

Сега да създадем базата и да качим sql файла:

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE `postfix` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost' IDENTIFIED BY 'postfix' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye
mysql -u root -p postfix < mail.sql

Преминаваме към антивирусната програма, после ще настройваме postfix-а.

pigeonhole

Искам да вмъкна няколко думи. Ако Вашия уеб майл има подръжка на втори активен фолдер, тъй като squirrelmail-а няма, но примерно roundcuba има и желаете писмата идентифицирани като спам да отивам автоматично в тази папка, тогава имате нужда от dovecot-pigeonhole. Това е скриптов език с които можете да манипулирате писмата т.е. ако се съдържа spam в писмото премести го в еди си коя директория.
Официалния сайт на продукта pigeonhole е: pigeonhole.dovecot.org.
Продукта се инсталира лесно:

tar xzvf dovecot-2.1-pigeonhole-0.3.1.tar.gz
chown -R root.root dovecot-2.1-pigeonhole-0.3.1
cd dovecot-2.1-pigeonhole-0.3.1
./configure
make
make install

Активирате двата конфигурационни файла в dovecot и остава да си настроите филтъра след това. Филтъра може да бъде персонален и глобален за всички потребители. При мен използвам глобален ето как изглежда:

# cat /usr/local/var/lib/dovecot/sieve/default.sieve 
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Spam";
}

Забравих да спомена, че самия dovecot също подържа команди за манипулиране на файлове, но не може да мести писма физически от една папка в друга, за това се налага да се използва pigeonhole.

clamav

Официалния сайт на продукта clamav е: www.clamav.net.
Използвал съм версия: 0.97.5. Първо добавяме групата и потребителя, под който ще ни работи антивирусната програма, аз съм избрал имената им по подразбиране.

groupadd clamav
useradd clamav -g clamav -c 'ClamAV system user' -d /var/lib/clamav -s /bin/false
tar xzvf clamav-0.97.5.tar.gz
chown -R root.root clamav-0.97.5
cd clamav-0.97.5
./configure
make
make install
mkdir /var/lib/clamav
chown -R clamav:clamav /var/lib/clamav
freshclam
mkdir /var/run/clamav
chown clamav:clamav /var/run/clamav

След като антивирусната програма е инсталирана, трябва да се конфигурира. Антивирусната програма има два файла: clamd.conf и freshclam.conf, който са записани в директорията /usr/local/etc. И двата файла трябва задължително да се редактират. Разгледайте ги, ако нещо не ви стане ясно или се двоумите, може да изтеглите моите файлове от директорията downloads. Те ще работят, ако сте следвали точно инструкциите.

SpamAssassin

Нека преди да инсталираме SpamAssassin, да инсталираме някой други модули, които би било добре да ги имаме. Внимание, ако вашият емайл сървър приема повече от 100,000 писма на ден, за да използвате Distributed Checksum Clearinghouse (DCC) трябва да си инсталирате локален сървър, защото писмата Ви няма да бъдат проверявани, когато надхвърлят бройката.
Официални сайтове:
DCC - http://www.rhyolite.com/dcc/
Razor - http://razor.sourceforge.net/
Pyzor - http://pyzor.sourceforge.net/
Нека да започнем първо с DCC, след това ще инсталираме Razor и най на края Pyzor. След като преключим с тях ще преминем към инсталирането на SpamAssassin

tar xzvf dcc.tar.Z
chown -R root.root dcc-1.3.141
cd dcc-1.3.141
./configure --disable-dccm
make
make install
cdcc info > /var/dcc/map.txt
chmod 0600 /var/dcc/map.txt
rm /var/dcc/map
cdcc "new map; load /var/dcc/map.txt"
cdcc "delete 127.0.0.1"
cd /usr/local/src
tar xjvf razor-agents-sdk-2.07.tar.bz2
chown -R root.root razor-agents-sdk-2.07
cd razor-agents-sdk-2.07
perl Makefile.PL
make
make test
make install
cd /usr/local/src
tar xjvf razor-agents-2.84.tar.bz2
cd razor-agents-2.84
perl Makefile.PL
make
make test
make install
cd /usr/local/src
tar xjvf pyzor-0.5.0.tar.bz2
chown -R root.root pyzor-0.5.0
cd pyzor-0.5.0
python setup.py build
python setup.py install
pyzor discover
cd /usr/local/src
/*  SpamAssassin изисква някой модули на пърла да бъдат инсталирани. Желателно е всичко да бъде инсталирано през пърл шела. Отговаряйте положително на всеки въпрос който възниква по време на инсталацията на модулите.  */
groupadd spamd
useradd spamd -g spamd -c 'SpamD system user' -d /var/lib/spamassassin -s /bin/false
perl -MCPAN -e shell
cpan> install Bundle::CPAN
cpan> install Devel::CoreStack
cpan> install Digest::HMAC
cpan> install Digest::MD5
cpan> install Digest::SHA1
cpan> install Digest::BubbleBabble
cpan> install HTML::Parser
cpan> install HTML::Tagset
cpan> install MIME::Base64
cpan> install Getopt::Long
cpan> install Time::Local
cpan> install Time::HiRes
cpan> install HTTP::Date
cpan> install Term::ReadKey
cpan> install Net::IP
cpan> install Net::DNS
cpan> install Net::SMTP
cpan> install File::Path
cpan> install File::Basename
cpan> install File::Spec
cpan> install Test::Harness
cpan> install Test::Simple
cpan> install Net::CIDR::Lite
cpan> install Sys::Hostname::Long
cpan> install Mail::Audit
cpan> install Net::DNS::Resolver::Programmable
cpan> install Error
cpan> install NetAddr::IP
cpan> install version
cpan> install Mail::SPF
cpan> install Mail::SPF::Query
cpan> install IP::Country::Fast
cpan> install Text::Wrap
cpan> install Parse::Syslog
cpan> install Statistics::Distributions
cpan> install Net::Ident
cpan> install Socket6
cpan> install IO::Socket
cpan> install IO::Socket::INET6
cpan> install Net::SSLeay
cpan> install IO::Socket::SSL
cpan> install Crypt::OpenSSL::Random
cpan> install Crypt::OpenSSL::RSA
cpan> install Mail::Address
cpan> install Email::Address
cpan> install Mail::DomainKeys
cpan> install Mail::DKIM
cpan> install IO::Zlib
cpan> install Archive::Tar
cpan> install Crypt::OpenSSL::Bignum
cpan> install DB_File
cpan> install Storable
cpan> install Data::Dump
cpan> install Encode::Detect
cpan> install Mail::SpamAssassin
cpan> quit
Lockfile removed.
sa-update -D
chown -R spamd:spamd /var/lib/spamassassin/

amavis

Официалния сайт на продукта amavisd е: http://www.ijs.si/software/amavisd/
За да работи amavisd с всички познати файлове трябва някои допълнителни програми да се инсталират. За това може да погледнете файла INSTALL. След като ги инсталираме преминаваме към amavisd, за които също трябват някой пърл модули да се инсталират. Повечето вече ги има инсталирани, но това не пречи да проверим дали е така.

groupadd amavis
useradd amavis -g amavis -c 'AMaViS system user' -d /var/lib/amavis -s /bin/sh
perl -MCPAN -e shell
cpan> install Archive::Zip
cpan> install Compress::Zlib
cpan> install Compress::Raw::Zlib
cpan> install Convert::TNEF
cpan> install Convert::UUlib
cpan> install MIME::Base64
cpan> install MIME::Parser
cpan> install Mail::Internet
cpan> install Net::Server
cpan> install Digest::MD5
cpan> install IO::Stringy
cpan> install Time::HiRes
cpan> install Unix::Syslog
cpan> install BerkeleyDB
cpan> install Mail::DKIM
cpan> quit
Lockfile removed.
tar xzvf amavisd-new-2.7.1.tar.gz
chown -R root.root amavisd-new-2.7.1
cd amavisd-new-2.7.1
mkdir /var/lib/amavis
mkdir /var/lib/amavis/tmp
mkdir /var/lib/amavis/var
mkdir /var/lib/amavis/db
mkdir /var/lib/amavis/home
mkdir /var/lib/amavis/virusmails
chown -R amavis:amavis /var/lib/amavis
chmod -R 0750 /var/lib/amavis
cp amavisd /usr/local/sbin/
chown root /usr/local/sbin/amavisd
chmod 0755  /usr/local/sbin/amavisd
cp amavisd.conf /etc/
chown root:amavis /etc/amavisd.conf
chmod 0640 /etc/amavisd.conf

Отворете файла amavisd.conf, намиращ се в /etc директорията и го конфигурирайте, както прецените за добре.

DomainKeys / DKIM

Официалния сайт на продукта dkimproxy е: http://dkimproxy.sourceforge.net/
Може би ще се питате защо съм избрал точно DKIMproxy, някаква програмка написана на пърл. За разлика от другите програми, които разгледах, тази ми се видя най - лесна да се конфигурира и интегрира с postfix. Също така може да работи с карта на домейните (sender_map.conf), което си е голямо предимство, ако имаш повече домейни на един сървър и искаш всеки един от тях да бъде подписан с различен ключ. DKIMproxy също изисква някои модули да се инсталират предварително, вече би трябвало да сме ги инсталирали, но нека да проверим.

perl -MCPAN -e shell
cpan> install Crypt::OpenSSL::RSA
cpan> install Digest::SHA
cpan> install Mail::Address
cpan> install MIME::Base64
cpan> install Net::DNS
cpan> install Mail::DKIM
cpan> install Net::Server
cpan> install Error
cpan> quit
Lockfile removed.
tar xzvf dkimproxy-1.4.1.tar.gz
chown -R root.root dkimproxy-1.4.1
cd dkimproxy-1.4.1
mkdir /usr/local/dkimproxy
groupadd dkim
useradd dkim -g dkim -c 'DomainKeys user' -d /usr/local/dkimproxy -s /bin/sh
./configure --prefix=/usr/local/dkimproxy
make
make install
chown -R dkim:dkim /usr/local/dkimproxy
mkdir /var/run/dkimproxy
chown dkim:dkim /var/run/dkimproxy

След като е инсталиран трябва да се конфигурира и да се създадат ключовете. Ето как изглеждат файловете при мен в директорията /usr/local/dkimproxy/etc dkimproxy_in.conf

# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10021

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10027

dkimproxy_out.conf

# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10027

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10028

# specify what domains DKIMproxy can sign for (comma-separated, no spaces)
domain    example.com,second.net,third.com,four.com

# specify what signatures to add
signature dkim(c=relaxed)
signature domainkeys(c=nofws)

# specify location of the private key
keyfile   /usr/local/dkimproxy/etc/dkeys/example.com/private.key

# specify the selector (i.e. the name of the key record put in DNS)
selector  mail

# control how many processes DKIMproxy uses
#  - more information on these options (and others) can be found by
#    running `perldoc Net::Server::PreFork'.
min_servers 5
min_spare_servers 2

sender_map.conf

example.com       dkim(key=/usr/local/dkimproxy/etc/dkeys/example.com/private.key), domainkeys(key=/usr/local/dkimproxy/etc/dkeys/example.com/private.key)
second.net        dkim(key=/usr/local/dkimproxy/etc/dkeys/second.net/private.key), domainkeys(key=/usr/local/dkimproxy/etc/dkeys/second.net/private.key)
third.com      dkim(key=/usr/local/dkimproxy/etc/dkeys/third.com/private.key),  domainkeys(key=/usr/local/dkimproxy/etc/dkeys/third.com/private.key)
four.com     dkim(key=/usr/local/dkimproxy/etc/dkeys/four.com/private.key), domainkeys(key=/usr/local/dkimproxy/etc/dkeys/four.com/private.key)

Правите си един стартиращ скрипт, който да изглежда горе - долу така:

#!/bin/sh
# Start/stop/restart the dkimproxy daemon:

PIDFILEOUT=/var/run/dkimproxy/dkimproxyout.pid
PIDFILEIN=/var/run/dkimproxy/dkimproxyin.pid

dkim_start() {
  if [ -x /usr/local/dkimproxy/bin/dkimproxy.out ]; then
#    if ! ps axc | grep -q dkimproxy.out ; then
#    fi
    echo "Starting DKIM proxy OUT daemon:  /usr/local/dkimproxy/bin/dkimproxy.out --daemonized"
    /usr/local/dkimproxy/bin/dkimproxy.out --user=dkim --group=dkim --conf_file=/usr/local/dkimproxy/etc/dkimproxy_out.conf --daemonize --pidfile=/var/run/dkimproxy/dkimproxyout.pid --sender_map=/usr/local/dkimproxy/etc/sender_map.conf 
  fi
  if [ -x /usr/local/dkimproxy/bin/dkimproxy.in ]; then
    echo "Starting DKIM proxy IN daemon: /usr/local/dkimproxy/bin/dkimproxy.in --daemonized"
    /usr/local/dkimproxy/bin/dkimproxy.in --conf_file=/usr/local/dkimproxy/etc/dkimproxy_in.conf --user=dkim --group=dkim --pidfile=/var/run/dkimproxy/dkimproxyin.pid --daemonize
  fi
}

dkim_stop() {
  if [ -e "$PIDFILEOUT" ]; then
    kill $(cat $PIDFILEOUT)
    rm -f $PIDFILEOUT
  fi
  if [ -e "$PIDFILEIN" ]; then
    kill $(cat $PIDFILEIN)
    rm -f $PIDFILEIN
  fi
  # Just in case:
  killall dkimproxy 1> /dev/null 2> /dev/null
}

# See how we were called.
case "$1" in
    start)
        dkim_start
        ;;
    stop)
        dkim_stop
        ;;
    restart)
        dkim_stop
        sleep 1
        dkim_start
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart}"
        ;;
esac

Разбира се, всички стартиращи файлове могат да се изтеглят от ТУК Това е готово, сега остава да генерираме ключовете на домейните и след това да ги добавим в нейм сървъра. От файла sender_map.conf се вижда къде са ключовете.

mkdir -p /usr/local/dkimproxy/etc/dkeys/example.net
cd /usr/local/dkimproxy/etc/dkeys/example.net
openssl genrsa -out rsa.private 768
openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
mv rsa.private private.key
mv rsa.public public.key
ln -s public.key mail

ln -s public.key mail се налага, тъй като в конфигурационния файл сме посочили, че нашия селектор е mail. Повтаряме процедурата със всичките ни домейни и най - накрая оправяме правата.

chown -R dkim:dkim /usr/local/dkimproxy

Сега трябва да вземем публичния ключ и да го добавим в нейм сървъра.

cd /usr/local/dkimproxy/etc/dkeys/example.net
grep -v ^- public.key | perl -e 'while(<>){chop;$l.=$_;}print "t=y; p=$l;\n";'
или да няма объркване:
grep -v ^- public.key | perl -e 'while(<>){chop;$l.=$_;}print "$l;\n";'

Ако искате можете да си оправите и spf записа в нейм сървъра. Преди да пипате нейм сървъра и не знаете какви са параметрите на spf и domainkeys, провете в интернет, за да имате някаква представа какво правите и двата параметъра могат да накарат мейл сървърите в интернет да не приемат писма от вашият мейл сървър.

example.com.     1D      IN      TXT     "v=spf1 a mx -all"
example.com.     1D      IN      TXT     "spf2.0/pra ip4:ип–то–на–вашият–мейл–сървър ip6:ип6–то–на–вашият–мейл–сървър–ако–има–такова ptr:example.com -all"
_domainkey.example.com.  1D      IN      TXT     "t=y; o=-"
mail._domainkey.example.com.  1D      IN      TXT     "v=DKIM1; k=rsa; t=y; p=ТУКА ДОБАВЯМЕ КЛЮЧА ОТ grep КОМАНДАТА /втората/;

Остава да настроим postfix-а и може да се каже, че сме готови. Аз също не съм голям специалист по postfix, с проба - грешка и питане в мейлинг листите го нагласих. Ето как изглежда при мен файла main.cf който се намира в /etc/postfix/

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix

inet_protocols = ipv4, ipv6

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/postfix/ssl/mail.example.com.crt
smtpd_tls_key_file=/etc/postfix/ssl/mail.example.com.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

disable_vrfy_command = yes
strict_rfc821_envelopes = yes
myhostname = mail.stzbg.com
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
#mydestination = $myhostname, localhost.$mydomain, localhost
#relayhost = $mydomain
mynetworks = 44.44.44.44/32 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#mailbox_command = /usr/bin/procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
html_directory = no
message_size_limit = 30720000
virtual_mailbox_base = /var/spool/postmail
# Тук при мен uid 1004 е равно на потребител vmail, group 1005 е равно на група vmail
virtual_uid_maps = static:1004
virtual_gid_maps = static:1005
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = 
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination,
  check_helo_access hash:/etc/postfix/helo_checks,
  check_sender_access hash:/etc/postfix/helo_checks,
  check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
  reject_invalid_hostname,
  reject_unauth_pipelining,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unlisted_sender,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client accredit.habeas.com,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client iadb.isipp.com,
  reject_rbl_client dnsbl.njabl.org,
  reject_rbl_client dnsbl.sorbs.net,
  reject_rbl_client plus.bondedsender.org,
  permit

smtpd_tls_CAfile = /etc/postfix/ssl/mail.example.com.pem
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
virtual_transport = dovecot
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps = 
   proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf

# Това е старо и не се подържа във версия 2.9
# Additional for quota support
#virtual_create_maildirsize = yes
#virtual_mailbox_extended = yes
#virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
#virtual_mailbox_limit_override = yes
#virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
#virtual_overquota_bounce = yes

proxy_read_maps = $local_recipient_maps $mydestionation $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps transport_maps $mynetworks $virtual_mailbox_limit_maps

content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
smtpd_sasl_type = dovecot
smtpd_helo_required = yes
smtpd_helo_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_helo_hostname,
  reject_unknown_helo_hostname,
  reject_non_fqdn_helo_hostname,
  permit
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
manpage_directory = /usr/local/man
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq

Ето го и файла: master.cf

smtp      inet  n       -       n       -       -       smtpd
    -o smtpd_etrn_restrictions=reject
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_proxy_filter=127.0.0.1:10021
    -o smtpd_client_connection_count_limit=10
    -o content_filter=dksign:[127.0.0.1]:10027
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/bin/spamc -u ${recipient} -e /usr/local/libexec/dovecot/deliver -d ${recipient}

pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
        -o smtp_fallback_relay=
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
dnsblog   unix  -       -       n       -       0       dnsblog
tlsproxy  unix  -       -       n       -       0       tlsproxy

smtp-amavis unix -      -       n     -       2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

127.0.0.1:10025 inet n  -       -     -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
    -o local_header_rewrite_clients=

127.0.0.1:10030 inet n  -       n       -        -      smtpd
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o receive_override_options=no_unknown_recipient_checks

dksign    unix  -       -       n       -       4       smtp
    -o smtp_send_xforward_command=yes
    -o smtp_discard_ehlo_keywords=8bitmime,starttls

127.0.0.1:10028 inet  n  -      n       -       10      smtpd
    -o content_filter=
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject

Ако решите да променяте част от настройките, имайте на предвид, че може да забраните някои параметри, които сте разрешили в main.cf файла. Всички файлове, които са описани в main.cf +, стартиращите скриптове и базата данни може да изтеглите от ТУКА Поиграйте си малко с файловете helo_checks и recipient_checks.pcre, можете да си ги настроите така, че да блокират писма, които не пристигат от вашия емайл сървър, а се представят, че са. След като приключите с тях изпълнявате командата:

postmap /etc/postfix/helo_checks

Създавате директория sasl и файл smtpd.conf със следното съдържание:

mkdir /etc/postfix/sasl
cd /etc/postfix/sasl
echo "pwcheck_method: auxprop" > /etc/postfix/sasl/smtpd.conf
echo "auxprop_plugin: sql" >> /etc/postfix/sasl/smtpd.conf
echo "mech_list: PLAIN LOGIN" >> /etc/postfix/sasl/smtpd.conf
echo "sql_engine: mysql" >> /etc/postfix/sasl/smtpd.conf
echo "sql_hostnames: localhost" >> /etc/postfix/sasl/smtpd.conf
echo "sql_user: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "sql_passwd: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "sql_database: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "#sql_verbose: yes" >> /etc/postfix/sasl/smtpd.conf
echo "sql_select: SELECT password FROM mailbox WHERE username = '%u'" >> /etc/postfix/sasl/smtpd.conf
chown root.root /etc/postfix/sasl/smtpd.conf
chmod 0640 /etc/postfix/sasl/smtpd.conf

За да може без проблемно след това да добавяте домейни, менаджирате, пощи и т.н. ви съветват да си инсталирате postfixadmin.
Ако имате някакви коментари и въпроси пишете ми на електронната поща: my email mask с радост ще Ви помогна.

Valid XHTML 1.0 Transitional Валиден CSS!