воскресенье, 14 августа 2016 г.

Построение отказоустойчивого облака на базе Owncloud 9.1

Намедни решил я посмотреть, чтож такого новенького деятся в мире информационных наших технологий, и пошел гуглить на предмет новых версий "внедренных" мной когда-то программных продуктов.
Вспомнил, что сделал однажды проджект облачного хранения данных на основе owncloud версии 7.0.2, с отказоустойчивостью, со всеми делами, данное решение функционирует до сих пор и "есть не просит"! Ну вот, оказывается что вышла уже 9 версия и мало того , даже 9.1.., и решил я потестить че за "зверь" такой, сказано-сделано.
Поехали!!!

На всех серверах в качестве OC будет установлен Debian 8.5
Отказоустойчивость облака будет осуществляться на нескольких уровнях, т.к. метаданные
пользователей будут храниться в BD mysql, то на этом уровне будем использовать 3 ноды
Percona XtraDB Cluster 5.6 (2 основные ( oc1 и oc2) их базы будут доступны для записи и для чтения и дополнительный сервер (pxc0) необходим для инициализации кластера, а так же для бекапа, он же, в случае краха кластера будет являться "донором" для oc1 и oc2), пользователи c базой данного сервера pxc0 работать не будут! На oc1 и ос2 будет установлен owncloud 9.1, пользовательские данные облака будут синхронизироваться между этими серверами с помощью glusterfs.
Для единой точки входа будет использоваться виртуальный IP, функционал предоставлен ucarp
в качестве web server будем использовать nginx, схема приблизительно такая:

!!! Все действия будем осуществлять из под пользователя root
 0. Предварительные шаги на всех нодах:
# nano /etc/hosts

10.10.10.110 oc1.mydomain.ru oc1
10.10.10.111 oc2.mydomain.ru oc2
10.10.10.112 pxc0.mydomain.ru pxc0

перезапустим сетевые интерфайсы
# ifdown eth0 && ifup eth0


эт для того, чтоб наши ноды видели друг-друга по имени (проверимпопингуя)

1. Установка и настройка ucarp на oc1 и oc2

воспользуемся ссылкой

2. Установка и настройка Percona XtraDB Cluster на всех нодах
установим по инструкции пройдя по ссылке

после завершения установки перейдем к настройке:
заходим в mysql консоль:
# mysql -u root -p
вводим пароль который указали при настройке
и добавим юзера для бэкапа:
mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT, FILE on *.* to backup@localhost identified by 'yourpassword';
выходим из mysql консоли
mysql> quit
 Потом потребуется одна небольшая переделочка. Дело в том что в debian
симлинк с sh ведёт на dash, а стартовый скрипт кластера заточен под bash.
Если нет никаких противопоказаний, можно уладить это общесистемно: 
# dpkg-reconfigure dash
 
в появившемся окне:
 Ответить НЕТ

 сконфигурируем кластер из трех нод:
pxc0.mydomain.ru: 10.10.10.112
oc1.mydomain.ru: 10.10.10.110
oc2.mydomain.ru: 10.10.10.111


для начала остановим на всех трех нодах сервис mysql
# /etc/init.d/mysql stop

на первой ноде pxc0

# nano /etc/mysql/my.cnf
добавим в блок

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Empty gcomm address is being used when cluster is getting bootstrapped
wsrep_cluster_address=gcomm://

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
#wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1

# This changes how InnoDB autoincrement locks are managed and is a requirement $
innodb_autoinc_lock_mode=2

# Node #1 address
wsrep_node_address=10.10.10.112

# SST method
wsrep_sst_method=xtrabackup

# Cluster name
wsrep_cluster_name=cluster1

# Authentication for SST method
wsrep_sst_auth="backup:yourpassword"


параметр wsrep_cluster_address=gcomm://
нужен для инициализации кластера

стартанем службу:
# /etc/init.d/mysql start


РЕМАРКА
!!!!!!!!
после того как все ноды кластера будут добавлены, можно закомментировать параметр
#wsrep_cluster_address=gcomm://
и раскоментировать
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110
и выполним:
#service mysql bootstrap-pxc
тогда pxc0 станет полноценным членом кластера
тогда при отключении двух нод oc1 и oc2, кластер будет все ровно работать, и при возвращении выключенных машин в работу, данные они получат от pxc0, но если произойдет остановка всех трех машин, сначала включаем pxc0, выполняем команду:
#service mysql bootstrap-pxc
и включаем oc1 и ос2
кластер опять в "строю"
!!!!!!!!!

