OpenVZ - serwer pocztowy

Mamy kontener, który działa. Jego cel to serwer pocztowy. Zajmijmy się teraz konfiguracją.

Konfigurację będę opierał na:

https://www.howtoforge.com/perfect-server-debian-wheezy-nginx-bind-dovecot-ispconfig-3-p3

Do tej pory zupdateowaliśmy paczki:

apt-get update
apt-get upgrade

Lecimy dalej:

dpkg-reconfigure dash

wybieramy No -> używanie basha zamiast dasha

Instalacja potrzebnych programów:


apt-get install ntp ntpdate postfix postfix-mysql postfix-doc mysql-client mysql-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve sudo -y

wpisujemy hasło dla roota dla mysql


Edytujemy plik
nano /etc/postfix/master.cf

Odkomentowujemy submission i smtps:

[...]
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
[...]

Słuchanie na serwerze pocztowym na wszystkich interfejsach.
Edytujemy plik:
nano /etc/postfix/main.cf

Zmieniając wpis inet_interfaces na all:

inet_interfaces = all

Restartujemy Postfixa :

/etc/init.d/postfix restart



Kolejny krok jest opcjonalny - edytujemy dostęp do mysql poza localhost. Ze względu na to, że system ma być autonomiczny, możemy pominąć ten krok. Jeśli jednak ktoś chce mieć dostęp to należy przeedytować plik

nano /etc/mysql/my.cnf

I zakomentować linijkę rozpoczynającą się od bind-address:


[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1


A następnie zrestartować usługę:
/etc/init.d/mysql restart

Potem trzeba zrobić odpowiednie przekierowanie portów !


Następny krok to instalacja potrzebnego oprogramowania to poczty i ochrony przed spamem.

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 arj nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl clamav-docs daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip libnet-dns-perl -y

Usuwamy spamassassin z autouruchmiania – ISPConfig 3 będzie używać amavisd, który wczyta filtry z SpamAssassin, więc możemy zatrzymać samo SpamAssassin żeby zaoszczędzić trochę RAMu.

/etc/init.d/spamassassin stop
update-rc.d -f spamassassin remove

Przystępujemy do instalacji serwera www (nginx) i PHP wraz z kilkoma dodatkami:

apt-get install nginx php5-fpm php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-memcached php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl memcached php-apc fcgiwrap -y

Konfigurujemy PHP
Wydujemy plik:

nano /etc/php5/fpm/php.ini

I zmieniamy na poniższe ustawienia:

[...]
cgi.fix_pathinfo=0
[...]
date.timezone="Europe/Warsaw"
[...]

Przeładowujemy konfigurację.

/etc/init.d/php5-fpm reload


Instalacja phpMyAdmin - opcjonalna.
Nie jest nam to potrzebne, ponieważ i tak działamy na localhost . Jeśli jednak bardzo nam na tym zależy to wywołujemy polecenie:

apt-get install phpmyadmin -y

Pytania I odpowiedzi:
Web server to reconfigure automatically: none (dostępne opcje to apache2 i lighttpd a my korzystamy z nginxa)
Configure database for phpmyadmin with dbconfig-common? No

Ścieżka do phpMyAdmin to /usr/share/phpmyadmin/.
Konfiguracja wirtualnego hosta dla nginxa:

location /phpmyadmin {
       root /usr/share/;
       index index.php index.html index.htm;
       location ~ ^/phpmyadmin/(.+\.php)$ {
               try_files $uri =404;
               root /usr/share/;
               fastcgi_pass unix:/var/run/php5-fpm.sock;
               fastcgi_index index.php;
               fastcgi_param SCRIPT_FILENAME $request_filename;
               include /etc/nginx/fastcgi_params;
               fastcgi_param PATH_INFO $fastcgi_script_name;
               fastcgi_buffer_size 128k;
               fastcgi_buffers 256 4k;
               fastcgi_busy_buffers_size 256k;
               fastcgi_temp_file_write_size 256k;
               fastcgi_intercept_errors on;
       }
       location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
               root /usr/share/;
       }
}
location /phpMyAdmin {
       rewrite ^/* /phpmyadmin last;
}

 



Teraz trochę zabezpieczeń – poznany wcześniej fail2ban:
apt-get install fail2ban -y

Edytujemy plik

nano /etc/fail2ban/jail.local

Dodając / edytując na poniższe konfiguracje:

[DEFAULT]
ignoreip = 127.0.0.1 192.168.0.0/24

[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/mail.log
maxretry = 5

[sasl]
enabled  = true
port     = smtp
filter   = sasl
logpath  = /var/log/mail.log
maxretry = 3


Edytujemy definicję filtra dla POP3 I IMAP:

nano /etc/fail2ban/filter.d/dovecot-pop3imap.conf


Zawartość:

[Definition]
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+ authentication attempts).*rip=(?P\S*),.*
ignoreregex =


I restartujemy usługę:

/etc/init.d/fail2ban restart


Teraz przyszedł czas, aby zarządzać kontami pocztowymi. Do tego celu wykorzystamy ISPConfig 3 .

cd /tmp
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ISPConfig-3-stable.tar.gz
cd ispconfig3_install/install/

Uruchamiamy instalator

php -q install.php

Select language (en,de) [en]:
Installation mode (standard,expert) [standard]:
Full qualified hostname (FQDN) of the server, eg server1.domain.tld  [server1.example.com]:
MySQL server hostname [localhost]:
MySQL root username [root]:
MySQL root password []:
MySQL database to create [dbispconfig]:
MySQL charset [utf8]:


Jeśli pokaże nam się poniższy komunikat to wybieramy nginx (najlepiej wcześniej usunąć apache jeśli w dystrybucji był zainstalowany):
Apache and nginx detected. Select server to use for ISPConfig: (apache,nginx) [apache]:

Generujemy certyfikat (można zostawić domyślne lub wpisać bardziej poprawne dane – w zależności od zastosowania serwera)

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
ISPConfig Port [8080]:


SSL nie potrzebuję więc wpisuję n:

Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [n]:


Mamy panel do zarządzania (jeszcze na niego nie wejdziemy bo nie mamy skonfigurowanego wirtualnego hosta).

Teraz przyda nam się coś, do odbierania poczty przez WWW. Ja polecam RoundCube:

apt-get install roundcube roundcube-plugins - y

Pytania I odpowiedzi:

Configure database for roundcube with dbconfig-common?
Database type to be used by roundcube:
Password of the database's administrative user:
MySQL application password for roundcube:
Password confirmation:

Teraz lekko skonfigurujmy RoundCube:
Edytujemy plik konfiguracyjny:

nano /etc/roundcube/main.inc.php

[...]
$rcmail_config['default_host'] = 'localhost';
[...]

[...]
// skin name: folder from skins/
$rcmail_config['skin'] = 'classic';
[...]

Ok, mamy RoundCube’a ale jeszcze się do niego nie dostaniemy :) Musimy skonfigurować lokalnie przekierowania dla serwera WWW.

Konfiguracja Nginxa do Roundcube:

nano /etc/nginx/sites-enabled/default

w sekcji server (wewnątrz) dopisujemy:

client_max_body_size 100M;

location /roundcube {
  root /var/lib/;
  index index.php index.html index.htm;

    location ~ (.+\.php)$ {
      try_files $uri =404;
      include /etc/nginx/fastcgi_params;
      #fastcgi_pass 127.0.0.1:9000;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_intercept_errors on;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_buffer_size 128k;
      fastcgi_buffers 256 4k;
      fastcgi_busy_buffers_size 256k;
      fastcgi_temp_file_write_size 256k;
    }
      location ~* /.svn/ {
      deny all;
    }
      location ~* /README|INSTALL|LICENSE|SQL|bin|CHANGELOG$ {
      deny all;
    }
  }
 
  location /webmail {
    rewrite ^ /roundcube last;
}


Ostateczny konfig wygląda w ten sposób:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                rewrite ^ /roundcube last;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        client_max_body_size 100M;

        location /roundcube {

        root /var/lib/;
        index index.php index.html index.htm;

                location ~ (.+\.php)$ {
                        try_files $uri =404;
                        include /etc/nginx/fastcgi_params;
                        #fastcgi_pass 127.0.0.1:9000;
                        fastcgi_pass unix:/var/run/php5-fpm.sock;
                        fastcgi_index index.php;
                        fastcgi_intercept_errors on;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_buffer_size 128k;
                        fastcgi_buffers 256 4k;
                        fastcgi_busy_buffers_size 256k;
                        fastcgi_temp_file_write_size 256k;
                }
                        location ~* /.svn/ {
                        deny all;
                }
                        location ~* /README|INSTALL|LICENSE|SQL|bin|CHANGELOG$ {
                        deny all;
                }
        }

        location /webmail {
                rewrite ^ /roundcube last;
        }

}


Restartujemy nginxa w celu zastosowania zmian.

/etc/init.d/nginx restart

Ok. Mamy wszystko skonfigurowane na kontenerze, ale jak teraz dostać się do roundcube czy ispconfig ?! Wpisując 192.168.0.100 w pasku adresu nie pokazuje nam naszego serwera.
Mamooooo !! No właśnie, chodźmy do mamy…
Wracamy na serwer matkę.
Aby tworzyć przekierowania stron do kontenerów skorzystamy z nginx'a i proxypassa. instalujemy wiec nginxa:

apt-get install nginx-y

Edytujemy plik:

nano /etc/nginx/sites-enabled/default

Warto ten plik sobie wyczyścić ze zbędnych wpisów i komentarzy, ponieważ w przyszłości będziemy dodawać tutaj nowe pozycje.

Dopisujemy poniższe pozycje do sekcji server:

location /isp/ {
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.0.100:8080/;
}

location /roundcube/ {
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.0.100:80/roundcube/;
}

Powyższe wpisy przekierują adres domena.pl/isp/ do kontenera pod IP 192.168.0.100 a port 8080

Ostateczna konfiguracja:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name DOMENA www.DOMENA;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /isp/ {
                proxy_set_header X-Real_IP $remote_addr;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_pass http://192.168.0.100:8080/;
        }

        location /roundcube/ {
                proxy_set_header X-Real_IP $remote_addr;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_pass http://192.168.0.100:80/roundcube/;
        }

}

Restart nginxa i gotowe – możemy się dostać do ISP Config 3 i RoundCube:

/etc/init.d/nginx restart

Pozostał ostatni szczegół. Poczta działa na portach: 110, 143, 465, 587, 993, 995, 25 .
Teraz gdybyśmy cos wysłali na te porty, to trafiłoby na serwer-matkę a chcemy, aby trafiło na serwer mailowy.
W związku z tym trzeba zrobić przekierowanie w iptables:

iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 110 -j DNAT --to-destination 192.168.0.100:110
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 143 -j DNAT --to-destination 192.168.0.100:143
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 465 -j DNAT --to-destination 192.168.0.100:465
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 587 -j DNAT --to-destination 192.168.0.100:587
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 993 -j DNAT --to-destination 192.168.0.100:993
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 995 -j DNAT --to-destination 192.168.0.100:995
iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d IP_MATKI --dport 25 -j DNAT --to-destination 192.168.0.100:25


Sprawdzamy czy wpisy się dodały poprawnie:
iptables -L -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:pop3 to:192.168.0.100:110
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:imap2 to:192.168.0.100:143
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:ssmtp to:192.168.0.100:465
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:submission to:192.168.0.100:587
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:imaps to:192.168.0.100:993
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:pop3s to:192.168.0.100:995
DNAT       tcp  --  anywhere             NAZWA_MOJEGO_HOSTA     tcp dpt:smtp to:192.168.0.100:25

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.0.0/24       anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


Niestety po restarcie serwera matki cała konfiguracja padnie :( Musimy wiec te reguły jakoś zapisać.
Wykonajmy poniższe polecenie, które do pliku /etc/network/iptables.rules zapisze nam reguły.

iptables-save > /etc/network/iptables.rules

Teraz w pliku /etc/network/interfaces dopisujemy linijkę:

pre-up iptables-restore < /etc/network/iptables.rules

Fragment powyższego pliku po naszych zmianach (IP_SERWERA i IP pozwoliłem sobie „zakomentować”):

iface vmbr0 inet static
        address IP_SERWERA
        netmask 255.255.255.0
        network IP.0
        broadcast IP.255
        gateway IP.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        pre-up iptables-restore < /etc/network/iptables.rules
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -s '192.168.0.0/24' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.0.0/24' -o vmbr0


Sprawdźmy, czy wszystko działa:
http://DOMENA/isp/
http://DOMENA/roundcube/

Prawie gotowe …

Warto ustawić poprawny adres ReverseDNS, aby poczta poprawianie odczytywała ten parametr.
Można to sprawdzić przez stronę:

http://mxtoolbox.com/

wpisując domenę, a następnie SMTP test.
Jeśli wszystko jest ok, to dobrze. Jeśli SMTP Banner Check jest na żółto, to należy ustawić poprawnie parametr myhostname w pliku /etc/postfix/main.cf :

nano /etc/postfix/main.cf

I dopisać / przeedytować

myhostname = adres_reverse_dns

Na koniec restart usługi

/etc/init.d/postfix restart




Kilka porad na sam koniec.

Jeśli przeznaczymy mało RAMu, to maile mogą mieć w tytule napis ***UNCHECKED*** - problemem jest filtr amavis. Żeby go usunąć należy przeedytować plik:

nano /etc/postfix/main.cf

I zakomentować poprzez dodanie # na początku poniższych linijek:

# content_filter = amavis:[127.0.0.1]:10024
# receive_override_options = no_address_mappings


Na koniec restart postfixa:

/etc/init.d/postfix restart

Teraz zatrzymamy usługi amvisa i usuniemy go:
/etc/init.d/clamav-daemon stop
/etc/init.d/clamav-freshclam stop
/etc/init.d/amavis stop
update-rc.d -f clamav-daemon remove
update-rc.d -f clamav-freshclam remove
update-rc.d -f amavis remove

Niestety wiąże się to z tym, że mamy mniejszą ochronę poczty. Coś za coś…