Installation eines Web, E-Mail & MySQL Datenbank Clusters unter Debian 6.0 mit ISPConfig 3

Version 1.0
Author: Till Brehm <t [dot] brehm [at] ispconfig [dot] org>


Dieses Tutorial beschreibt die Installation eines Web, E-Mail, Datenbank und DNS Server Clusters, welcher unter Debian 6 mit der ISPConfig 3 Kontrolloberfläche für Redundanz, hohe Verfügbarkeit und Lastenverteilung benutzt wird. Zur Replication von MySQL Client Datenbanken wird MySQL Master/Master Replikation benutzt. Mit Unison werden die /var/www (Webseiten) und /var/vmail (E-Mail Kontendaten) Verzeichnisse synchronisiert.

1 Die beiden Basissysteme aufsetzen

In diesem Setup gibt es einen Master Server (auf dem die ISPConfig Kontrolloberfläche läuft) und einen Slave Server, welcher den Web- (Apache), E-Mail- (Postfix und Dovecot) und Datenbankdienst (MySQL) des Master Servers mirrort.

Um das Clustersetup zu installieren brauchen Sie zwei Server mit der minimalen Debian 6.0 Installation. Das Basissetup wird in den Schritten 1 - 8 des folgenden Tutorials beschrieben:

http://www.howtoforge.de/anleitung/der-perfekte-server-debian-squeeze-debian-6-0-mit-bind-dovecot-ispconfig-3/

Befolgen Sie nur die Schritte 1 - 8 des Tutorials; alle weiteren Schritte unterscheiden sich von denen eines Clustersetups!

In meinem Beispiel benutze ich die folgenden Hostnamen und IP Adressen für die zwei Server:

Master Server
Hostname: server1.example.tld IP Adresse: 192.168.0.105
Slave Server
Hostname: server2.example.tld IP Adresse: 192.168.0.106
An jeder Stelle, an der diese Namen oder IP Adressen im Folgenden auftauchen, müssen Sie sie durch die Hostnamen und Adressen Ihrer Server ersetzen.

2 Installation der beiden Server

Die nachfolgenden Schritte müssen sowohl auf dem Master als auch auf dem Slave Server ausgeführt werden. Ist ein bestimmter Schritt nur auf einem der beiden auszuführen, habe ich eine rote Bemerkung hinzugefügt.

vi /etc/hosts


127.0.0.1 localhost
192.168.0.105 server1.example.tld 192.168.0.106 server2.example.tld # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Tragen Sie den Hostnamen de Servers ein:

echo server1.example.tld > /etc/hostname
/etc/init.d/hostname.sh start

Benutzen Sie server1.example.tld auf dem ersten Server und server2.example.tld auf dem zweiten Server.

Editieren Sie die sources.list Datei...

vi /etc/apt/sources.list

... und stellen Sie sicher, dass Ihre /etc/apt/sources.list Datei die squeeze-updates Repository enthält (so bekommen Sie immer die neusten Updates des ClamAV Virus Scanner - das Projekt bringt sehr oft neue Updates heraus und manchmal funktionieren ältere dann nicht mehr).
[...]
deb http://ftp.de.debian.org/debian/ squeeze-updates main [...]
Benutzen Sie...

apt-get update
apt-get upgrade

um die neusten Updates zu installieren (falls es welche gibt).

Es ist außerdem immer gut die Systemzeit mit einem NTP (network time protocol) Server über das Internet zu synchronisieren. Benutzen Sie dazu:

apt-get -y install ntp ntpdate

Auf Server 1:

Erstellen Sie nun ein private/public Schlüsselpaar auf server1.example.tld:

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): <-- ENTER
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <-- ENTER
Enter same passphrase again: <-- ENTER
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
1b:95:bc:4a:f4:9f:d8:ea:24:31:0f:c9:72:d5:a7:80 root@server1.example.com
The key's randomart image is:
+--[ DSA 1024]----+
| |
| o o |
| E * . . |
| o = o o |
| . S o . |
| + O + . |
| + + + |
| o . |
| .o |
+-----------------+
root@server1:~#

Es ist wichtig, dass Sie kein Passwort eingeben, andernfalls wird das Mirroring nicht ohne manuelle Eingabe des Passworts funktionieren. Drücken Sie also einfach ENTER!

Kopieren Sie als nächstes Ihren öffentlichen Schlüssel auf server2.example.tld:

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.106