на второй ноде oc1:

# nano /etc/mysql/my.cnf

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.110,10.10.10.111
binlog_format=ROW
default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=10.10.10.110
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=cluster1
# Authentication for SST method
wsrep_sst_auth="backup:1234Abcd"


запустим сервис
# /etc/init.d/mysql start


на третей ноде oc2:

# nano /etc/mysql/my.cnf

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.110,10.10.10.111
binlog_format=ROW
default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=10.10.10.111
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=cluster1
# Authentication for SST method
wsrep_sst_auth="backup:1234Abcd"


запустим сервис
# /etc/init.d/mysql start

смотрим статус нашего кластера:
на любой из нод:
# mysql -u root -p

mysql>show status like 'wsrep%';
+----------------------------+--------------------------------------+
 | Variable_name                | Value                                             |
+----------------------------+--------------------------------------+
 | wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
...
 | wsrep_local_state          | 4                                                  |
| wsrep_local_state_comment  | Synced                                  |
...
| wsrep_cluster_size           | 3                                                   |
| wsrep_cluster_status       | Primary                                        |
| wsrep_connected             | ON                                                |
...
| wsrep_ready                    | ON                                                    |
+----------------------------+--------------------------------------+
Если наблюдаем примерно следующее, т.е. параметр wsrep_cluster_size равен 3
то значит все три ноды добавлены и теперь возвращаемся на первую ноду pxc0 и правим конфиг

# nano /etc/mysql/my.cnf

изменяем строки:

[mysqld]

#wsrep_cluster_address=gcomm://
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110



3.Установим web server nginx на oc1 и ос2
 установим nginx
 #apt-get install nginx

 установим php5-fpm
#apt-get install php5-common php5-fpm php5-cli php5-json php5-mysql php5-curl php5-intl php5-mcrypt php5-memcache php-xml-parser php-pear php5-gd

 Перед установкой owncloud 9.1 cоздадим реплицируемое файловое хранилище на основе glusterfs из двух нод:

oc1.mydomain.ru: 10.10.10.110
oc2.mydomain.ru: 10.10.10.111

Данные будут храниться на отдельных дисках, сконфигурим их как LVM хранилище на двух нодах:

3.1 Посмотрим какие диски у нас имеются:

# fdisk -l

если у вас только один диск sda (на котором установлена система (как в моем случае), то необходимо добавить еще один большого объема(ну или не очень большого, как вам будет удобно)), т.к. у меня все это "хозяйство" в виртуальной среде находится, я добавил диск и поочередно перегрузил серваки, появились добавленные мной диски приступим к их конфигурированию

Диск /dev/sdb: 107.4 Гб, 107374182400 байт
255 головок, 63 секторов/треков, 13054 цилиндров, всего 209715200 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00000000

будем конфигурить неразмеченный вышеуказанный диск

Для создания LVM раздела нужна соответствующая утилита (LVM2), которая не устанавливается по умолчанию,
установим ее:

# apt-get install lvm2

3.2 Cоздим партицию LVM

# fdisk /dev/sdb
n -> p -> 1 -> enter -> enter
t -> 8e
w



1) создадим PV
# pvcreate /dev/sdb1 (new partition's name)
# pvdisplay

2) создадим VG
# vgcreate vg1 /dev/sdb1
# vgdisplay

3) создадим LV
# lvcreate -L +99G -n lv1 /dev/vg1 (L- указываем размер раздела LVM (он должен быть немного меньше нашего диска) n- имя lvm раздела)
# lvdisplay

4) отформатируем раздел под ext4
# mkfs.ext4 /dev/vg1/lv1

5) создадим директорию в которую будем мапить наш раздел

# mkdir /data


6) для автомапа добавим в /etc/fstab соответствующие строки
# nano /etc/fstab
в конец добавим:
/dev/vg1/lv1 /data ext4 errors=remount-ro 0 1

7) обновим /etc/fstab
# mount -a

8) убедимся что наш раздел успешно замаплен

# df -h

3.3 установим относительно новую версию(по сравнению с той которая в стандартных репах находится 3.4) glusterfs 3.6.9:
удалим старую установку(если таковые имеются)
#apt-get purge glusterfs-client glusterfs-server

