Цель: Дать подробную инструкцию о том как настроить ISPConfig на виртуальном или физическом сервере.
Целевая аудитория: Начинающие администраторы серверов, продвинутые администраторы сайтов и просто люди которые хотят не переплачивать за панель управления на своём сервере.
На официальном сайте ISPConfig очень много инструкций для разных ОС и с разными вариантами настройки, я взял за основу одну из них и наложил на неё свои правки.
Причиной написания стать стало то что я не однократно встречаю в сети жалобы на данную панель. Её на мой взгляд не обоснованно считают «отстойной». Просьба тех кто так считает, пишите аргументы чем же она плоха, если можно реальные случаи, какая ОС и какая версия панели стояла, какое ПО было установлено на сервере. Считаю что аргументированные пояснения позволят не только разобраться в причинах, но и сложить более объективное мнение новичку при прочтении этой статьи и комментариев к ней.
В исходных данных сервер с Debian 9 amd64 с минимальным количеством установленных пакетов.
Если используете виртуализацию, то не рекомендую использовать OpenVZ, настроить на ней можно, работать будет если не вылазить за ограничения, но с большой вероятностью у Вас будут возникать проблемы на некоторых этапах установки которых не будет на других типах виртуализации. Я в процессе написания статьи использовал KVM.
В не обязательных пунктах буду указывать (если надо), если Вы не уверены надо Вам это или нет на 100% выполняйте этот пункт всё равно.
Так же в каждом пункте будут мои краткие пояснения по тому зачем нужна данная установка и ссылки на пояснения и документацию или wiki.
В процессе установки я везде буду использовать параметр
1 |
--no-install-recommends |
, это конечно же не обязательно, но если Вы его не будете использовать готовьтесь к тому что Вам с рекомендованными зависимостями прилетит apache2 и ещё много чего. Причём тот же apache2 будет конфликтовать с Nginx, так как они используют по умолчанию один и тот же порт, а apache2 стартует раньше чем Nginx, и как следствие Nginx не запустится.
1 |
adduser user |
Вместо user пишем желаемое имя пользователя, старайтесь не быть банальными в подборе и логина и пароля.
1 |
nano /etc/ssh/sshd_config |
найдите и закоментируйте строчку
1 |
PermitRootLogin yes |
Этого будет достаточно если на Вашем ПК с которого Вы подключаетесь к серверу через SSH установлена Windows, но если Вы пользуетесь к примеру линукс, то стоит ещё продлить время жизни ssh сессии чтобы оно постоянно не обрывалось на самом интересном месте. Для этого найдите и раскоментируйте вот эти две строчки
1 2 |
ClientAliveInterval 60 ClientAliveCountMax 360 |
И проставьте значения как у меня. Далее перезапустите службу ssh и по новой подключитесь к машине.
1 |
/etc/init.d/ssh restart |
1 |
apt -y purge aspell-ru bash-completion debian-faq dictionaries-common distro-info-data doc-debian emacsen-common exim4 exim4-base exim4-config exim4-daemon-light guile-2.0-libs:amd64 hdparm irussian iso-codes ispell konwert konwert-filters krb5-locales less libclass-isa-perl libfribidi0:amd64 libgc1c2:amd64 libgsasl7 libkyotocabinet16v5:amd64 liblockfile-bin libmailutils5:amd64 libntlm0:amd64 libpam-systemd:amd64 libpython2.7:amd64 libsasl2-modules:amd64 libswitch-perl libxmuu1:amd64 lsb-release mailutils mailutils-common manpages mueller7-dict ncurses-term netcat-traditional powermgmt-base python3-chardet python3-debian python3-debianbts python3-httplib2 python3-pkg-resources python3-pycurl python3-pysimplesoap python3-reportbug python3-requests python3-six python3-urllib3 rename reportbug resolvconf task-cyrillic task-russian task-ssh-server telnet traceroute wamerican xauth && apt -y autoremove && apt install -y --no-install-recommends openssh-server |
1 |
apt upgrade -y --no-install-recommends |
1 |
nano /etc/hosts |
Во вторую строчку подставьте свой ip, технический домен и субдоменную часть, воспользуйтесь моим примером.
1 2 3 4 5 6 7 |
127.0.0.1 localhost.localdomain localhost 192.168.1.100 server1.example.com server1 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
1 |
nano /etc/hostname |
Тут должна быть вписана субдоменная часть.
1 |
server1 |
Перезагрузите сервер чтобы применить изменения.
1 |
reboot |
После перезагрузки проверьте верно ли был сконфигурирован технический домен сервера.
1 2 |
hostname hostname -f |
Должно получиться так:
1 2 3 4 |
root@server1:/tmp# hostname server1 root@server1:/tmp# hostname -f server1.example.com |
1 |
dpkg-reconfigure dash |
На вопрос отвечаем нет.
1 |
Use dash as the default system shell (/bin/sh)? <- no |
1 |
apt install --no-install-recommends ntp |
1 |
apt install --no-install-recommends postfix postfix-mysql postfix-doc mariadb-client mariadb-server openssl getmail4 rkhunter binutils dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-lmtpd sudo |
На вопросы в процессе установки отвечаем так:
1 2 |
General type of mail configuration: <-- Internet Site System mail name: <-- server1.example.com |
Чтобы защитить установку MariaDB и отключить тестовую базу данных, выполните следующую команду:
1 |
mysql_secure_installation |
1 2 3 4 5 6 7 |
Change the root password? [Y/n] <-- y New password: <-- Enter a new MySQL root password Re-enter new password: <-- Repeat the MySQL root password Remove anonymous users? [Y/n] <-- y Disallow root login remotely? [Y/n] <-- y Remove test database and access to it? [Y/n] <-- y Reload privilege tables now? [Y/n] <-- y |
Затем откройте порты TLS/SSL и отправки в Postfix:
1 |
nano /etc/postfix/master.cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[...] submission inet n - y - - 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 smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING smtps inet n - y - - 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 smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING [...] |
Перезапустите Postfix.
1 |
service postfix restart |
Если надо чтобы Mysql прослушивал все интерфейсы, а не только localhost, закоментируйте строчку
1 |
bind-address = 127.0.0.1 |
в файле
1 |
/etc/mysql/mariadb.conf.d/50-server.cnf |
В этом же файле добавьте строчку
1 |
sql-mode="NO_ENGINE_SUBSTITUTION" |
Без неё установка ISPConfig не пройдёт.
1 |
nano /etc/mysql/mariadb.conf.d/50-server.cnf |
1 2 3 4 5 6 7 8 |
[...] # 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 sql-mode="NO_ENGINE_SUBSTITUTION" [...] |
Перезапустите MariaDB.
1 |
/etc/init.d/mysql restart |
Можно проверить что слушает MariaDB выполнив такую команду:
1 |
netstat -tap | grep mysql |
Если только локалку, то вывод будет таким:
1 2 |
# netstat -tap | grep mysql tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN 801/mysqld |
Если Вы закоментировали ту строку то таким:
1 2 |
# netstat -tap | grep mysql tcp6 0 0 [::]:mysql [::]:* LISTEN 8884/mysqld |
1 |
apt install --no-install-recommends 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 libdbd-mysql-perl postgrey |
В ISPConfig используется amavisd, который загружает библиотеку фильтров SpamAssassin внутренне, поэтому мы можем остановить SpamAssassin, чтобы освободить оперативную память:
1 2 |
service spamassassin stop systemctl disable spamassassin |
1 2 |
apt install --no-install-recommends git lua5.1 liblua5.1-0-dev lua-filesystem libidn11-dev libssl-dev lua-zlib lua-expat lua-event lua-bitop lua-socket lua-sec luarocks luarocks make gcc luarocks install lpc |
Добавьте пользователя Metronome.
1 |
adduser --no-create-home --disabled-login --gecos 'Metronome' metronome |
Скачайте и соберите Metronome.
1 2 3 4 |
cd /opt; git clone https://github.com/maranda/metronome.git metronome cd ./metronome; ./configure --ostype=debian --prefix=/usr make make install |
nginx-light
nginx-full
nginx-extras
Перейдите по ссылкам и посмотрите что входит в их состав, установите тот который больше Вам подходит.
Если Вы не конкретизируете выбор пакета, а просто укажите nginx при установке, будет установлен nginx-full.
1 |
apt install --no-install-recommends nginx-light |
1 |
apt install --no-install-recommends php7.0-fpm php7.0 php7.0-common php7.0-gd php7.0-mysql php7.0-imap php7.0-cli php7.0-cgi php-pear php7.0-mcrypt mcrypt imagemagick libruby php7.0-curl php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl memcached php-memcache php-imagick php-gettext php7.0-zip php7.0-mbstring memcached php7.0-soap php7.0-opcache fcgiwrap |
В дальнейшем после установки панели можно будет добавить другие версии php если они будут необходимы, но об этом я буду рассказывать в отдельной статье.
1 |
apt install --no-install-recommends letsencrypt |
Для автоматической перевыдачи сертификатов рекомендую после получения первого сертификата добавить в cron такую запись:
1 2 |
0 0 */29 * * certbot renew> /var/log/le-renew.log 15 0 */29 * * /usr/sbin/nginx -s reload |
1 |
apt install --no-install-recommends mailman |
Выберите хотя бы 1 язык из предложенных.
1 2 |
Languages to support: <-- ru (Russian) Missing site list <-- Ok |
Прежде чем мы сможем запустить Mailman, должен быть создан первый список рассылки mailmanman:
1 |
newlist mailman |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
root@server1:~# newlist mailman Enter the email of the person running the list: listadmin@example.com Initial mailman password: password To finish creating your mailing list, you must edit your /etc/aliases (or equivalent) file by adding the following lines, and possibly running the `newaliases' program: ## mailman mailing list mailman: "|/var/lib/mailman/mail/mailman post mailman" mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman" mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman" mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman" mailman-join: "|/var/lib/mailman/mail/mailman join mailman" mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman" mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman" mailman-request: "|/var/lib/mailman/mail/mailman request mailman" mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman" mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman" Hit enter to notify mailman owner... <-- ENTER root@server1:~# |
Добавим aliases:
1 |
nano /etc/aliases |
Добавьте эти строки в конец документа:
1 2 3 4 5 6 7 8 9 10 11 12 |
[...] ## mailman mailing list mailman: "|/var/lib/mailman/mail/mailman post mailman" mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman" mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman" mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman" mailman-join: "|/var/lib/mailman/mail/mailman join mailman" mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman" mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman" mailman-request: "|/var/lib/mailman/mail/mailman request mailman" mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman" mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman" |
Выполните:
1 |
newaliases |
Перезапустите Postfix:
1 |
service postfix restart |
Запустите Mailman:
1 |
service mailman start |
Quota — для установки квот для пользователей и сайтов.
1 |
apt install --no-install-recommends pure-ftpd-common pure-ftpd-mysql quota quotatool |
Чтобы запереть ftp-пользователей в своих папках подправим настройки.
1 |
nano /etc/default/pure-ftpd-common |
1 2 3 |
[...] VIRTUALCHROOT=true [...] |
Чтобы сделать передачу данных более безопасной разрешим TLS:
1 |
echo 1 > /etc/pure-ftpd/conf/TLS |
Создадим папку для ssl-сертификата:
1 |
mkdir -p /etc/ssl/private/ |
Генерируем SSL сертификат:
1 |
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem |
1 2 3 4 5 6 7 |
Country Name (2 letter code) [AU]: RU State or Province Name (full name) [Some-State]: Stavropol Territory Locality Name (eg, city) []: Ladovskaya Balka Organization Name (eg, company) [Internet Widgits Pty Ltd]: Settin Organizational Unit Name (eg, section) []: server Common Name (eg, YOUR name) []: server1.example.com Email Address []: info@settin.ru |
Я вводил свои данные, укажите свои данные по примеру или оставьте значения по умолчанию.
Подправим права полученного сертификата:
1 |
chmod 600 /etc/ssl/private/pure-ftpd.pem |
Перезапустим FTP-сервер:
1 |
service pure-ftpd-mysql restart |
Если у Вас не OVZ виртуализация, для того чтобы работали квоты добавьте в /etc/fstab к корневому разделу вот параметры ,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0
1 |
nano /etc/fstab |
1 2 3 |
[...] UUID=f539c5cb-624f-4c27-a149-1446a251a453 / ext4 errors=remount-ro,usrjquota=quota.user,grpjquota=quota.group,jqfmt=vfsv0 0 1 [...] |
Чтобы включить квоту, выполните следующие команды:
1 2 3 |
mount -o remount / quotacheck -avugm quotaon -avug |
Уязвимость BIND позволяет «уронить» любой сервер: как и почему это работает
1 |
apt install --no-install-recommends bind9 dnsutils haveged |
Включим и запустим сервис:
1 2 |
systemctl enable haveged service haveged start |
1 |
apt install --no-install-recommends webalizer awstats geoip-database libclass-dbi-mysql-perl libtimedate-perl |
Выключим выполнение заданий по сбору статистики, так как ими будет управлять панель:
1 |
nano /etc/cron.d/awstats |
Закоментируйте все строки в файле.
1 |
apt install --no-install-recommends build-essential autoconf automake libtool flex bison debhelper binutils |
1 2 3 4 5 6 |
cd / tmp wget http://olivier.sessink.nl/jailkit/jailkit-2.19.tar.gz tar xvfz jailkit-2.19.tar.gz cd jailkit-2.19 echo 5 > debian/compat ./debian/rules binary |
Теперь когда пакет собран его можно установить:
1 2 3 |
cd .. dpkg -i jailkit_2.19-1_*.deb rm -rf jailkit-2.19* |
1 |
apt install --no-install-recommends fail2ban |
Чтобы сделать чтобы fail2ban мониторил PureFTPd и Dovecot, создайте файл /etc/fail2ban/jail.local :
1 |
nano /etc/fail2ban/jail.local |
И положите в него вот эти строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[pure-ftpd] enabled = true port = ftp filter = pure-ftpd logpath = /var/log/syslog maxretry = 3 [dovecot] enabled = true filter = dovecot logpath = /var/log/mail.log maxretry = 5 [postfix-sasl] enabled = true port = smtp filter = postfix-sasl logpath = /var/log/mail.log maxretry = 3 |
Перезагрузите fail2ban:
1 |
service fail2ban restart |
Чтобы установить брандмауэр UFW, выполните:
1 |
apt install --no-install-recommends ufw |
1 2 3 4 5 6 |
cd /tmp wget http://www.ispconfig.org/downloads/ISPConfig-3.1.12.tar.gz tar xvfz ISPConfig-3.1.12.tar.gz cd ispconfig3_install/install apt install --no-install-recommends patch php -q install.php |
В процессе будет задано ряд вопросов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# php -q install.php -------------------------------------------------------------------------------- _____ ___________ _____ __ _ ____ |_ _/ ___| ___ \ / __ \ / _(_) /__ \ | | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ _/ / | | `--. \ __/ | | / _ \| '_ \| _| |/ _` | |_ | _| |_/\__/ / | | \__/\ (_) | | | | | | | (_| | ___\ \ \___/\____/\_| \____/\___/|_| |_|_| |_|\__, | \____/ __/ | |___/ -------------------------------------------------------------------------------- >> Initial configuration Operating System: Debian 9.0 (Stretch) or compatible Following will be a few questions for primary configuration so be careful. Default values are in [brackets] and can be accepted with <ENTER>. Tap in "quit" (without the quotes) to stop the installer. Select language (en,de) [en]: Installation mode (standard,expert) [standard]: Full qualified hostname (FQDN) of the server, eg server1.domain.tld [server1.canomi.com]: MySQL server hostname [localhost]: MySQL server port [3306]: MySQL root username [root]: MySQL root password []: MySQL database to create [dbispconfig]: MySQL charset [utf8]: Apache and nginx detected. Select server to use for ISPConfig: (apache,nginx) [apache]: nginx Configuring Postgrey Configuring Postfix Generating a 4096 bit RSA private key .......................................................................++ ........................................................................................................................................++ writing new private key to 'smtpd.key' ----- 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 (e.g. server FQDN or YOUR name) []: Email Address []: Configuring Mailman Configuring Dovecot Configuring Spamassassin Configuring Amavisd Configuring Getmail Configuring BIND Configuring Jailkit Configuring Pureftpd Configuring Nginx Configuring vlogger Configuring Metronome XMPP Server writing new private key to 'localhost.key' ----- Country Name (2 letter code) [AU]: 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) [server1.canomi.com]: Email Address []: Configuring UFW Firewall Configuring Fail2ban [INFO] service OpenVZ not detected Configuring Apps vhost Installing ISPConfig ISPConfig Port [8080]: Admin password [admin]: 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 (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: <-- Hit Enter An optional company name []: <-- Hit Enter writing RSA key Configuring DBServer Installing ISPConfig crontab no crontab for root no crontab for getmail Detect IP addresses Restarting services ... Installation completed. |
Готово, если будут вопросы или предложения по улучшению инструкции пишите или в личку или тут в комментариях.
Используемые материалы при написании статьи:
https://www.howtoforge.com/tutorial/perfect-server-debian-9-nginx-bind-dovecot-ispconfig-3.1/