root@server1:~# ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101
The authenticity of host '192.168.0.101 (192.168.0.101)' can't be
established.
RSA key fingerprint is 25:d8:7a:ee:c2:4b:1d:92:a7:3d:16:26:95:56:62:4e.
Are you sure you want to continue connecting (yes/no)? <-- yes (you will see this only if this is the first time you connect to server2)
Warning: Permanently added '192.168.0.101' (RSA) to the list of known hosts.
root@192.168.0.101's password: <-- server2 root password
Now try logging into the machine, with "ssh 'root@192.168.0.101'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Kontrollieren Sie nun auf server2 ob der öffentliche Schlüssel von server1 korrekt übertragen wurde:

server2:

cat $HOME/.ssh/authorized_keys


ssh-dss AAAAB3NzaC1kc3MAAACBAPhiAexgEBexnw0rFG8lXwAuIsca/V+lhmv5lhF3BqUfAbL7e2sWl
QlGhxZ8I2UnzZK8Ypffq6Ks+lp46yOs7MMXLqb7JBP9gkgqxyEWqOoUSt5hTE9ghupcCvE7rRMhefY5sh LUnRkVH6hnCWe6yXSnH+Z8lHbcfp864GHkLDK1AAAAFQDddQckbfRG4C6LOQXTzRBpIiXzoQAAAIEAlee vPHwi+a3fTDM2+Vm6EVqR5DkSLwDM7KVVNtFSkAY4GVCfhLFREsfuMkcBD9Bv2DrKF2Ay3OOh39269Z1r gYVk+/MFC6sYgB6apirMlHj3l4RR1g09LaM1OpRz7pc/GqIGsDt74D1ES2j0zrq5kslnX8wEWSHapPR0t ziin6UAAACBAJHxgr+GKxAdWpxV5MkF+FTaKcxA2tWHJegjGFrYGU8BpzZ4VDFMiObuzBjZ+LrUs57Biw TGB/MQl9FKQEyEV4J+AgZCBxvg6n57YlVn6OEA0ukeJa29aFOcc0inEFfNhw2jAXt5LRyvuHD/C2gG78l wb6CxV02Z3sbTBdc43J6y root@server1.example.tld
Installieren Sie postfix, dovecot und MySQL mit einem einzigen Befehl:

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

Geben Sie, sobald Sie vom Installer dazu aufgefordert werden, das neue MySQL Passwort ein. Sie sollten für beide Server das gleiche Passwort benutzen. Beantworten Sie dann die folgenden Fragen wie hier beschrieben:

General type of configuration? <-- Internet site Mail name? <-- server1.mydomain.tld SSL certificate required <-- Ok
Benutzen Sie server1.example.tld auf dem ersten und server2.example.tld auf dem zweiten Server.
Wir wollen, dass MySQL, alle Netzwerkoberflächen benutzt, nicht nur localhost, deshalb editieren wir die /etc/mysql/my.cnf Datei und kommentieren die Zeile bind-address = 127.0.0.1 aus:

vi /etc/mysql/my.cnf


[...]
# 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 [...]
Starten Sie dann MySQL neu:

/etc/init.d/mysql restart


Nun bereiten Sie die MySQL Server auf die Master/Master Replikation vor.

Auf Server 1:

Melden Sie sich folgendermaßen auf der MySQL Shell an...

mysql -u root -p

... und geben das MySQL root Passwort ein, dass Sie während der MySQL Installation ausgewählt haben. Führen Sie dann diesen Befehl auf der MySQL Shell aus (ersetzen Sie 'slave_user_password' mit einem sicheren Passwort, das der Slave Server benutzen soll, um sich mit dem Master zu verbinden. Ersetzen Sie diesen Platzhalter in den nächsten Schritten mit diesem Passwort, wann immer er auftaucht):

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%'
IDENTIFIED BY 'slave_user_password';
FLUSH PRIVILEGES;
quit;

Konfigurieren Sie nun Ihre zwei MySQL Knoten:

Auf Server 1:

vi /etc/mysql/my.cnf

Suchen Sie nach der Sektion, die mit [mysqld] beginnt und fügen Sie die folgenden Optionen hinzu (kommentieren Sie alle bereits existierenden Optionen aus, die mit diesen in Konflikt stehen):
[...]
[mysqld] server-id = 1 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 1 master-host = 192.168.0.106 master-user = slaveuser master-password = slave_user_password master-connect-retry = 60 expire_logs_days = 10 max_binlog_size = 500M log_bin = /var/log/mysql/mysql-bin.log [...]
Stoppen Sie MySQL:

/etc/init.d/mysql stop

Nun tun Sie fast das gleiche auf server2...

Auf Server 2:

vi /etc/mysql/my.cnf

Suchen Sie nach der Sektion, die mit [mysqld] beginnt und fügen Sie die folgenden Optionen hinzu (kommentieren Sie alle bereits existierenden Optionen aus, die mit diesen in Konflikt stehen):
[...]
[mysqld] server-id = 2 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 2 master-host = 192.168.0.105 master-user = slaveuser master-password = slave_user_password master-connect-retry = 60 expire_logs_days = 10 max_binlog_size = 500M log_bin = /var/log/mysql/mysql-bin.log [...]
Stoppen Sie MySQL:

/etc/init.d/mysql stop

Nun müssen Sie die beiden MySQL Server synchronisieren. Dies tun Sie, indem Sie das MySQL Datenverzeichnis und die Debian Konfigurationsdatei, welche den debian-sys-maint Benutzer enthält, vom Master auf den Slave kopieren. Da Sie MySQL auf beiden Servern gestoppt haben, können Sie dies nun tun.

Auf Server 1:

scp -pr /var/lib/mysql/* root@server2.example.tld:/var/lib/mysql/
scp -pr /etc/mysql/debian.cnf root@server2.example.tld:/etc/mysql/debian.cnf

Starten Sie MySQL nun wieder auf dem Master Server:

/etc/init.d/mysql start

Melden Sie sich in der MySQL Shell als root Benutzer an...

mysql -u root -p

... und führen Sie folgenden Befehl in der MySQL Shell aus...

SHOW MASTER STATUS;

... um den MySQL Master Status einzusehen:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Die Informationen, die Sie für den nächsten Schritt brauchen ist die Binlog Datei mysql-bin.000002 und die Binlog Position 106. Für server2 brauchen Sie später die selben Informationen.

Führen Sie dann folgenden Befehl in der MySQL Shell des Masters aus um ihn mit dem Slave zu verbinden:

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.0.106', MASTER_USER='slaveuser',
MASTER_PASSWORD='slave_user_password',
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;
START SLAVE;

Überprüfen Sie dann den Slave Status:

SHOW SLAVE STATUS G

Direkt vor dem G im obigen Befehl muss ein Backslash angegeben werden, den der Wordpress Editor leider entfernt. Also "SHOW SLAVE STATUS BACKSLASHG". Es ist wichtig, dass sowohl Slave_IO_Running als auch Slave_SQL_Running in der Ausgabe den Wert Yes haben.

Auf Server 2:

Melden Sie sich in der MySQL Shell als root Benutzer an...

mysql -u root -p

... und führen Sie folgenden Befehl in der MySQL Shell aus:

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.0.105', MASTER_USER='slaveuser',
MASTER_PASSWORD='slave_user_password',
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;
START SLAVE;

Überprüfen Sie dann den Slave Status:

SHOW SLAVE STATUS G

Direkt vor dem G im obigen Befehl muss ein Backslash angegeben werden, den der Wordpress Editor leider entfernt. Also "SHOW SLAVE STATUS BACKSLASHG". Es ist wichtig, dass sowohl Slave_IO_Running als auch Slave_SQL_Running in der Ausgabe den Wert Yes haben.

Die Konfiguration der MySQL Master/Master Replikation ist nun abgeschlossen und Sie können damit fortfahren, die anderen Softwarepakete zu installieren.

Die nächsten Schritte müssen sowohl auf Server 1 als auch auf Server 2 ausgeführt werden.

Um amavisd-new, SpamAssassin und ClamAV zu installieren, benutzen Sie:

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

Das ISPConfig 3 Setup benutzt amavisd, welches die SpamAssassin Filterbibliothek intern lädt, Sie können also SpamAssassin stoppen um Arbeitsspeicher freizugeben:

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

Installieren Sie dann Apache2, PHP5, phpMyAdmin, FCGI, suExec, Pear und mcrypt wie folgt:

apt-get install apache2 apache2.2-common apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-imap phpmyadmin php5-cli php5-cgi libapache2-mod-fcgid apache2-suexec php-pear php-auth php5-mcrypt mcrypt php5-imagick imagemagick libapache2-mod-suphp libruby libapache2-mod-ruby php5-xcache

Sie werden folgendes gefragt:

Web server to reconfigure automatically: <-- apache2 Configure database for phpmyadmin with dbconfig-common? <-- No
Benutzen Sie dann folgenden Befehl um die Apache Module suexec, rewrite, ssl, actions und include zu aktivieren:

a2enmod suexec rewrite ssl actions include ruby dav_fs dav auth_digest

PureFTPd und Quota können mit dem folgenden Befehl installiert werden:

apt-get -y install pure-ftpd-common pure-ftpd-mysql quota quotatool

Editieren Sie die Datei /etc/default/pure-ftpd-common...

vi /etc/default/pure-ftpd-common

..., stellen Sie sicher, dass der Startmodus auf standalone gesetzt ist und setzen Sie VIRTUALCHROOT=true:
[...]
STANDALONE_OR_INETD=standalone [...] VIRTUALCHROOT=true [...]
Editieren Sie die Datei /etc/inetd.conf um inetd davon abzuhalten zu versuchen ftp zu starten:

vi /etc/inetd.conf

Gibt es eine Zeile beginnend mit ftp stream tcp, kommentieren Sie diese aus (gibt es diese nicht, müssen Sie die Datei auch nicht editieren):
[...]
#:STANDARD: These are standard services. #ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/pure-ftpd-wrapper [...]
Mussten Sie /etc/inetd.conf editieren, starten Sie inetd neu:

/etc/init.d/openbsd-inetd restart


Konfigurieren Sie nun PureFTPd, sodass es FTP und TLS Sitzungen erlaubt. FTP ist ein sehr unsicheres Protokoll, da alle Passwörter und Daten in klarem Text übertragen werden. Durch Benutzung von TLS wird jegliche Kommunikation verschlüsselt, wodurch FTP sehr viel sicherer gemacht wird.

Wollen Sie FTP und TLS Sitzungen erlauben, benutzen Sie:

echo 1 > /etc/pure-ftpd/conf/TLS

Um TLS zu benutzen, müssen Sie ein SSL Zertifikat erstellen. Ich erstelle es in /etc/ssl/private/, deshalb muss ich dieses Verzeichnis erst erstellen:

mkdir -p /etc/ssl/private/

Danach können Sie das SSL Zertifikat generieren:

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

Country Name (2 letter code) [AU]: <-- Geben Sie Ihr Land an (z.B., "DE"). State or Province Name (full name) [Some-State]: <-- Geben Sie Ihr Bundesland an (z.B. Niedersachsen). Locality Name (eg, city) []: <-- Geben Sie Ihre Stadt an (z.B. Lueneburg). Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Geben Sie den Namen Ihrer Firma an. Organizational Unit Name (eg, section) []: <-- Geben Sie den Namen Ihrer Abteilung an (z.B. "IT Department"). Common Name (eg, YOUR name) []: <-- Geben Sie den qualifiezierten Domainnamen Ihres Systems an (z.B. "server1.example.com"). Email Address []: <-- Geben Sie Ihre E-Mail Adresse an.
Ändern Sie die Zugriffsrechte auf das SSL Zertifikat:

chmod 600 /etc/ssl/private/pure-ftpd.pem

Starten Sie dann PureFTPd neu:

/etc/init.d/pure-ftpd-mysql restart

Editieren Sie die /etc/fstab Datei. Meine sieht folgendermaßen aus (ich habe ,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 zur Partition mit dem Mountpunkt / hinzugefügt):

vi /etc/fstab


# /etc/fstab: static file system information.
# # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda1 during installation UUID=92bceda2-5ae4-4e3a-8748-b14da48fb297 / ext3 errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1 # swap was on /dev/sda5 during installation UUID=e24b3e9e-095c-4b49-af27-6363a4b7d094 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Um Quota zu aktivieren, benutzen Sie folgende Befehle:

mount -o remount /

quotacheck -avugm
quotaon -avug

Installieren Sie den BIND DNS Server:

apt-get -y install bind9 dnsutils

Installieren Sie vlogger, webalizer und awstats:

apt-get -y install vlogger webalizer awstats geoip-database

Öffnen Sie danach /etc/cron.d/awstats ...

vi /etc/cron.d/awstats

... und kommentieren Sie beide Cron Jobs in der Datei aus:
#*/10 * * * * www-data [ -x /usr/share/awstats/tools/update.sh ] && /usr/share/awstats/tools/update.sh
# Generate static reports: #10 03 * * * www-data [ -x /usr/share/awstats/tools/buildstatic.sh
Installieren Sie Jailkit: Jailkit wird nur gebraucht, wenn Sie SSH Benutzer und Cron Jobs chrooten wollen. Es kann wie folgt installiert werden (Wichtig: Jailkit muss vor ISPConfig installiert werden - dies kann nicht nachträglich geschehen!):

