Postfix jest kompatybilny z Sendmailem jednak jest łatwiejszy w konfiguracji, administracji, jest bardziej modularny, bardziej bezpieczny i oferuje większą wydajność. Zawiera taką funkcjonalność jak dopasowywanie wzorców do filtrowania niechcianej poczty, ponadto wspiera wiele wirtualnych domen w ramach jednego systemu.
Demonem Postfixa jest master zlokalizowany w katalogu /usr/libexec/postfix. Aby wykonać swoje zdania demon uruchamia na żądanie procesy takich agentów jak nqmgr, pickup oraz smtpd. Każdy agent ma swoja małą dobrze zdefiniowaną funkcję i pracuje z minimalnymi uprawnieniami. Manadżer kolejki nqmgr jest odpowiedzialny za wysyłkę maili i lokalne dostarczanie. Agent pickup przekazuje komunikaty z katalogu /var/spool/postfix do /var/spool/mail we współpracy z agentem smtpd. Procesy agentów zostają zakończone po wykonaniu przez nich swojego zadania lub bo pozostawaniu nieaktywnym przez określony czas. Proces master i inni agenci współpracują w zarządzaniu całym systemem poczty.
Komendy Postfixa.
# alternatives
– wyświetla i ustawia domyślnego MTA.
# mail/mailx
– wysyła i odbiera maile.
# postalias/newaliases
– przetwarza bazę aliasów składowaną w pliku /etc/aliases.
# postconf
– wyświetla i modyfiikuje konfigurację Postfixa składowaną w pliku main.cf.
# postfix
– kontroluje wszelkie operacje Postfixa, takie jak uruchamianie, zatrzymywanie, sprawdzanie stanu i przeładowywanie konfiguracji.
# postmap
– przetwarza i konwertuje niektóre pliki konfiguracyjne do bazy kompatybilnej z Postfixem.
# postqueue/mailq
– wyśwwietla i kontroluje kolejkę Postfixa.
Pliki konfiguracyjne Postfixa.
Pliki te (z wyjątiem pliku/etc/aliases
) składowane są w katalogu /etc/postfix
.
main.cf
– podstawowy plik konfiguracyjny, niektóre jego dyrektywy:
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
myhostname = host2.example.com
mydomain = example.com
myorigin = $myhostname
inet_interfaces = localhost
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 192.168.2.0/24, 127.0.0.0/8
relayhost = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/spool/mail
Dyrektywa | Opis |
queue_directory |
Położenie kolejki Postfixa. |
command_directory |
Położenie komend Postfixa. |
daemon_directory |
Położenie demonów Postfixa. |
mail_owner |
Właściciel demonów Postfixa i kolejki |
myhostname |
Pełna nazwa domenowa serwera. |
mydomain |
Domena serwera. |
myorigin |
Host lub domena, która ma być wyświetlana jako pochodzenie na mailach wychodzących z serwera. |
inet_interfaces |
Interfejsy sieciowe jakie mają być używane do przychodzącej poczty. |
mydestination |
Domeny, z których serwer akceptuje pocztę. |
mynetworks |
Adres IP zaufanych sieci. |
relayhost |
Host lub inny serwer poczty, przez który będzie przesyłana poczta. Ten serwer będzie pełnił rolę bramy wychodzącej. |
alias_maps |
Baza aliasów używana przez agenta lokalnego dostarczania. |
alias_database |
Baza aliasów generowana komendą newaliases. |
mail_spool_directory |
Lokalizacja, w której składowane będą skrzynki użytkowników. |
Wyświetlanie domyślnych (-n) ustawień, które są zdefiniowane w pliku main.cf
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R sleep 5 html_directory = no inet_interfaces = localhost inet_protocols = all mail_owner = postfix mailq_path = /usr/bin/mailq.postfix manpage_directory = /usr/share/man mydestination = $myhostname, localhost.$mydomain, localhost newaliases_path = /usr/bin/newaliases.postfix queue_directory = /var/spool/postfix readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES sample_directory = /usr/share/doc/postfix-2.10.1/samples sendmail_path = /usr/sbin/sendmail.postfix setgid_group = postdrop unknown_local_recipient_reject_code = 550 |
Wyświetlanie domyślnych (-d) ustawień, które nie są zdefiniowane w pliku main.cf
:
1 2 3 4 5 6 7 8 9 10 |
# postconf –d bounce_notice_recipient = postmaster access_map_defer_code = 450 access_map_reject_code = 554 address_verify_cache_cleanup_interval = 12h address_verify_default_transport = $default_transport address_verify_local_transport = $local_transport address_verify_map = btree:$data_directory/verify_cache address_verify_negative_cache = yes ...... |
Modyfikacja ustawień z pliku main.cf
może się także odbywać bezpośrednio z linii komend np. poniższa komenda modyfikuje dyrektywę inet_interfaces:
1 |
# postconf –e inet_interfaces=all |
Weryfikacja:
1 2 3 |
# grep ^inet_interfaces /etc/postfix/main.cf Inet_interfaces = all |
master.cf
– definiuje ustawienia konfiguracyjne dla demona master i sposób w jaki powinien współpracować z innymi agentami aby dostarczać pocztę. Fragment pliku:
1 2 3 4 5 6 7 8 9 10 |
#========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - n - - smtpd #smtp inet n - n - 1 postscreen #smtpd pass - - n - - smtpd #dnsblog unix - - n - 0 dnsblog #tlsproxy unix - - n - 0 tlsproxy #submission inet n - n - - smtpd |
Dla każdej usługi wylistowanej w pliku master.cf
jest siedem kolumn, które definiują jak usługa ma być używana.
Kolumna | Opis |
service |
Nazwa usługi. |
type |
Mechanizm transportu, który ma być używany. |
private |
Czy usługa jest tylko do użytku przez Postfixa. |
unpriv |
Czy usługa może być uruchamiana przez zwykłych użytkowników. |
chroot |
Czy usługa ma zmieniać główny katalog (chroot) dla kolejki mail. |
wakeup |
Interwał wake up dla usługi. |
maxproc |
Maksymalna ilość procesów na jaki usługa może się sforkować (rodzielić). |
command + args |
Komenda powiązana z usługą plus dowolny argument. |
access
– może być używany do kontroli dostępu opartej o adres e-mail, adres hosta, domenę lub adres sieci.
Aby zezwolić na dostęp dla określonego adresu IP:
1 |
192.168.122.20 OK |
Aby zezwolić na dostęp dla określonej domeny:
1 |
example.com OK |
Aby odmówić dostępu dla sieci 192.168.3.0/24:
1 |
192.168.3 REJECT |
Po wprowadzeniu zmian w pliku access
należy przekonwertować jego zawartość do bazy access.db
komendą postmap:
1 2 3 4 |
# postmap /etc/postfix/access # ll /etc/postfix/access* -rw-r--r--. 1 root root 20876 Jan 26 2014 /etc/postfix/access -rw-r--r--. 1 root root 12288 Feb 12 07:47 /etc/postfix/access.db |
canonical
– mapowanie maili przychodzących do lokalnych użytkowników na zdalne skrzynki e-mail.
Aby przekazywać maile dla użytkownika user1 na skrzynkę user1@yahoo.com:
1 |
user1 user1@yahoo.com |
Aby przekazywać wszystkie maile przeznaczone dla domeny example.org na inną domenę example.com:
1 |
@example.org @example.com |
Po wprowadzeniu zmian w pliku canonical
należy przekonwertować jego zawartość do bazy canonical.db
komendą postmap:
1 2 3 4 |
# postmap /etc/postfix/canonical # ll /etc/postfix/canonical* -rw-r--r--. 1 root root 11681 2014-06-10 /etc/postfix/canonical -rw-r--r--. 1 root root 12288 07-31 20:56 /etc/postfix/canonical.db |
generic
– mapowanie maili wychodzących do lokalnych użytkowników na zdalne skrzynki e-mail. Składnia taka sama jak plikucanonical
. Po wprowadzeniu zmian w tym pliku także należy uruchomić komendę postmap.
1 2 3 4 |
# postmap /etc/postfix/generic # ll /etc/postfix/generic* -rw-r--r--. 1 root root 9904 2014-06-10 /etc/postfix/generic -rw-r--r--. 1 root root 12288 07-31 21:15 /etc/postfix/generic.db |
relocated
– informacje o użytkownikach, którzy zostali przeniesieni. Składnia pliku taka sama jak plikówcanonical
igeneric
.
Zakładając, że użytkownik user1 został przeniesiony z domeny example.com
do example.net
można przekazywać wszystkie maile otrzymane na starym adresie na nowy adres:
1 |
user1@example.com user1@example.net |
Po wprowadzeniu zmian w tym pliku także należy uruchomić komendę postmap.
1 2 3 4 |
# postmap /etc/postfix/relocated # ll /etc/postfix/relocated* -rw-r--r--. 1 root root 6816 2014-06-10 /etc/postfix/relocated -rw-r--r--. 1 root root 12288 07-31 21:26 /etc/postfix/relocated.d |
transport
– mapowanie pomiędzy adresami e-mail i serwerami przez które te maile mają być wysyłane (następnymi hopami) w formacie transport:nexthop. Np.:
1 |
user1@example.com smtp:host1.example.com |
Po wprowadzeniu zmian w tym pliku także należy uruchomić komendę postmap.
1 2 3 4 |
# postmap /etc/postfix/transport [root@server1 postfix]# ll /etc/postfix/transport* -rw-r--r--. 1 root root 12549 2014-06-10 /etc/postfix/transport -rw-r--r--. 1 root root 12288 07-31 21:32 /etc/postfix/transport.db |
virtual
– używany do przekierowania maili przeznaczonych dla pewnego użytkownika na konto innego użytkownika lub wielu użytkowników. Może być też używany do implementacji mechanizmu aliasów domen.
Przekierowanie maila dla użytkownika user1 do użytkowników root i user3:
1 |
user1 root, user3 |
Przekierowanie maila dla użytkownika user1 w domenie example.com do użytkownika root:
1 |
user1@example.com root |
Po wprowadzeniu zmian w tym pliku także należy uruchomić komendę postmap.
1 2 3 4 |
# postmap /etc/postfix/virtual # ll /etc/postfix/virtual* -rw-r--r--. 1 root root 12494 2014-06-10 /etc/postfix/virtual -rw-r--r--. 1 root root 12288 07-31 21:58 /etc/postfix/virtual.db |
/etc/aliases
– przekazywanie maile przeznaczonych do użytkowników lokalnych do innych użytkowników lokalnych lub adresów zdalnych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# cat /etc/aliases ... # Basic system aliases -- these MUST be present. mailer-daemon: postmaster postmaster: root # General redirections for pseudo accounts. bin: root daemon: root adm: root lp: root sync: root shutdown: root # Person who should get root's mail #root: marc ... |
Aby przekazywać maile przeznaczone do wykasowanego konta user50 do lokalnego użytkownika user1 i zdalnego użytkownika user2@host1.example.com :
1 |
user50: user1, user2@host1.example.com |
Plik aliases
pozwala także na utworzenie grupy mailingowej. Tak możemy utworzyć grupę mailingową lnxadmteam z członkami: user1, user2, user3:
1 |
lnxadmteam: user1, user2, user3 |
Po każdej modyfikacji tego pliku należy komendą newaliases przekonwertować plik do bazy aliases.db
:
1 2 3 4 |
# newaliases # ll /etc/aliases* -rw-r--r--. 1 root root 1518 2013-06-07 /etc/aliases -rw-r--r--. 1 root root 12288 07-31 22:12 /etc/aliases.db |
Logi Postfixa.
Wszystkie komunikaty i ostrzeżenia logowane są do pliku /var/log/maillog.
Wymagania SELinux związane z Postfixem.
Typy plików SELinx związane z Postfixem to postfix_exec_t dla katalogu z konfiguracją /etc/postfix
, postfix_data_t dla katalogu z danymi /var/lib/postfix
i postfix_spool_t dla katalogu z pocztą przychodzącą i wychodzącą
/var/spool/postfix
.
1 2 3 4 5 |
# ll -Zd /etc/postfix /var/lib/postfix /var/spool/postfix drwxr-xr-x. root root system_u:object_r:postfix_etc_t:s0 /etc/postfix drwx------. postfix root system_u:object_r:postfix_data_t:s0 /var/lib/postfix drwxr-xr-x. root root system_u:object_r:postfix_spool_t:s0 /var/spool/postfix |
Typ SELinux związany z portem SMTP to smtp_port_t:
1 2 |
# semanage port –l | grep smtp smtp_port_t tcp 25, 465, 587 |
Zmienna boolean związana z postfixem, która pozwala lub zabrania Postfixowi na zapis w lokalnym katalogu spool. Domyślnie zmienna jest włączona.
1 2 |
# getsebool –a | grep postfix postfix_local_write_mail_spool --> on |
Konfiguracja centralnego serwera poczty.
1. Instalacja Postfixa:
1 |
# yum –y install postfix |
2. Edycja pliku konfiguracyjnego main.cf
i modyfikacja poniższych dyrektyw, pozostałe zostawiamy niezmienione.
1 2 3 4 5 6 7 |
myhostname = server.example.com mydomain = example.com myorigin = $myhostname inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 192.168.0.0/24, 127.0.0.0/8 disable_dns_lookups = yes |
Domyślnie serwer poczty rozwiązuje nazwy domenowe dzięki DNS. Jeżeli DNS jest nieobecny można poinstruować Postfixa aby używał pliku /etc/hosts
dyrektywą disable_dns_lookups = yes
.
3. Sprawdzenie składni pliku konfiguracyjnego main.cf
.
1 |
# postfix check |
4. Wyświetlenie zmian dokonanych w pliku main.cf
komendą postconf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# postconf –n alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix disable_dns_lookups = yes inet_interfaces = all inet_protocols = all mail_owner = postfix mail_spool_directory = /var/spool/mail mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mydomain = example.com myhostname = server.example.com mynetworks = 192.168.0.0/24, 127.0.0.0/8 myorigin = $myhostname queue_directory = /var/spool/postfix |
5. Odblokowanie usługi smtp na firewallu.
1 2 |
# firewall-cmd --permanent --add-service smtp # firewall-cmd --reload |
6. Autostart, start i status Postfixa.
1 2 3 |
# systemctl enable postfix # systemctl start postfix # systemctl status postfix |
7. Ustawienie Postfixa jako domyślnego MTA.
1 2 3 |
# alternatives --set mta /usr/sbin/sendmail.postfix # alternatives --display mta | grep current link currently points to /usr/sbin/sendmail.postfix |
8. Wysyłka maila do użytkownika user1 z tematem Test:
1 2 3 4 |
# mailx user1 Subject: Test Test wysylania poczty CTRL+D |
9. Przełączenie na konto user1 i sprawdzenie czy poczta doszła.
1 2 3 4 5 |
# su - user1 [user1@smtp1 ~]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/user1": 1 message 1 new >N 1 root Tue Aug 1 13:33 18/596 "Test" |
10. Sprawdzenie logu.
1 |
# tail /var/log/maillog |
11. Poczta wyświetla się jako wysłana z server.example.com możemy zmodyfikować zmienną myorigin aby wskazywała na domenę.
1 |
myorigin = $mydomain |
Test centralnego serwera poczty ze zdalnego klienta.
Strona klienta (client.example.com).
1. Instalacja Postfixa:
1 |
# yum –y install postfix |
2. Edycja main.cf
i wyłączenie korzystania z DNSa na rzecz pliku /etc/hosts
.
1 |
disable_dns_lookups = yes |
3. Autostart i start Postfixa.
1 2 |
# systemctl enable postfix # systemctl start postfix |
4. Wysyłka poczty na konto user1@server.example.com.
1 2 3 4 |
# mailx user1@server.example.com Subject: Test zdalny Test zdalny CTRL+D |
Strona serwera (server.example.com).
5. Sprawdzenie czy doszła poczta do użytkownika user1.
1 2 3 4 5 6 7 |
# su - user1 $ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/user1": 2 messages 1 new 1 root Tue Aug 1 13:33 19/607 "Test" >N 2 root Tue Aug 1 14:36 21/898 "Test zdalny" & q |
Konfiguracja Postfixa do forwardowania lokalnej poczty z klienta do centralnego serwera poczty i odrzucania poczty ze źródeł zewnętrznych.
Strona klienta (client.example.com).
1. Instalacja postfixa.
1 |
# yum –y install postfix |
2. Edycja pliku konfiguracyjnego main.cf
i modyfikacja poniższych dyrektyw. Pozostałe zostawiamy niezmienione.
1 2 3 4 5 6 7 |
myhostname = client.example.com mydomain = example.com myorigin = $mydomain inet_interfaces = localhost mydestination = localhost relayhost = server.example.com disable_dns_lookups = yes |
3. Sprawdzenie składni main.cf
:
1 |
# postfix check |
4. Podejrzenie zmian dokonanych w pliku main.cf
komendą postconf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# postconf –n command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix disable_dns_lookups = yes inet_interfaces = localhost mail_owner = postfix mydestination = localhost mydomain = example.com myhostname = client.example.com myorigin = $mydomain queue_directory = /var/spool/postfix relayhost = server.example.com |
5. Otworzenie portu w łańcuchu incoming nie jest potrzebne bo serwer tylko forwarduje pocztę. Port 25 w łańcuch outgoing jest otwarty.
6. Autostart i start Postfixa.
1 2 |
# systemctl enable postfix # systemctl start postfix |
7. Ustawienie Postfixa jako domyślnego MTA.
1 2 3 |
# alternatives --set mta /usr/sbin/sendmail.postfix # alternatives --display mta | grep current link currently points to /usr/sbin/sendmail.postfix |
8. Wysyłka maila do użytkownika user1 z tematem Test. Konto user1 musi być założone na serwerze. Jeżeli nie ma takiego konta na kliencie to mail dojdzie ale nie będziemy wiedzieć czy przekazywanie działa poprawnie. Lepiej założyć również na kliencie i przełączyć się na konto user1 na kliencie i sprawdzić, że na konto user1@localhost nie doszła żadna poczta.
1 2 3 4 |
# mailx user1 Subject: Test Forwardowania Test wysylania poczty CTRL+D |
9. Sprawdzenie czy kolejka jest pusta, tj. czy mail został wysyłany
1 2 |
# mailq Mail queue is empty |
10. Przełączenie na konto user1 i sprawdzenie czy czasem lokalnie ten mail nie został wysłany.
1 2 3 |
# su - user1 $ mailx No mail for user1 |
Wszystko pasuje mail nie został wysłany lokalnie.
Strona serwera (server.example.com).
11. Przełączenie na konto user1 i sprawdzenie czy poczta doszła.
1 2 3 4 5 |
# su - user1 [user1@smtp1 ~]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/user1": 1 message 1 new >N 1 root Tue Aug 1 13:40 18/596 "Test Forwardowania" |
Mail dotarł na skrzynkę user1@server.example.com czyli a nie na skrzynkę user1@localhost a więc wszystko w porządku.
Konfiguracja Postfixa do otrzymywania poczty z sieci lokalnej i forwardowania jej do centralnego serwera.
Strona klienta, który pracuje jako forwarder (client.example.com)
1. Edycja pliku konfiguracyjnego main.cf
i modyfikacja poniższych dyrektyw. Pozostałe zostawiamy niezmienione.
1 2 3 4 5 6 7 8 |
myhostname = client.example.com mydomain = example.com myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 192.168.0.0/24, 127.0.0.0/8 relayhost = server.example.com disable_dns_lookups = yes |
2. Restart Postfixa.
1 |
# systemctl restart postfix |
3. Otworzenie portu 25 na firewallu.
1 2 |
# firewall-cmd --permanent --add-service smtp # firewall-cmd --reload |
Jakiś inny klient (nie client.example.com) z sieci lokalnej, z którego wyślemy maila.
4. Wysyłka maila.
1 2 3 4 5 |
# su - user1 $ mailx user1@client.example.com Subject: Test forwardowania poczty z sieci lokalnej Test EOT |
Na centralnym serwerze (server.example.com).
1 2 3 4 5 |
# su - user1 $ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/user1": 1 message 1 new >N 1 root Tue Aug 1 13:45 18/596 "Test forwardowania poczty z sieci lokalnej" |
Mail dotarł na skrzynkę user1@server.example.com czyli wszystko w porządku.