Instalacja systemu pocztowego na Ubuntu
Zakładam, że system jest zainstalowany i posiada podstawową konfigurację z uruchomioną usługą SSH. Po zalogowaniu przystępujemy do instalacji pakietu dovecot-postfix, który opisany jest jako w pełni funkcjonalny serwer pocztowy:
drfugazi@charr:~% sudo aptitude install dovecot-postfix
[sudo] password for drfugazi:
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Reading extended state information
Initializing package states... Gotowe
The following NEW packages will be installed:
dovecot-common{a} dovecot-imapd{a} dovecot-pop3d{a} dovecot-postfix
0 packages upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 7957kB of archives. After unpacking 15,1MB will be used.
Do you want to continue? [Y/n/?] y
...
Konfigurowanie dovecot-common (1:1.2.9-1ubuntu6.1) ...
Creating config file /etc/dovecot/dovecot.conf with new version
Creating config file /etc/dovecot/dovecot-ldap.conf with new version
Creating config file /etc/dovecot/dovecot-sql.conf with new version
Sprawdzamy czy działa serwer Dovecot i czy da się połączyć do serwera IMAP z localhosta:
drfugazi@charr:~% ps axu|grep dovecot
root 13772 0.0 0.0 2320 700 ? Ss Nov19 0:00 /usr/sbin/dovecot -c /etc/dovecot/dovecot.conf
root 13775 0.0 0.2 10208 2536 ? S Nov19 0:00 dovecot-auth
...
drfugazi@charr:~% telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
a LOGOUT
* BYE Logging out
a OK Logout completed.
Connection closed by foreign host.
Jeśli da się połączyć z localhosta to spróbujmy z zewnątrz:
drfugazi@neptun:~% telnet example.com 143
Trying 212.106.X.X...
telnet: Unable to connect to remote host: Connection timed out
Sprawdźmy czy Dovecot słucha na zewnętrznym interfejsie:
drfugazi@charr:~% netstat -an|grep 143
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
Słucha na wszystkich interfejsach, dodajmy więc regułę, która wpuszcza na port 143 do iptables:
sudo iptables -I INPUT -i eth0 -p tcp --syn --dport 143 -d 212.106.X.X -j ACCEPT
Ponawiamy próbę połączenia z zewnątrz:
drfugazi@neptun:~% telnet example.com 143
Trying 212.106.X.X...
Connected to example.com.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS LOGINDISABLED] Dovecot ready.
a LOGOUT
* BYE Logging out
a OK Logout completed.
Connection closed by foreign host.
Wygląda na to, że działa. Można zabrać się za serwer SMTP, tutaj użyję Postfixa. Najpierw sprawdzam jak wygląda master.cf:
drfugazi@charr:~% cd /etc/postfix
drfugazi@charr:/etc/postfix% sudo vi master.cf
[sudo] password for drfugazi:
Szczególnie interesuje nas część dotycząca submission oraz smtps, jeśli jest wykomentowana, to należy włączyć oba te bloki. Sprawdźmy przy okazji czy odpowiednie wpisy znajdują się w /etc/services:
drfugazi@charr:/etc/postfix% grep submis /etc/services
submission 587/tcp # Submission [RFC4409]
submission 587/udp
drfugazi@charr:/etc/postfix% grep smtps /etc/services
ssmtp 465/tcp smtps # SMTP over SSL
Wygląda dobrze, sprawdźmy co słychać w main.cf, tutaj na końcu pakiet dovecot-postfix dodał m.in takie linie:
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/conf.d/01-dovecot-postfix.conf -n -m "${EXTENSION}"
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
smtp_use_tls = yes
smtpd_tls_received_header = yes
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_auth_only = yes
tls_random_source = dev:/dev/urandom
Kiedyś trzeba było to konfigurować samemu wg dokumentacji, tu mamy już gotowe, na razie to zostawimy i zrobimy restart postfixa, aby uwzględnił zmiany w master.cf i uruchomił obsługę submission i smtps. Uwaga, nie wystarczy tu postfix reload, musimy go zrestartować całkiem:
drfugazi@charr:/etc/postfix% sudo service postfix stop
* Stopping Postfix Mail Transport Agent postfix [ OK ]
drfugazi@charr:/etc/postfix% sudo service postfix start
* Starting Postfix Mail Transport Agent postfix [ OK ]
Sprawdźmy czy nasz postfix słucha na odpowiednich portach: submission (587) i smtps (465):
drfugazi@charr:/etc/postfix% netstat -an|egrep "(:587|:465)"
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN
Porty są otwarte, spróbujmy się połączyć z localhosta i zagadać z Postfixem:
drfugazi@charr:/etc/postfix% telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 charr ESMTP Postfix (Ubuntu)
ehlo localhost
250-charr
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
starttls
220 2.0.0 Ready to start TLS
^]
telnet> quit
Connection closed.
Na port 465 nie będziemy się łączyć, bo tam trzeba od razu gadać SSLem. Spróbujmy połączenia z zewnątrz, oczywiście filtry muszą przepuszczać połączenia:
drfugazi@charr:/etc/postfix% sudo iptables -L -n|egrep "(:465|:587)"
drfugazi@charr:/etc/postfix% sudo iptables -I INPUT -i eth0 -p tcp --syn --dport 587 -d 212.106.X.X -j ACCEPT
drfugazi@charr:/etc/postfix% sudo iptables -I INPUT -i eth0 -p tcp --syn --dport 465 -d 212.106.X.X -j ACCEPT
drfugazi@charr:/etc/postfix% sudo iptables -L -n|egrep "(:465|:587)"
ACCEPT tcp -- 0.0.0.0/0 212.106.X.X tcp dpt:465 flags:0x17/0x02
ACCEPT tcp -- 0.0.0.0/0 212.106.X.X tcp dpt:587 flags:0x17/0x02
drfugazi@charlie:~% telnet example.com 587
Trying 212.106.X.X...
Connected to example.com.
Escape character is '^]'.
220 charr ESMTP Postfix (Ubuntu)
ehlo test
250-charr
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
starttls
220 2.0.0 Ready to start TLS
^]
telnet> quit
Connection closed.
Teraz proponuję skonfigurować jakiś program pocztowy i sprawdzić czy można się zalogować do poczty z użytkownika, którego mamy w systemie. Oczywiście finalnie mamy mieć wirtualne domeny i wirtualnych użytkowników w LDAP, ale proponuję zacząć od użytkownika systemowego i dopiero jak zadziała to posuwać się dalej. Jeśli do tej pory coś poszło nie tak, to trzeba sprawdzić w logach komunikat błędu i podjąć odpowiednie działania. W razie czego proszę pytać w komentarzach, spróbuję jakoś pomóc.
Mój Thunderbird automagicznie skonfigurował się do obsługi IMAP z TLS na porcie 143 oraz SMTP z TLS na porcie 587, to bardzo dobra konfiguracja. Jeśli klient tego nie potrafi obsłużyć, to można użyć portu 993 do IMAP z SSL lub 955 do POP3 z SSL i 465 do SMTP z SSL albo… zmienić klienta poczty 😉
Spróbujmy wysłać maila, najlepiej na jakieś swoje zewnętrzne konto, a następnie odpisać na tegoż maila, sprawdzimy w ten sposób przesyłanie w obie strony. Jeśli coś pójdzie nie tak, to znów trzeba spojrzeć w logi i ewentualnie naprawić.