apt-get -y install build-essential autoconf
automake1.9 libtool flex bison

cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.14.tar.gz
tar xvfz jailkit-2.14.tar.gz
cd jailkit-2.14
./configure
make
make install
cd ..
rm -rf jailkit-2.14*

Installieren Sie fail2ban: Dies ist zwar optional, wird aber empfohlen, da der ISPConfig Monitor versucht, dessen Log anzuzeigen:

apt-get install fail2ban

Um fail2ban PureFTPd und Dovecot überwachen zu lassen, erstellen Sie die Datei /etc/fail2ban/jail.local:

vi /etc/fail2ban/jail.local


[pureftpd]
enabled = true port = ftp filter = pureftpd logpath = /var/log/syslog maxretry = 3 [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
Erstellen Sie dann die folgenden zwei Filterdateien:

vi /etc/fail2ban/filter.d/pureftpd.conf


[Definition]
failregex = .*pure-ftpd: (.*@<HOST>) [WARNING] Authentication failed for user.* ignoreregex =

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


[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<host>S*),.* ignoreregex =
Starten Sie fail2ban anschließend neu:

/etc/init.d/fail2ban restart

Um den SquirrelMail Webmail Client zu installieren, benutzen Sie:

apt-get install squirrelmail

Erstellen Sie dann folgenden Symlink...

ln -s /usr/share/squirrelmail/ /var/www/webmail

... und konfigurieren SquirrelMail:

squirrelmail-configure

SquirrelMail muss wissen, dass Sie Dovecot-IMAP/-POP3 benutzen:

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >> <-- D
SquirrelMail Configuration : Read: config.php
---------------------------------------------------------
While we have been building SquirrelMail, we have discovered some
preferences that work better with some servers that don't work so
well with others.  If you select your IMAP server, this option will
set some pre-defined settings for that server.

Please note that you will still need to go through and make sure
everything is correct.  This does not change everything.  There are
only a few settings that this will change.

Please select your IMAP server:
bincimap    = Binc IMAP server
courier     = Courier IMAP server
cyrus       = Cyrus IMAP server
dovecot     = Dovecot Secure IMAP server
exchange    = Microsoft Exchange IMAP server
hmailserver = hMailServer
macosx      = Mac OS X Mailserver
mercury32   = Mercury/32
uw          = University of Washington's IMAP server
gmail       = IMAP access to Google mail (Gmail) accounts

quit        = Do not change anything
Command >> <-- dovecot
SquirrelMail Configuration : Read: config.php
---------------------------------------------------------
While we have been building SquirrelMail, we have discovered some
preferences that work better with some servers that don't work so
well with others.  If you select your IMAP server, this option will
set some pre-defined settings for that server.

Please note that you will still need to go through and make sure
everything is correct.  This does not change everything.  There are
only a few settings that this will change.

Please select your IMAP server:
bincimap    = Binc IMAP server
courier     = Courier IMAP server
cyrus       = Cyrus IMAP server
dovecot     = Dovecot Secure IMAP server
exchange    = Microsoft Exchange IMAP server
hmailserver = hMailServer
macosx      = Mac OS X Mailserver
mercury32   = Mercury/32
uw          = University of Washington's IMAP server
gmail       = IMAP access to Google mail (Gmail) accounts

quit        = Do not change anything
Command >> dovecot

imap_server_type = dovecot
default_folder_prefix = <none>
trash_folder = Trash
sent_folder = Sent
draft_folder = Drafts
show_prefix_option = false
default_sub_of_inbox = false
show_contain_subfolders_option = false
optional_delimiter = detect
delete_folder = false

Press enter to continue... <-- drücken Sie ENTER
SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >> <-- S
SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >> <-- Q
Als nächstes aktivieren Sie das globale Alias /webmail für Squirrelmail:

cd /etc/apache2/conf.d/
ln -s ../../squirrelmail/apache.conf squirrelmail.conf
/etc/init.d/apache2 reload

Öffnen Sie nun /etc/apache2/conf.d/squirrelmail.conf...

vi /etc/apache2/conf.d/squirrelmail.conf

... und fügen Sie die folgenden Zeilen zum <Directory /usr/share/squirrelmail></Directory> Container hinzu, der sicherstellt, dass mod_php für den Zugriff auf SquirrelMail benutzt wird, egal welchen PHP Modus Sie in ISPConfig für Ihre Webseite ausgewählt haben:
[...]
Alias /webmail /usr/share/squirrelmail <Directory /usr/share/squirrelmail> Options FollowSymLinks <IfModule mod_php5.c> AddType application/x-httpd-php .php php_flag magic_quotes_gpc Off php_flag track_vars On php_admin_flag allow_url_fopen Off php_value include_path . php_admin_value upload_tmp_dir /var/lib/squirrelmail/tmp php_admin_value open_basedir /usr/share/squirrelmail:/etc/squirrelmail:/var/lib/squirrelmail:/etc/hostname:/etc/mailname php_flag register_globals off </IfModule> <IfModule mod_dir.c> DirectoryIndex index.php </IfModule> # access to configtest is limited by default to prevent information leak <Files configtest.php> order deny,allow deny from all allow from 127.0.0.1 </Files> </Directory> [...]
Erstellen Sie das Verzeichnis /var/lib/squirrelmail/tmp...

mkdir /var/lib/squirrelmail/tmp

... und übergeben ihn in den Besitz des Benutzers www-data:

chown www-data /var/lib/squirrelmail/tmp

Laden Sie Apache neu:

/etc/init.d/apache2 reload

Das war es auch schon - /etc/apache2/conf.d/squirrelmail.conf definiert ein /squirrelmail genanntes Alias, welches auf SquirrelMails Installationsverzeichnis /usr/share/squirrelmail zeigt.

Sie können SquirrelMail nun folgendermaßen von Ihrer Webseite aus aufrufen:

http://www.example.com/squirrelmail

Sie können es außerdem folgendermaßen über den ISPConfig Control Panel vHost aufrufen (dies bedarf keiner Konfiguration in ISPConfig):

http://server1.example.com:8080/squirrelmail


Als nächstes installieren Sie Unison. Unison wird benutzt, um die /var/www und /var/vmail Verzeichnisse zwischen Master und Slave zu synchronisieren:

apt-get install unison

Installieren Sie nun eine Unison Konfigurationsdatei auf dem ersten Server.

Auf Server 1:

Erstellen Sie die neue Datei /root/.unison/default.prf auf server1...

mkdir /root/.unison
vi /root/.unison/default.prf

... und fügen Sie dieser folgenden Inhalt hinzu:
# Roots of the synchronization
root = /var root = ssh://192.168.0.106//var/ # Paths to synchronize path = www path = vmail # Some regexps specifying names and paths to ignore #ignore = Path stats ## ignores /var/www/stats #ignore = Path stats/* ## ignores /var/www/stats/* #ignore = Path */stats ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats #ignore = Name *stats ## ignores all files/directories that end with "stats" #ignore = Name stats* ## ignores all files/directories that begin with "stats" #ignore = Name *.tmp ## ignores all files with the extension .tmp # When set to true, this flag causes the user interface to skip # asking for confirmations on non-conflicting changes. (More # precisely, when the user interface is done setting the # propagation direction for one entry and is about to move to the # next, it will skip over all non-conflicting entries and go # directly to the next conflict.) auto=true # When this is set to true, the user interface will ask no # questions at all. Non-conflicting changes will be propagated; # conflicts will be skipped. batch=true # !When this is set to true, Unison will request an extra # confirmation if it appears that the entire replica has been # deleted, before propagating the change. If the batch flag is # also set, synchronization will be aborted. When the path # preference is used, the same confirmation will be requested for # top-level paths. (At the moment, this flag only affects the # text user interface.) See also the mountpoint preference. confirmbigdel=true # When this preference is set to true, Unison will use the # modification time and length of a file as a `pseudo inode # number' when scanning replicas for updates, instead of reading # the full contents of every file. Under Windows, this may cause # Unison to miss propagating an update if the modification time # and length of the file are both unchanged by the update. # However, Unison will never overwrite such an update with a # change from the other replica, since it always does a safe # check for updates just before propagating a change. Thus, it is # reasonable to use this switch under Windows most of the time # and occasionally run Unison once with fastcheck set to false, # if you are worried that Unison may have overlooked an update. # The default value of the preference is auto, which causes # Unison to use fast checking on Unix replicas (where it is safe) # and slow checking on Windows replicas. For backward # compatibility, yes, no, and default can be used in place of # true, false, and auto. See the section "Fast Checking" for more # information. fastcheck=true # When this flag is set to true, the group attributes of the # files are synchronized. Whether the group names or the group # identifiers are synchronizeddepends on the preference numerids. group=true # When this flag is set to true, the owner attributes of the # files are synchronized. Whether the owner names or the owner # identifiers are synchronizeddepends on the preference # extttnumerids. owner=true # Including the preference -prefer root causes Unison always to # resolve conflicts in favor of root, rather than asking for # guidance from the user. (The syntax of root is the same as for # the root preference, plus the special values newer and older.) # This preference is overridden by the preferpartial preference. # This preference should be used only if you are sure you know # what you are doing! prefer=newer # When this preference is set to true, the textual user interface # will print nothing at all, except in the case of errors. # Setting silent to true automatically sets the batch preference # to true. silent=true # When this flag is set to true, file modification times (but not # directory modtimes) are propagated. times=true
Wir wollen die Synchronisation automatisieren, deshalb erstellen wir einen Cron Job dafür auf server1.example.tld:

crontab -e


*/5 * * * * /usr/bin/unison &> /dev/null

3 Installation vonISPConfig auf dem ersten (Master) Server

In diesem Schritt installieren Sie ISPConfig auf dem Master Server. Für den Downloadlink der aktuellen stabilen ISPConfig 3 Version, besuchen Sie bitte die ISPConfig Webseite: http://www.ispconfig.org/ispconfig-3/download/
Nun müssen Sie zwei neue MySQL root Benutzer Records zur Master Datenbank hinzufügen um root Zugriff mit dem Slave Server Hostnamen und dessen IP Adresse zu gewährleisten.

Auf Server 1:

Melden Sie sich in der MySQL Datenbank als root Benutzer an...

mysql -u root -p

... und führen Sie diese MySQL Befehle aus:

CREATE USER 'root'@'192.168.0.106' IDENTIFIED BY 'myrootpassword';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.0.106' IDENTIFIED BY 'myrootpassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE USER 'root'@'server2.example.tld' IDENTIFIED BY 'myrootpassword';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'server2.example.tld' IDENTIFIED BY 'myrootpassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
FLUSH PRIVILEGES;
QUIT;

Ersetzen Sie in den vorangehenden MySQL Befehlen 192.168.0.106 mit der IP Adresse des zweiten Servers,  server2.example.tld mit dessen Hostnamen und myrootpassword mit dem gewünschten root Passwort.

Sie sollten nun wieder in der Shell von server1.example.tld sein. Laden Sie die aktuelle stabile Version von ISPConfig 3 herunter:

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

Starten Sie das Installationsskript:

php -q install.php

Select language (en,de) [en]: <-- en Installation mode (standard,expert) [standard]: <-- standard Full qualified hostname (FQDN) of the server, eg server1.domain.tld [server1.example.tld]: <-- server1.example.tld MySQL server hostname [localhost]: <-- localhost MySQL root username [root]: <-- root MySQL root password []: <-- Geben Sie hier Ihr MySQL root passwort ein MySQL database to create [dbispconfig]: <-- dbispconfig1 (die lokalen ISPConfig Datenbanknamen des Master und Slave Servers müssen sich unterscheiden, da beide Server das selbe Datenverzeichnis haben) MySQL charset [utf8]: <-- utf8Country Name (2 letter code) [AU]: <-- DE (Geben Sie hier den ISO Ländercode Ihres Landes an) State or Province Name (full name) [Some-State]: <-- Niedersachsen (Geben Sie Ihr Bundesland an) Locality Name (eg, city) []: <-- Lueneburg (Geben Sie Ihre Stadt an) Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:

Installing ISPConfig
ISPConfig Port [8080]:

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

Generating RSA private key, 4096 bit long modulus
........................++
................++
e is 65537 (0x10001)
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]:
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 (eg, YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

Räumen Sie nun in den Installationsverzeichnissen auf:

rm -rf /tmp/ispconfig3_install
rm -f /tmp/ISPConfig-3-stable.tar.gz


4 Installation von ISPConfig 3 auf dem zweiten Server

In diesem Schritt installieren Sie ISPConfig auf dem Slave Server (server2.example.tld). Dieses Mal benutzen Sie den Modus expert des ISPConfig Installers um diesen Knoten zum Master ISPConfig Server und der Datenbank hinzuzufügen. Für den Downloadlink der aktuellen stabilen ISPConfig 3 Version, besuchen Sie bitte die ISPConfig Webseite: http://www.ispconfig.org/ispconfig-3/download/

Auf Server 2:

Laden Sie die aktuelle stabile ISPConfig 3 Version herunter...

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

... Starten Sie dann das Installationsskript:

php -q install.php

Select language (en,de) [en]: <-- en Installation mode (standard,expert) [standard]: <-- expert Full qualified hostname (FQDN) of the server, eg server2.domain.tld [server2.example.tld]: <-- server2.example.tld MySQL server hostname [localhost]: <-- localhost MySQL root username [root]: <-- root MySQL root password []: <-- Geben Sie hier Ihr MySQL root Passwort an MySQL database to create [dbispconfig]: <-- dbispconfig2 (die lokalen ISPConfig Datenbanknamen des Master und Slave Servers müssen sich unterscheiden, da beide Server das selbe Datenverzeichnis haben) MySQL charset [utf8]: <-- utf8
The next two questions are about the internal ISPConfig database user and password.
It is recommended to accept the defaults which are 'ispconfig' as username and a random password.
If you use a different password, use only numbers and chars for the password.

ISPConfig mysql database username [ispconfig]: <-- ispconfig2 ISPConfig mysql database password [54c243fd3f9ca68de7b08527c81dd5ef]: <-- (drücken Sie Enter, um den Standard zu bestätigen)
Shall this server join an existing ISPConfig multiserver setup (y,n) [n]: <-- y MySQL master server hostname []: <-- server1.example.tld MySQL master server root username [root]: <-- root MySQL master server root password []: <-- Geben Sie hier das root Passwort des Master Servers an MySQL master server database name [dbispconfig]: <-- dbispconfig1 Configure Mail (y,n) [y]: <-- y
Country Name (2 letter code) [AU]: <-- DE (Geben Sie hier den ISO Ländercode Ihres landes an) State or Province Name (full name) [Some-State]: <-- Niedersachsen (Geben Sie Ihr Bundesland an) Locality Name (eg, city) []: <-- Lueneburg (Geben Sie Ihre Stadt an) Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:

Configure Jailkit (y,n) [y]: <-- y Configure FTP Server (y,n) [y]: <-- y Configure DNS Server (y,n) [y]: <-- y Configure Apache Server (y,n) [y]: <-- y Configure Firewall Server (y,n) [y]: <--y Install ISPConfig Web-Interface (y,n) [y]: <--y Installing ISPConfig
ISPConfig Port [8080]:

Enable SSL for the ISPConfig web interface (y,n) [y]: <-- y

Generating RSA private key, 4096 bit long modulus
.................++
.............................................................................................................++
e is 65537 (0x10001)
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]:
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 (eg, YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Räumen Sie in den Installationsverzeichnissen auf:

rm -rf /tmp/ispconfig3_install/install
rm -f /tmp/ISPConfig-3-stable.tar.gz

Im letzten Konfigurationsschritt müssen Sie die ISPConfig Oberfläche des Slaves direkt mit der Datenbank des Masters verbinden. Dieser Schritt wird nur benötigt, wenn Sie ISPConfig sowohl auf dem Master als auch auf dem Slave über Port 8080 erreichen wollen. Melden Sie sich als root Benutzer auf der Shell des Master Selvers an...

Auf Server 1:

... und benutzen folgenden Befehl:

scp -p /usr/local/ispconfig/interface/lib/config.inc.php root@192.168.0.106:/usr/local/ispconfig/interface/lib/config.inc.php

Dieser Befehl muss nach jedem ISPConfig Update der Master und Slave Server erneut ausgeführt werden (Updates werden durch den Befehl ispconfig_update.sh durchgeführt).

5 Replikation in ISPConfig konfigurieren

Melden Sie sich mit einem Internetbrowser in ISPConfig an:

http://192.168.0.105:8080

Klicken Sie auf System > Server Services > server2.example.tld:


Wählen Sie server1.example.tld im Ist Mirror von Server Feld und klicken Sie auf Speichern.

Öffnen Sie dann System > Server Config und aktivieren die Checkbox "Connect Linux userid to webid" im "Web" Reiter:

6 Bemerkungen

Wollen Sie eine Firewall auf dem Master oder Slave Server einrichten, stellen Sie sicher, dass Sie Port 3306 für MySQL auf beiden Servern öffnen.

7 Links