и установим новую:
#echo "deb http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main" >>/etc/apt/sources.list

#echo "deb-src http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main" >>/etc/apt/sources.list
#gpg --keyserver pgpkeys.mit.edu --recv-key 13E01B7B3FE869A9

#gpg -a --export 13E01B7B3FE869A9 | apt-key add -

#apt-get update
#apt-get install glusterfs-client glusterfs-server


убедимся что версии glusterfs у нас одинаковые:
# glusterfsd --version

на первой ноде oc1.mydomain.ru выполним:

# gluster peer probe oc2.mydomain.ru

тем самым добавим ее в кластер

посмотрим статус
# gluster peer status
 
3.4 Hастроим репликация файлов между 2 nodes, без единой точки отказа:

1) на каждой ноде создадим точку монтирования:

в этой папке будут находиться файлы данных пользователей нашего облачного хранилища owncloud:

# mkdir -p /var/www/owncloud/data


2) созданим реплицируемый раздел на первой ноде oc1.mydomain.ru
создадим субдиректорию в смонтированной /data

  mkdir -p /data/oc


2.1) # gluster volume create owncloudvol replica 2 transport tcp oc1.mydomain.ru:/data/oc oc2.mydomain.ru:/data/oc
и запустим его:

2.2) # gluster volume start owncloudvol


2.3) на первой ноде oc1.mydomain.ru добавим строку в /etc/fstab
# nano /etc/fstab

oc1.mydomain.ru:/owncloudvol /var/www/owncloud/data glusterfs defaults,_netdev 0 0

на второй ноде oc2.mydomain.ru

# nano /etc/fstab

oc2.mydomain.ru:/owncloudvol /var/www/owncloud/data glusterfs defaults,_netdev 0 0

2.4) обновим /etc/fstab

# mount -a

!!!!!!
если вдруг автомонтирования не происходит после перезагрузки то
необходимо сделать след:

#nano /etc/rc.local
пропишем в скрипте (перед exit 0) нижеследующее:

sleep 5
mount -a


получится вот так:
sleep 5
mount -a
exit 0

т.е. выполним mount -a c задержкой в 5 секунд

4. Скачаем и установим owncloud 9.1
#cd /var/www/


#wget https://download.owncloud.org/community/owncloud-9.1.0.tar.bz2

#tar xvfj owncloud-9.1.0.tar.bz2

#rm owncloud-9.1.0.tar.bz2

#chown -R www-data:www-data owncloud/ 

 4.1 сгенерируем и получим сертификаты для нашего веб сервера и поместим их в соответствующее хранилище:
этот момент тоже очень важный,  я уже писал как  получить валидный несамоподписанный ssl сертификат у startssl (в рамках статьи про zimbra), но намедне узнал, что китайсы а именно
WoSing выдают бесплатный сертификат аж на 3 года, вот так, идем по ссылке и следуя инструкции получаем, у нас должно получится 2 сертификата, один закрытый ключ (после выполнения
#openssl genrsa -des3 -out mydomain.ru.key 2048 (если с паролем)
или
#openssl genrsa -out mydomain.ru.key 2048 (без пароля)

и подписанный сертификат, который в последствии мы получим от WoSing
mydomain.ru.crt
вот их нужно поместить в специально создай "контейнет"
#mkdir /etc/nginx/ssl/
и потом в конфиге нашего веб сервера nginx указать путь к ним, приведем конфиг nginx к следующему виду:
#nano /etc/nginx/conf.d/default.conf 

 upstream php-handler {
        server unix:/var/run/php5-fpm.sock;
}

server {
listen 80;
server_name cloud.mydomain.ru oc1.mydomain.ru oc2.mydomain.ru;
return 301 https://$server_name$request_uri; # enforce https
}

server {
listen 443 ssl;
server_name cloud.mydomain.ru oc1.mydomain.ru oc2.mydomain.ru;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
ssl_certificate /etc/nginx/ssl/mydomain.ru.crt;
ssl_certificate_key /etc/nginx/ssl/mydomain.ru.key;

# Path to the root of your installation
root /var/www/owncloud;

client_max_body_size 10G; # set max upload size
fastcgi_buffers 64 4K;

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
deny all;
}

location / {
# The following 2 rules are only needed with webfinger
rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

try_files $uri $uri/ index.php;
}

location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_pass php-handler;
}

