Wirtualny system pocztowy oparty o Postfix
1.
Wprowadzenie
Związane z pocztą elektroniczną potrzeby większości użytkowników Gentoo
może całkowicie zaspokajać prosty program kliencki oraz fetchmail. Do obsługi
całej domeny potrzebny jednak będzie kompletny MTA (ang. Mail Transfer Agent -
Agent Transferu Poczty). Natomiast jeśli istnieje potrzeba obsługi wielu domen,
do przesyłania całej poczty zdecydowanie potrzebne będzie coś bardziej
wydajnego. Ten system został opracowany jako eleganckie rozwiązanie tego
problemu.
System poczty wirtualnej musi być zdolny do obsługi poczty wielu domen z
wieloma użytkownikami korzystającymi z różnych interfejsów. To stwarza pewne
problemy - na przykład, co zrobić kiedy dwóch użytkowników z różnych
domen chce mieć taki sam login? Jeżeli udostępniany jest IMAP oraz SMTP-AUTH,
jak połączyć zróżnicowane systemy uwierzytelniania w jedną usługę? Jak zapewnić
bezpieczeństwo dla licznych komponentów z których zbudowany jest system? Jak
zarządzać całością?
Ten podręcznik pokaże jak zbudować system do obsługi tylu domen, z iloma jest w
stanie sobie poradzić sprzęt obsługujący wirtualnych użytkowników, dla których
nie są niezbędne konta shellowe (z dostępem do powłoki), pozwala na powtarzanie
się loginów w różnych domenach, może uwierzytelniać klientów WWW, IMAP, SMTP i
POP3 z pojedynczej bazy danych, wykorzystuje SSL dla bezpieczeństwa warstwy
transportu, ma interfejs WWW, obsługuje listy dystrybucyjne dla wszystkich domen
na serwerze oraz jest kontrolowany ze zgrabnej, scentralizowanej i łatwej w
obsłudze bazy MySQL.
System wirtualnego mailhostingu można zbudować na wiele sposobów. Przy tak wielu
możliwościach inne rozwiązanie może okazać się w konkretnym przypadku lepsze.
Warto zapoznać się zatem z projektami opisanymi na stronach
http://www.netqmail.org/ oraz http://www.exim.org/.
W tym rozwiązaniu wykorzystane będą następujące pakiety: apache, courier-IMAP,
courier-authlib, postfix, mod_php, phpmyadmin, squirrelmail, cyrus-sasl, mysql,
php oraz mailman.
Należy się upewnić, że przed kompilacją zostały włączone następujące flagi USE
/etc/make.conf: USE="mysql imap libwww maildir sasl
ssl". W przeciwnym wypadku konieczna może okazać się rekompilacja w celu
uzyskania obsługi wszystkich protokołów. Warto też wyłączyć pozostałe opcje
poczty oraz sieci - na przykład ipv6.
Ważne:
Do budowy publicznego serwera poczty niezbędna jest domena, a przynajmniej
rekord MX dla niej. Najlepiej byłoby kontrolować co najmniej dwie domeny w celu
wykorzystania nowych możliwości domen wirtualnych.
|
Ważne:
Należy upewnić się, że /etc/conf.d/hostname jest ustawione na
właściwą nazwę hosta dla serwera poczty. Zmiany można zastosować uruchamiając
/etc/init.d/hostname restart. Należy sprawdzić czy nazwa jest właściwie
skonfigurowana przy użyciu hostname. Należy też sprawdzić czy nie ma
sprzecznych wpisów w /etc/hosts
|
Uwaga:
Zalecane jest przeczytanie całego dokumentu i zapoznanie się z wszystkimi
krokami przed podjęciem instalacji. Jeżeli w trakcie wykonywania któregokolwiek
z etapów wystąpią problemy, należy skonsultować się ze znajdującym się na końcu
podręcznika rozdziałem poświęconym rozwiązywaniu problemów. Dodatkowo nie
wszystkie pakiety są niezbędne, system jest bardzo elastyczny. Na przykład,
jeżeli nie jest potrzebny interfejs WWW, można bez obaw zignorować rozdział
poświęcony Squirrelmail.
|
2.
Podstawy Postfiksa
Listing 2.1: Instalacja Postfiksa |
# emerge postfix
|
Ostrzeżenie:
Należy upewnić się, że nie jest zainstalowany żaden inny MTA (np. ssmtp, exim
albo netqmail) albo z pewnością wystąpią DUŻE problemy.
|
Po instalacji Postfiksa należy go skonfigurować. Następujące opcje w
/etc/postfix/main.cf powinny zostać zmienione, oczywiście
wszystkie $zmienne należy zastąpić własnymi wartościami:
Listing 2.2: /etc/postfix/main.cf |
myhostname = $host.domain.name
mydomain = $domain.name
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain $mydomain
mynetworks = numer.mojej.sieci.ip/24, 127.0.0.0/8
home_mailbox = .maildir/
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
|
Następnie należy zmienić /etc/postfix/master.cf. To spowoduje
zwiększenie ilości komunikatów, co ułatwi znajdowanie błędów.
Listing 2.3: /etc/postfix/master.cf |
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (50)
#
==========================================================================
smtp inet n - n - - smtpd -v
|
Do pliku /etc/mail/aliases trzeba dodać lokalne aliasy. Musi być co
najmniej jeden wpis dla użytkownika root, taki jak root: twój@adres.email
Listing 2.4: Pierwsze uruchomienie Postfiksa |
# /usr/bin/newaliases
# /etc/init.d/postfix start
|
Teraz, gdy Postfix działa, należy wysłać do siebie wiadomość testową przy użyciu
wybranego klienta poczty. Autor tego dokumentu pod konsolą do całej poczty używa
programu mutt. Należy sprawdzić czy poczta dociera do lokalnych
użytkowników, następnie można przejść do następnego kroku.
Uwaga:
Jest bardzo zalecane, aby zweryfikować czy Postfix działa poprawnie przed
przejściem do czynności opisanych w dalszej części tekstu.
|
3.
Courier-IMAP
Listing 3.1: Emergowanie courier-imap i courier-authlib |
# emerge courier-imap courier-authlib
|
Listing 3.2: Konfiguracja Courier-IMAP |
# cd /etc/courier-imap
# nano -w pop3d.cnf
# nano -w IMAPd.cnf
# mkpop3dcert
# mkIMAPdcert
|
Listing 3.3: Uruchomienie usług Courier IMAP |
# /etc/init.d/courier-IMAPd start
# /etc/init.d/courier-IMAPd-ssl start
# /etc/init.d/courier-pop3d start
# /etc/init.d/courier-pop3d-ssl start
|
Teraz należy uruchomić klienta poczty i upewnić się, że wszystkie uruchomione
połączenia działają przy odbiorze i wysyłaniu poczty. Oczywiście nie będzie
możliwe zalogowanie się na żadną z usług, ponieważ nie skonfigurowaliśmy jeszcze
autoryzacji. Warto jednak sprawdzić czy połączenie jest nawiązywane.
Gdy działają już podstawowe komponenty, pora na skonfigurowanie reszty systemu.
Przed przejściem do dalszych kroków należy dokładnie sprawdzić czy to co
zainstalowaliśmy do tej pory działa poprawnie.
4.
Cyrus-sasl
Następnie zainstalowany zostanie cyrus-sasl. SASL służy do przekazywania
parametrów uwierzytelniających do courier-auth, który z kolei przekaże je do
MySQL w celu uwierzytelnienia użytkowników SMTP. W tym podręczniku nawet nie
spróbujemy sprawdzić czy SASL działa przed instalacją MySQL oraz założeniem
testowego konta użytkownika. Nie stanowi to problemu, bo w ostateczności
autoryzacja będzie i tak następowała za pośrednictwem MySQL.
Listing 4.1: Konfiguracja oraz instalacja Cyrus-sasl |
# emerge cyrus-sasl
|
Następnie należy zmodyfikować /etc/sasl2/smtpd.conf.
Listing 4.2: Uruchamianie SASL |
# nano -w /etc/sasl2/smtpd.conf
mech_list: PLAIN LOGIN
pwcheck_method: saslauthd
# nano -w /etc/conf.d/saslauthd
SASLAUTHD_OPTS="${SASLAUTH_MECH} pam -r"
# /etc/init.d/saslauthd start
|
5.
Certyfikaty SSL dla Postfiksa i Apache
Następnie założymy zestaw certyfikatów ssl dla Postfiksa i Apache.
Listing 5.1: Tworzenie certyfikatów SSL |
# cd /etc/ssl/
# nano -w openssl.cnf
countryName_default
stateOrProvinceName_default
localityName_default
0.organizationName_default
commonName_default
emailAddress_default.
# cd misc
# ./CA.pl -newreq-nodes
# ./CA.pl -newca
# ./CA.pl -sign
# cp newcert.pem /etc/postfix
# cp newkey.pem /etc/postfix
# cp demoCA/cacert.pem /etc/postfix
# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 365
|
6.
Dodawanie obsługi SSL oraz SASL do Postfiksa
Konieczna jest też modyfikacja konfiguracji Postfiksa tak, aby uczynić go
świadomym obecności SASL oraz SSL. W tym celu dodajemy następujące wpisy na
końcu pliku, gdzie będzie łatwo je potem odnaleźć:
Listing 6.1: /etc/postfix/main.cf |
# nano -w /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/newkey.pem
smtpd_tls_cert_file = /etc/postfix/newcert.pem
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# postfix reload
|
Teraz zweryfikujemy czy nasza konfiguracja została przyjęta przez
Postfiksa. W tym celu skorzystamy z programu telnet (z pakietu, na
przykład, net-misc/netkit-telnetd). Można również skorzystać z nc
z pakietu net-analyzer/netcat.
Listing 6.2: Weryfikacja wsparcia dla SASL oraz TLS |
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domain.com ESMTP Postfix
EHLO domain.com
250-mail.domain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
^]
telnet> quit
|
Należy upewnić się, że w powyższym występują linie AUTH oraz STARTTLS. Jak
zostało wcześniej napisane, w tej chwili AUTH nie będzie działać. Jest tak
ponieważ SASL będzie próbował uwierzytelniać względem pliku shadow tylko sasldb,
który z pewnych przyczyn nie został skonfigurowany. W takim razie musimy
skonfigurować MySQL aby ten utrzymywał wszystkie informacje związane z
uwierzytelnianiem oraz wirtualnymi domenami.
7.
Użytkownik vmail
Zanim przystąpimy do tworzenia całego środowiska hostingu poczty, musimy
utworzyć konto użytkownika, do którego cały ten hosting będzie należał.
Najprościej będzie jeśli nazwiemy go vmail:
Listing 7.1: Dodawanie konta vmail |
# adduser -d /home/vmail -s /bin/false -m vmail
|
W ten sposób konto zostało utworzone. Oczywiście można stworzyć ich kilka. Id
kont, id ich grup oraz ich katalogi domowe będą wpisane w tabelach MySQL.
Po utworzeniu konta użytkownika należy utworzyć katalog w którym będą
znajdowały się skrzynki pocztowe.
Listing 7.2: Tworzenie skrzynek |
# mkdir -p /home/vmail/virt-domain.com/foo
# chown -R vmail:vmail /home/vmail/virt-domain.com
# maildirmake /home/vmail/virt-domain.com/foo/.maildir
|
8.
MySQL
Następnie zainstalujemy oraz skonfigurujemy MySQL. W tym kroku niezbędny będzie
plik genericmailsql.sql
Listing 8.1: Instalacja oraz konfiguracja MySQL |
# emerge mysql
# /usr/bin/mysql_install_db
# /etc/init.d/mysql start
# mysqladmin -u root -p create mailsql
# mysql -u root -p mailsql < genericmailsql.sql
# mysql -u root -p mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE
-> ON mailsql.*
-> TO mailsql@localhost
-> IDENTIFIED BY '$password';
Query OK, 0 rows affected (0.02 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
# mysql -u mailsql -p mailsql
|
Nowa baza danych ma zdefiniowane domyślne wartości i tablice dla dwóch
domen. Założone zostają następujące tabele:
- alias - lokalne aliasy email oraz informacje o aliasach Mailmana.
- relocated - adresy przeniesionych użytkowników oraz mapy adresów.
-
transport - informacja o domyślnych transportach pocztowych dla
wszystkich domen które są utrzymywane na serwerze.
- users - informacja o kontach użytkowników.
- virtual - mapy aliasów dla domen wirtualnych.
Listing 8.2: Przykładowa tabela aliasów |
id alias destination
1 root foo@bar.com
2 postmaster foo@bar.com
|
Listing 8.3: Przykładowa tabela użytkowników |
id email clear name uid gid homedir \
maildir quota postfix
10 foo@virt-domain.org $password realname virtid virtid /home/vmail \
/home/vmail/virt-domain.org/foo/.maildir/ y
13 foo@bar.com $password realname localid localid /home/foo \
/home/foo/.maildir/ y
|
Wartość virtid w polach uid oraz gid powinny zostać zastąpione
odpowiednimi wartościami dla użytkownika vmail.
Listing 8.4: Przykładowa tabela transportów |
id domain destination
1 bar.com local:
2 virt-domain.org virtual:
|
Listing 8.5: Przykładowa tabela virtual |
id email destination
3 root@virt-domain.org other@email.address
|
9.
Apache oraz phpMyAdmin
Teraz skonfigurujemy Apache oraz dodamy interfejs ułatwiający współpracę z bazą
danych.
Listing 9.1: Instalacja Apache oraz phpMyAdmin |
# emerge apache phpmyadmin
|
Opisów konfiguracji PHP dla Apache jest wiele, na przykład te na stronach
projektu Gentoo PHP. Jest także wiele postów na
http://forums.gentoo.org opisujących jak rozwiązać problemy z
instalacją (wyszukiwanie 'apache php'). W związku z tym proces ten nie będzie
tutaj opisany. Należy skonfigurować Apache oraz PHP, następnie powrócić do tego
podręcznika. Dobra rada: powinno się zabezpieczyć katalog z phpMyAdmin plikiem
.htaccess. Jeśli się tego nie zrobi, automaty przeszukujące sieć WWW odnajdą go
i zindeksują, po czym każdy użytkownik będzie w stanie odnaleźć go oraz
wyrzystać do dowolnego modyfikowania bazy - co jest ZŁE! Jest wiele
podręczników opisujących jak tego uniknąć, na przykład
http://www.csoft.net/docs/micro/htaccess.html.en.
Teraz można zainstalować certyfikaty Apache, które wcześniej przygotowaliśmy.
Dyrektywy Apache-SSL których należy użyć są następujące:
- SSLCertificateFile /ścieżka/do/certyfikatów/new.cert.cert
- SSLCertificateKeyFile /ścieżka/do/certyfikatów/new.cert.key
Listing 9.2: Instalacja certyfikatów SSL dla Apache |
# cp /etc/ssl/misc/new.cert.cert /etc/apache2/ssl/
# cp /etc/ssl/misc/new.cert.key /etc/apache2/ssl/
# cd /etc/apache2/vhosts.d
# cp 00_default_vhost.conf ssl-vhost.conf
# nano -w ssl-vhost.conf
NameVirtualHost host.domain.name:443
<VirtualHost host.domain.name:443>
ServerName host.domain.name
ServerAdmin your@email.address
DocumentRoot "/var/www/localhost/htdocs/phpmyadmin";
<Directory "/var/www/localhost/htdocs/phpmyadmin">
...
</Directory>
SSLCertificateFile /etc/apache2/ssl/new.cert.cert
SSLCertificateKeyFile /etc/apache2/ssl/new.cert.key
SSLEngine on
...
</VirtualHost>
# nano -w /etc/conf.d/apache2
# /etc/init.d/apache restart
|
Teraz konfigurujemy phpMyAdmin.
Listing 9.3: Konfiguracja phpMyAdmin |
# cd /var/www/localhost/htdocs/phpmyadmin
# cp config.sample.inc.php config.inc.php
# nano -w config.inc.php
$cfg['blowfish_secret'] = 'someverysecretpassphraze';
$cfg['Servers'][$i]['host'] = 'localhost'; // Nazwa serwera MySQL
$cfg['Servers'][$i]['controluser'] = 'mailsql'; // Użytkownik kontroli MySQL
// (ten użytkownik musi mieć
$cfg['Servers'][$i]['controlpass'] = '$password'; // dostęp tylko-do-odczytu
// do bazy i tabel "mysql/db")
$cfg['Servers'][$i]['user'] = 'mailsql'; // Użytkownik MySQL
$cfg['Servers'][$i]['password'] = '$password'; // Hasło MySQL
|
Teraz przejdziemy na stronę phpMyAdmin, aby przeglądać tabele. Można tu dodać
lokalna aliasy, edytować tablicę użytkowników aby dodać użytkownika testowego
oraz zmienić tabelę transportów aby dodać właściwe domeny. Domyślne wpisy
dostarczone razem z wstępnym plikiem powinny być wystarczającą podpowiedzią co
do tego gdzie co należy. Należy się upewnić, że informacja umieszczona w bazie
danych jest dokładna, na przykład że katalogi domowe istnieją oraz że wartości
uid/gid są poprawne. Katalogi maildir powinny zostać założone automatycznie
przez Postfiksa gdy użytkownik otrzyma swojego pierwszego emaila. W praktyce
dobrze jest wysłać email powitalny do każdego nowego użytkownika, aby upewnić
się, że katalog .maildir zostanie założony.
10.
Konfiguracja vhostów oraz uwierzytelniania MySQL
Zmienimy konfigurację uwierzytelniania tak, aby korzystała z bazy danych
mailsql dla Courier-IMAP oraz Postfiksa. W następującym przykładzie należy
zamienić $password hasłem użytkownika mailsql.
Listing 10.1: Konfiguracja uwierzytelniania |
# nano -w /etc/courier/authlib/authdaemonrc
authmodulelist="authmysql authpam"
# nano -w /etc/courier/authlib/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME mailsql
MYSQL_PASSWORD $password
MYSQL_DATABASE mailsql
MYSQL_USER_TABLE users
#MYSQL_CRYPT_PWFIELD crypt
MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
# /etc/init.d/courier-authlib restart
# /etc/init.d/saslauthd restart
|
Wszystko jest prawie gotowe. Teraz trzeba jeszcze skonfigurować resztę Postfiksa
do współpracy z bazą danych dla wszystkich potrzeb transportowych. Każda z
wartości musi zostać zastąpiona odpowiednią nazwą użytkownika, jego id, hasłem,
aliasem, adresem e-mail i tak dalej.
Listing 10.2: /etc/postfix/mysql-aliases.cf |
# nano -w /etc/postfix/mysql-aliases.cf
# mysql-aliases.cf
user = mailsql
password = $password
dbname = mailsql
table = alias
select_field = destination
where_field = alias
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.3: /etc/postfix/mysql-relocated.cf |
# nano -w /etc/postfix/mysql-relocated.cf
# mysql-relocated.cf
user = mailsql
password = $password
dbname = mailsql
table = relocated
select_field = destination
where_field = email
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.4: /etc/postfix/mysql-transport.cf (opcjonalnie) |
# nano -w /etc/postfix/mysql-transport.cf
# mysql-transport.cf
user = mailsql
password = $password
dbname = mailsql
table = transport
select_field = destination
where_field = domain
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.5: /etc/postfix/mysql-virtual-gid.cf (opcjonalnie) |
# nano -w /etc/postfix/mysql-virtual-gid.cf
# mysql-virtual-gid.cf
user = mailsql
password = $password
dbname = mailsql
table = users
select_field = gid
where_field = email
additional_conditions = and postfix = 'y'
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.6: /etc/postfix/mysql-virtual-maps.cf |
# nano -w /etc/postfix/mysql-virtual-maps.cf
#myql-virtual-maps.cf
user = mailsql
password = $password
dbname = mailsql
table = users
select_field = maildir
where_field = email
additional_conditions = and postfix = 'y'
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.7: /etc/postfix/mysql-virtual-uid.cf (opcjonalnie) |
# nano -w /etc/postfix/mysql-virtual-uid.cf
# mysql-virtual-uid.cf
user = mailsql
password = $password
dbname = mailsql
table = users
select_field = uid
where_field = email
additional_conditions = and postfix = 'y'
hosts = unix:/var/run/mysqld/mysqld.sock
|
Listing 10.8: /etc/postfix/mysql-virtual.cf |
# nano -w /etc/postfix/mysql-virtual.cf
# mysql-virtual.cf
user = mailsql
password = $password
dbname = mailsql
table = virtual
select_field = destination
where_field = email
hosts = unix:/var/run/mysqld/mysqld.sock
|
Na koniec edytujemy jeszcze raz /etc/postfix/main.cf.
Listing 10.9: /etc/postfix/main.cf |
# nano -w /etc/postfix/main.cf
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
relocated_maps = mysql:/etc/postfix/mysql-relocated.cf
local_transport = local
local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname
virtual_transport = virtual
virtual_mailbox_domains =
virt-domain.com, $inna-domena-wirtualna.com
virtual_minimum_uid = 1000
virtual_gid_maps = static:$vmail-gid
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
virtual_uid_maps = static:$vmail-uid
virtual_mailbox_base = /
#virtual_mailbox_limit =
|
Ze względów bezpieczeństwa należy zmodyfikować uprawnienia plików
/etc/mail/mysql-*.cf:
Listing 10.10: Modyfikacja uprawnień |
# chmod 640 /etc/postfix/mysql-*.cf
# chgrp postfix /etc/postfix/mysql-*.cf
|
Pomiędzy wersjami Postfiksa 2.0.x oraz 1.1.x wystąpiło kilka istotnych zmian. W
szczególności tablice transport, virtual-gid oraz virtual-uid nie są już
niezbędne. Nadal są one dostępne, na wypadek, gdyby okazały się przydatne.
Uwaga:
Zalecane jest przeczytanie pliku VIRTUAL_README dołączonego do dokumentacji
Postfiksa w celu uzyskania dalszych informacji.
|
Listing 10.11: Niech Postfix przeładuje swoje tablice |
# postfix reload
|
Jeśli wszystko się powiodło malhost powinien już działać. Użytkownicy powinni
być w stanie uwierzytelniać się dla POP3, IMAP oraz SMTP. Zalecane jest
sprawdzenie czy w tej chwili wszystko działa. Jeżeli pojawią się jakiekolwiek
problemy(przy tak licznych elementach systemu jest to dość prawdopodobne) należy
skonsultować się z rozdziałem poświęconym rozwiązywaniu problemów.
11.
Squirrelmail
Listing 11.1: Instalacja Squirrelmail |
# emerge squirrelmail
# webapp-config -I -h localhost -d /mail squirrelmail 1.4.3a-r2
# cd /var/www/localhost/htdocs/mail/config
# perl ./conf.pl
|
12.
Mailman
Krok ostatni: mailman. Najnowsza wersja Mailmana ma bardzo przyjemne wsparcie
dla domen wirtualnych, co jest przyczyną dla której autor z niego korzysta - nie
wspominając o tym, że jest to świetny pakiet. Aby zainstalować oraz prawidłowo
skonfigurować go dla domen wirtualnych potrzebne będzie nieco hackerstwa.
Zdecydowanie zalecane jest przeczytanie całej dokumentacji mailmana, w
szczególności plik README.POSTFIX.gz, aby zrozumieć, co teraz zostanie zrobione.
Listing 12.1: Instalacja mailmana |
# emerge mailman
|
Listing 12.2: Konfigurowanie wartości domyślnych: Mailman/Defaults.py |
# nano -w /usr/local/mailman/Mailman/Defaults.py
DEFAULT_EMAIL_HOST = 'domain.com'
DEFAULT_URL_HOST = 'www.domain.com'
|
Listing 12.3: Konfiguracja mailmana: mm_cfg.py |
# nano -w /usr/local/mailman/Mailman/mm_cfg.py
MTA = "Postfix"
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['virt-domain.com', 'virt.domain2.com']
add_virtualhost('www.virt.domain.com', 'virt.domain.com')
add_virtualhost('www.virt.domain2.com', 'virt.domain2.com')
|
Listing 12.4: Na koniec... |
# su mailman
# cd ~
# ./bin/newlist --urlhost='www.virt-domain.com' --emailhost='virt-domain.com' test
Enter the email of the person running the list: Twój@adres.email
Initial test password:
Hit enter to continue with test owner notification...
# bin/genaliases
# nano -w data/aliases
# STANZA START: test
# CREATED:
test: "|/usr/local/mailman/mail/mailman post test"
test-admin: "|/usr/local/mailman/mail/mailman admin test"
test-bounces: "|/usr/local/mailman/mail/mailman bounces test"
test-confirm: "|/usr/local/mailman/mail/mailman confirm test"
test-join: "|/usr/local/mailman/mail/mailman join test"
test-leave: "|/usr/local/mailman/mail/mailman leave test"
test-owner: "|/usr/local/mailman/mail/mailman owner test"
test-request: "|/usr/local/mailman/mail/mailman request test"
test-subscribe: "|/usr/local/mailman/mail/mailman subscribe test"
test-unsubscribe: "|/usr/local/mailman/mail/mailman unsubscribe test"
# STANZA END: test
# ./bin/newlist mailman
# ./bin/genaliases
# exit
# /etc/init.d/mailman start
# rc-update add mailman default
|
Listing 12.5: Dodawanie wsparcia dla aliasów mailmana do Postfiksa |
# nano -w /etc/postfix/main.cf
owner_request_special = no
recipient_delimiter = +
alias_maps =
hash:/usr/local/mailman/data/virtual-mailman,
mysql:/etc/postfix/mysql-aliases.cf
virtual_alias_maps =
hash:/var/mailman/data/virtual-mailman,
mysql:/etc/postfix/mysql-virtual.cf
|
Listy dystrybucyjne powinny już działać na wszystkich domenach obsługiwanych
przez serwer. Należy uważać, aby wszystkie polecenia dla Mailmana wydawać jako
użytkownik mailman (su mailman) - w przeciwnym wypadku uprawnienia będą
nieprawidłowe i konieczna będzie korekta. W dokumentacji Mailmana można znaleźć
więcej informacji na temat jego konfiguracji i zarządzania.
13.
Filtrowanie zawartości oraz obrona antywirusowa
Dla filtrowania zawartości oraz obrony antywirusowej należy skonsultować się z
naszym opisem konfiguracji bramy
filtrującej pocztę.
14.
Zakończenie
Teraz, gdy wszystko jest gotowe, należy zmodyfikować
/etc/postfix/master.cf oraz wyłączyć szczegółowe informowanie o
przebiegu procesu (verbose). Prawdopodobnie będzie również potrzebne dodanie
usług do procesu standardowego. Należy upewnić się, że dodane są wszystkie
wykorzystane usługi - apache, mysql, saslauthd, postfix, courier-imapd,
courier-imapd-ssl, courier-pop3d oraz courier-pop3d-ssl. U autora wszystkie te
usługi są zazwyczaj uruchomione.
Listing 14.1: Wykończenie |
# postfix reload
# rc-update add $service default
|
Życzymy udanej zabawy!
15.
Rozwiązywanie problemów
Wprowadzenie
Rozwiązywanie problemów: to jest krótki przewodnik rozwiązywania problemów które
mogą wystąpić podczas instalacji systemu tutaj opisanego. Nie jest on
wyczerpujący - jest pomyślany raczej jako miejsce, gdzie można rozpocząć
wyszukiwanie rozwiązań problemów. Dla skomplikowanego systemu taki jak ten
bardzo istotne jest, aby zawęzić poszukiwania do konkretnego komponentu który
nie funkcjonuje prawidłowo. Zwykle robi się to w kilku krokach. Rozpoczyna się
od podstawy systemu i kontynuuje "do góry", wyłączając z poszukiwania
komponenty, które działają prawidłowo, aż do momentu odnalezienia komponentu,
który sprawia problemy.
Krok 1: Sprawdzenie plików konfiguracyjnych
Literówki są poważnym problemem, szczególnie w przypadku systemów
uwierzytelniania. Należy teraz przejrzeć konfigurację oraz bazę mailsql w
poszukiwaniu tego rodzaju błędów. Debugować można dowolnie długo, ale jeżeli
system ne otrzymuje właściwej informacji to nie będzie on działał. Po zmianie
konfiguracji należy pamiętać o przeładowaniu usługi tak, aby zmiany zostały
przyjęte.
Listing 15.1: Przeładowanie usługi |
# /etc/init.d/service restart
|
Krok 2: Czy wszystkie potrzebne usługi działają?
Jeżeli któraś z usług nie działa - należy ją uruchomić. Naprawdę trudno jest
debugować usługę która nie jest włączona. Czasem niektóre usługi zachowują się
tak, jakby działały, ale jednak nie funkcjonują. Czasem, gdy konfiguracje jest
błędna albo któryś z komponentów otrzyma nieprawidłową transmisję usługa
zawiesi się i zablokuje port, uniemożliwiając ponowne jej uruchomienie. Często
można to wykryć przy użyciu netstata. Ewentualnie można zwyczajnie zrestartować
system - usunie to wszystkie zawieszone usługi.
Listing 15.2: Sprawdzanie stanu usług: |
# /etc/init.d/$usługa status
# netstat -a | grep $usługa (lub $port)
|
Krok 3: Czy wszystkie usługi korzystają z aktualnej konfiguracji?
Jeżeli plik konfiguracyjny był modyfikowany to restartujemy usługę, której on
dotyczył, aby upewnić się, że wykorzystuje ona aktualną jego wersję. Niektóre
usługi potrafią pokazać swoją aktualną konfigurację - na przykład Postfix.
Listing 15.3: Niektóre usługi potrafią pokazać swoją konfigurację |
# apache2ctl fullstatus (wymaga zainstalowania pakietu lynx)
# apache2ctl configtest (sprawdza konfigurację)
# /etc/init.d/$service restart
|
Krok 4: Logi
Następnym krokiem powinno być przeczytanie logów. Czasem praktycznie jest
ponowić nieudaną operację i następnie sprawdzić logi - wtedy komunikat błędu
jest dokładnie na dole (albo na górze, zależnie od loggera) w przeciwieństwie do
znajdowania się gdzieś w głębi pliku. Należy sprawdzić czy w logach znajduje się
jakakolwiek informacja przydatna w diagnostyce błędu albo przynajmniej w
określeniu, który komponent sprawia kłopoty.
Listing 15.4: Sprawdzanie logów: |
# kill -USR1 `ps -C metalog -o pid=`(aby wyłączyć buforowanie metaloga)
# nano -w /var/log/mail/current
# cat /var/log/mysql/mysql.log
# tail /var/log/apache2/error_log
|
Warto też sprawdzić parametr debug_peer w pliku main.cf. Ustawienie go zwiększy
ilość danych wysyłanych do loga.
Listing 15.5: Dodawanie wsparcia dla debug_peeer |
# nano -w /etc/postfix/main.cf
debug_peer_level = 5
debug_peer_list = $host.domain.name
|
Krok 5: Rozmowa z usługą
SMTP, IMAP oraz POP3 odpowiadają na połączenia za pomocą telnetu - co było
zademonstrowane podczas weryfikacji konfiguracji Postfiksa. Czasem warto jest
otworzyć sesję do usługi i zobaczyć, co się dzieje.
Listing 15.6: Połączenie telnetowe z usługą |
# telnet localhost $port
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.
|
Krok 6: Wytaczamy artylerię: strace
Zawsze warto mieć ten program na podorędziu. Jest to nieocenione narzędzie do
debugowania oprogramowania. Można dzięki niemu uruchamiać programy z linii
poleceń i obserwować wszystkie wywołania systemowe, które one wykonują. Często
zrzuca on ogromne ilości danych, więc konieczne będzie albo obserwowanie go w
czasie wykonywania testów albo zrzucenie danych do pliku na później.
Listing 15.7: Użycie strace |
# emerge strace
# strace $command
# strace -p `ps -C $service -o pid=`
|
Krok 7: Badania
Dość często zebrane do tej pory informacje okażą się wystarczające do diagnozy
oraz korekty problemu. W przeciwnym wypadku potrzebne może się okazać będzie
przeszukanie sieci w poszukiwaniu dalszych danych. Poniżej znajduje się lista
stron, które warto odwiedzić w trakcie tego procesu. Jest tu również bardzo
dobry podręcznik opisujący konfigurację SMTP-AUTH, zawierający kilka świetnych
pomysłów na znajdowanie błędów.
|