# Optional: set long EXPIRES header on static assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
expires 30d;
# Optional: Don't log access to assets
access_log off;
}

}

а конфигурационный файл php5-fpm к следующему:

#nano /etc/php5/fpm/pool.d/www.conf
точнее добавить нужно следующие строки, ну или раскомментировать
listen.mode = 0660
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

перезагрузим сервисы:

service php5-fpm restart
service nginx restart


сразу же настроим Memory Caching, воспользуемся официальными манами пройдя по ссылке
(я лично воспользовался  Redis), можно конечно обойтись и без кешинга, но я рекомендую все таки сконфигурить, прирост в производительности очень заметный!!!

 

до того как приступим непосредственно к конфигурированию, мы должны создать базу данных owncloud и пользователя, на любой из нод:

#mysql -u root -p

mysql> CREATE DATABASE owncloud;

mysql> GRANT ALL ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'mypass';

mysql> quit


заходим через браузер по адресу:
http://VIP
Мы видим начальный экран приветствия, где настраиваем
1. учетную запись (имя пользователя и пароль)- это будет админская учетная запись
2. в качестве базы данных выбираем mysql
2.1 указываем базу (owncloud) имя пользователя для доступа к базе
     (owncloud) и пароль (mypass), имя хоста оставляем без изменений (localhost)
т.к. у нас кластер а конфиг файл у нас не реплицируется, поэтому мы выключим одну ноду (любую), а после включим на скопируем на нее "правильный"
/var/www/owncloud/config/config.php

 Ну вот и все, теперь конфигурим сервер из вебинтерфейса под ваши нужды, как это делать читаем в админ мануале от вендера, ну или в гугль!

PS: узнал, что основатель проекта и 9 из 10 основных кодера покинули компанию owncloud и форкнули продукт под новой маркой nextcloud, что посути означает, что в скором времени(скорее всего)owncloud канет в летА, посему лучше сразу перейти на nextcloud, что я и сделал:-))), благо миграция занимает несколько минут, правда с 9.1 пока нет возможности перейти до официального выхода nextcloud 10, поэтому я даунгрейднул систему(проще говоря переустановил) до версии 9.0.4, а уже с нее легко переехал на nextcloud 9.0.53
howto по ссылке

Вот теперь все,здоровья Вам, мира и по традиции
Удачи и помните:"Все в Ваших руках, если есть "Руки""

вторник, 9 августа 2016 г.

Организовываем почтовый сервер на базе Zimbra OSE 8.7 и хождение почты, через OpenVPN тоннель

В прошлой статье Мы создали тоннель OpenVPN  и теперь организуем у себя дома почтовый сервер на базе Zimbra OSE 8.7, почта у нас будет ходить через этот самый тоннель, так же через него будет предоставлен доступ к web клиенту почтового сервера.
Поехали!!!

1. Создадим виртуальную Linux (Ubuntu x64) машину для будущего почтового сервера (нагрузка будет невысокая, поэтому будет достаточно 2 ядра и 2GB RAM)
2. Скачаем с сайта дистрибутив Ubuntu 14.04 (на момент написания статьи - это самая актуальная версия под которую можно установить последний стабильный релиз Zimbra 8.7)
3. Инсталлируем наш linux на свеже-созданную VM
4. Установим Zimbra OSE 8.7
Подробности по ссылке
Единственно, я в отличии от авторов статьи не устанавливал zimbra-proxy


После удачного завершения инсталляции, заходим в админку:
https://10.10.10.50:7071
под учетной записью администратора и начинаем последовательно конфигурить наш сервер.

На домашней страницы админки, нам предлагают начать с установки сертификата (по умолчанию самоподписанный уже установлен), позже мы инсталлируем ssl сертификат на веб. В общем не мудрствуя лукаво переходим сразу к шагу 2 и создаем актуальный домен, который будет соответствовать заранее купленному у регистратора доменов, также в управлении зонами dns (там же у регистратора) необходимо создать A и MX- записи ,прописать вновь созданному домен ip нашей VPS, а в управлялке VPS прописать обратную зону! Ну все эти шаги они очевидны для тех кто знаком с настройкой почтовых серверов для использовании за рамками своей локальной сети!
 Созданный домен назначаем как домен по умолчанию:


Если Вы не собираетесь использовать LDAP аутентификацию, то переходим к шагу 3 где создадим пользователей в актуальном домене, которые будут авторизовываться на сервере с использованием внутренней аутентификации.

Проверим хождение почты внутри локальной сети, для этого зайдем на вебку:
https://10.10.10.50:8443
под одной из созданных учетных записей  заходим в почту и "покидаем" почтой, если все норм, будем выпускать наш сервер в "мир"

Заходим в административную панель нашего, уже знакомого по предыдущей статье, OpenVPN Access Server  и в свойствах пользователя в блоке DMZ settings , открываем необходимые порты, т.е. прописываем:
85.XX.XX.XX:tcp/8443 - для доступа к веб-клиенту почты
85.XX.XX.XX:tcp/25 - для SMTP
85.XX.XX.XX:tcp/443 - для HTTPS

если собираетесь использовать pop3 и imap, то 110 и 143, мне хватает веб поэтому для этих служб я ничего открывать не стал!

ну и соответственно делаем порт форвард на нашем сетевом экране pfsense:

если все правильно сделали, то сможете зайти на веб-клиент zimbra из вне, получилось? отлично, пробуем послать почту куда-нибудь в "мир", скорее всего ваше письмо попадет в спам, особенно если вы послали письмо людям, которые используют спам фильтры, одним из критериев которых является отфильтровывать ненужную корреспонденцию основываясь на списки так называемого сообщества спамхаус, которые не особо замарачиваясь вносят целые подсети провайдеров VPS, ну в этом конечно есть рациональное зерно, потому что частенько спамеры используют арендованные виртуалки для рассылки этого самого спама. Лично у меня на некоторых общественных почтовиках письма дошли нормально, гугл поместил в спам, но это нестрашно, можно указать что письма с данного домена не являются нежелательным и  в дальнейшем, все будет нормал!

Теперь сделаем так ,чтобы не было предупреждения о том, что вы используете "неправильный" сертификат, ну эт когда в левом верхнем углу веб-клиента наблюдаем восклицательный знак:-)

Получить правильный годовой сертификат можно при помощи startSSL, для этого нужно зарегистрироваться на сайте, система установить свой сертификат на ваш компьютер, (авторизовываться на их сайте будете по этому сертификату, зашли, теперь выберем сертификат, естесно бесплатный, нас попросят верифицировать наш домен, проходим валидацию, там будет выбор на какой ящик послать письмо я выбрал postmaster@mydomain.ru , предварительно конечно создав такого пользователя, хотя можно создать алиас к уже существующему, но не суть, письмо с кодом пришло практически сразу.

Теперь сгенерируем запрос на сертификат для чего идем а админку zimbra и выполняем ряд незамысловатых действий:
1. Убеждаемся что папка /opt/zimbra/ssl/zimbra/commercial/ пуста, если нет (сделайте резервную копию и очистите.
2. Через вебконсоль администратора Идем в раздел сертификатов и генерируем .csr заявку.
Заполняйте аналогично картинкам, но под свои данные:






проверяем /opt/zimbra/ssl/zimbra/commercial/ там должны появится 2 файла commercial.csr,commercial.key.
Скопируем их на всякий случай.

полученный файл .csr (действием на последней картинке) открываем в блокноте и копируем все содержимое.

Возвращаемся на startssl.com, переходим на генерацию сертификатов.
В верхнем поле заполняем наши доменные имена, внизу выбираем и вставляем наш полученый от zimbra код из .csr файлика. И нажимаем генерировать.

 Получим архив с сертификатами под разные типы серверов. Нас интересует OtherServer. Его и распаковываем.
Или сначала заливаем на сервер zimbra и там распаковываем. Внутри папки есть 3 файла root.crt 1_Intermediate.crt 2_домен.ru.crt

Переходим к главному, все действия проводим из под root:

Создаем папку /tmp/certs туда необходимо скачать мастер сертификаты startssl.com Скачиваем ca.pem и sub.class1.server.ca.pem

Переходим в папку и объединяем их

cd /tmp/certs/

cat ca.pem sub.class1.server.ca.pem > ca_bundle.crt



Убеждаемся что файл ключа на месте и задаем ему разрешения

chmod 740 /opt/zimbra/ssl/zimbra/commercial/commercial.key



В папке /tmp/certs/ обьединяем. Для создания правильной цепочки сертификатов

cat 2_домен.ru.crt > commercial.crt

cat root.crt 1_Intermediate.crt > ca_chain.crt



Проверяем всю цепочку

root@zimbra:/tmp/ssl# /opt/zimbra/bin/zmcertmgr verifycrt comm /opt/zimbra/ssl/zimbra/commercial/commercial.key /tmp/certs/commercial.crt /tmp/certs/ca_chain.crt



#Должны получить вот такой вот вывод. Приблизительно в зависимости от индивидуальных настроек.



** Verifying /tmp/certs/commercial.crt against /opt/zimbra/ssl/zimbra/commercial/commercial.key

Certificate (/tmp/certs/commercial.crt) and private key (/opt/zimbra/ssl/zimbra/commercial/commercial.key) match.

Valid Certificate: /tmp/certs/commercial.crt: OK




Это свидетельствует об правильно собранной последовательности.



Устанавливаем

root@zimbra:/tmp/ssl# /opt/zimbra/bin/zmcertmgr deploycrt comm /tmp/certs/commercial.crt /tmp/certs/ca_chain.crt





** Verifying /tmp/certs/commercial.crt against /opt/zimbra/ssl/zimbra/commercial/commercial.key

Certificate (/tmp/certs/commercial.crt) and private key (/opt/zimbra/ssl/zimbra/commercial/commercial.key) match.

Valid Certificate: /tmp/certs/commercial.crt: OK

** Copying /tmp/certs/commercial.crt to /opt/zimbra/ssl/zimbra/commercial/commercial.crt

** Appending ca chain /tmp/certs/ca_chain.crt to /opt/zimbra/ssl/zimbra/commercial/commercial.crt

** Importing certificate /opt/zimbra/ssl/zimbra/commercial/commercial_ca.crt to CACERTS as zcs-user-commercial_ca...done.

** NOTE: mailboxd must be restarted in order to use the imported certificate.

** Saving server config key zimbraSSLCertificate...done.

** Saving server config key zimbraSSLPrivateKey...done.

** Installing mta certificate and key...done.

** Installing slapd certificate and key...done.

** Installing proxy certificate and key...done.

** Creating pkcs12 file /opt/zimbra/ssl/zimbra/jetty.pkcs12...done.

** Creating keystore file /opt/zimbra/mailboxd/etc/keystore...done.

** Installing CA to /opt/zimbra/conf/ca...done.





Перезагружаемся:

root@zimbra:/tmp/ssl# su zimbra

zimbra@zimbra:/tmp/ssl$ zmcontrol restart


Проверяем, теперь при https://mailserver.mydomain.ru:8443 никаких предупреждений быть не должно!!!
Радуемся и хлопаем в ладошки!

А на сегодня все!

Удачи и помните:"Все в Ваших руках, если есть "Руки""

понедельник, 8 августа 2016 г.

Получаем "белый" IP через OpenVPN тоннель и организовываем доступ через него к внутренней сети



Намедни появилась необходимость в белом статическом ip, но т.к. мой провайдер данной услуги не предоставляет, а использовать костыль в форме динамического dns нет никакого желания, было принято решение получить этот самый адрес посредствам VPN,
Т.е. используя связку:
VPS который выдает “белый IP” (арендованный у одного из многих (и по мне так не самого худшего) провайдера))à
Pfsense (установленной в домашней инфраструктуре, находящийся за NAT) à тестовая инфраструктура за pfsense (виртуальная машина), развернутая в среде VMware vSphere 6.0
Приблизительная схема сети:





В итоге наш сетевой экран pfsense должен получить адрес 85.XX.XX.XX и  соответственно мы будем иметь доступ к нашей инфраструктуре через этот адрес!
Поехали!!!

  1. Арендуем VPS (с линукс на борту, я выбрал ubuntu 14.04), скачиваем и устанавливаем OpenVPN Access Server
  2. На pfsense настраиваем клиента OpenVPN
  3. Организовываем тоннель
Подробности по ссылкам:

Предположим что все у нас заработало, тоннель есть, айпишник “белый и пушистый”, что же дальше, как же нам теперь получить доступ к нашей виртуальной инфраструктуре, да очень легко:

  1. На OpenVPN Access Servere необходимо проложить трассу до нашей внутренней подсети 10.10.10.0/24, для этого заходим в админку под административной учеткой, и добавляем доступ в данную подсеть нашему пользователю от имени которого мы строим тоннель , в блоке (слева)

 

User Management

User Permissions --> Show

 

В блоке VPN Gateway делаем следующее:


Теперь мы “видим” нашу внутреннюю подсеть

  1. Осталось “расшарить” сервисы для доступа из вне, проще говоря прокинуть порты к pfsense, а уж там в свою очередь  сделать порт редирект на нужную машину. Для примера организуем доступ к нашему серверу WS2016  по RDP (!!! Default Gateway у машины должен быть 10.10.10.1 (внутренний pfsense)) , делаем следующее:
В блоке DMZ settings указываем ip адрес сервера (наш “белый” IP):протокол/порт(в данном примере это RDP 3389), для пущей сукьюрности можно указать любой другой из незанятых конечно!

Теперь наш OpenVPN сервер откроет порт 3389 и будет его слушать ,все пакеты, которые через него пойдут будут перенаправляться в тоннель.  

  1. После этого идем на pfsense и там создаем правило NAT которое будет пробрасывать порт на нужную нам машину
    

Где REMOTEVPNINTERFACE – это интерфейс нашего VPN тоннеля созданный на этапе настройки OpenVPN Client’а

И теперь если мы , из любого места, где есть “всемирная паутина”, откроем стандартный виндовый RDP клиент и наберем в строке 85.XX.XX.XX, то попадем на наш сервер WS2016 (предварительно, конечно, разрешив на нем доступ к рабочему столу )

Таким образом, проделывая вот такие незамысловатые манипуляции мы сможем разрешать разные сервисы! В следующей статье расскажу как организовать домашний почтовый сервер и хождение почты, через имеющийся тоннель!

 Удачи и помните:"Все в Ваших руках, если есть "Руки""

PS: Стали поступать вопросы, а вот как бы получить доступ в подсеть 192.168.1.0/24, да очень просто, всего-навсего необходимо реализовать следующую схему:
Т.к. за бесплатно на OpenVPN Access Server'e можно использовать 2 подключения, то нам ничего не стоит построить еще один тоннель, без какого-либо вреда уже существующему!
 Для примера организуем доступ к рабочему столу по RDP нашего домашнего laptop (OC windows) который находится в домашней подсети с IP: 192.168.1.50

1.Создадим еще одного пользователя, для чего заходим в web-admin панель под админской учеткой и в блоке слева:

User Management

User Permissions в поле New Username 
 
создаем нового пользователя user-two (я его создал ранее):


это и будет тот пользователь из под которого будет строиться тоннель с нашего ноута.

2. Добавим этого пользователя на нашем linux сервере, где установлен OpenVPN Access Server
для чего коннектимся по ssh и добавляем пользователя с паролем:


после этого заходим в браузер по адресу:

https://85.XX.XX.XX:943

username: user-two
password: (пароль который задали на предыдущем шаге)

там он начинает че-то долго устанавливать, в принципе можно не ждать а кликать по ссылке, организовав закачку виндового OpenVPN Client'a

Установим его наш ноутбук.

3. Настраиваем доступы, опять идем в админку сервера и производим практически все те-же манипуляции что и с user-one отличие только в маршруте и в открываемом порту (правда для user-one номер порта 3389 придется изменить, чтоб конфликта не было, а в pfsense перенаправить измененный порт на нужный)



ну вот и все, теперь при запуске OpenVPN Client'a которого мы установили на предыдущем шаге, будет создан VPN тоннель и мы сможем подключится по RDP к laptop (естественно необходимо на нем разрешить доступ к удаленному рабочему столу), а уж с него можно ходить куда вздумается в рамках 192.168.1.0/24 подсети!
Теперь вроде все!

Всем хорошего настроения!!!

PPS: тут выявилась одна небольшая проблемка, когда на VPS подняты 2 тоннеля, то тот который с pfsense периодически "падает" и его приходится "поднимать" в ручную, дабы избежать лишних телодвижений установим на наш файервол Service_Watchdog



и поставим мониторить нашу OpenVPN службу:


И теперь при падении OpenVPN тоннеля он благополучно будет поднят нашим замечательным Service_Watchdog!