27 ноября 2017

Установка и настройка PHPBrew

PHPBrew - позволяет собрать и установить несколько различных версий PHP.

Установка зависимостей Ubuntu 14.04

В терминале выполняем команды:
sudo apt-get update
sudo apt-get build-dep php5
sudo apt-get install php5 php5-dev php-pear autoconf automake curl libcurl3-openssl-dev build-essential libxslt1-dev re2c libxml2 libxml2-dev php5-cli bison libbz2-dev libreadline-dev
sudo apt-get install libfreetype6 libfreetype6-dev libpng12-0 libpng12-dev libjpeg-dev libjpeg8-dev libjpeg8  libgd-dev libgd3 libxpm4 libltdl7 libltdl-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install gettext libgettextpo-dev libgettextpo0
sudo apt-get install libicu-dev
sudo apt-get install libmhash-dev libmhash2
sudo apt-get install libmcrypt-dev libmcrypt4
sudo apt-get install mysql-server mysql-client libmysqlclient-dev libmysqld-dev

23 ноября 2017

Настройка DKIM в Zimbra

DKIM (DomainKeys Identified Mail) — это метод e-mail аутентификации, основанный на проверке подлинности цифровой подписи. DKIM необходим для того, чтобы почтовые сервисы проверяли отправителя и защищали получателя письма от мошеннических рассылок, которые производятся с подменой адреса отправителя.

Метод предусматривает шифрование заголовков исходящих сообщений с помощью закрытого ключа домена, и добавление открытой версии ключа в записи DNS домена, доступного всем. MTA сервера-получателя запрашивает для расшифровки заголовков входящих сообщений открытый ключ у DNS-сервера отправителя, а затем проверяет, действительно ли сообщение отправлено от заявленного источника.

image

DKIM стал доступен с версии Zimbra 8.0. Настройка подписи состоит из двух этапов:

Первый этап: генерация ключей и селектора


Добавляем данные DKIM к домену, у которого еще нет существующей конфигурации DKIM:

# su zimbra
$ /opt/zimbra/libexec/zmdkimkeyutil -a -d example.com


Получаем:

DKIM Data added to LDAP for domain example.com with selector ECAC22D2-DCA2-11E6-BA30-B554729FE32A
Public signature to enter into DNS:
ECAC22D2-DCA2-11E6-BA30-B554729FE32B._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5OCY0sX04ziF+sOHt/1kq3A7iAzAjBjb4JteaoFzu1q2uBOiQS0uyaFeY6CgSgRRbvPnq8cWLG/XMU0tM9gSGtgtWDmHOs6/+QgKp6zRmetfsyABA2Y2U+XJlVURUE5ai3KIA/njt7IGZ5yeFsdZIKmhOCAOPGCovq10xkZXHdjRwiqxbCYGXv2m3o74BcWtOLPfEvexD5PYx"
"aTWFbelJpGlDN7WdBCE+ObpLGkJ9co/1sVOcd3c9SHfPq3jcBAFm7oPX2ak7Fb7cslVK77lA2hBgMYqI2Sh+T64o6R33dU++Ej7CuImmv7PAqVUn5MjYr05t3LK9dwWM8Cm6aJ/QIDAQAA" ) ; ----- DKIM key ECAC22D2-DCA2-11E6-BA30-B554729FE32A for example.com


Также можно обновить DKIM данные для домена:

$ /opt/zimbra/libexec/zmdkimkeyutil -u -d example.com

Удалить DKIM данных для домена:

$ /opt/zimbra/libexec/zmdkimkeyutil -r -d example.com

Извлечь сохраненные данных DKIM для домена:

$ /opt/zimbra/libexec/zmdkimkeyutil -q -d example.com

Второй этап: обновление DNS-записей


Публичный ключ нужно добавить как TXT-запись в домен:

$ORIGIN example.com.
ECAC22D2-DCA2-11E6-BA30-B554729FE32B._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5OCY0sX04ziF+sOHt/1kq3A7iAzAjBjb4JteaoFzu1q2uBOiQS0uyaFeY6CgSgRRbvPnq8cWLG/XMU0tM9gSGtgtWDmHOs6/+QgKp6zRmetfsyABA2Y2U+XJlVURUE5ai3KIA/njt7IGZ5yeFsdZIKmhOCAOPGCovq10xkZXHdjRwiqxbCYGXv2m3o74BcWtOLPfEvexD5PYx"
"aTWFbelJpGlDN7WdBCE+ObpLGkJ9co/1sVOcd3c9SHfPq3jcBAFm7oPX2ak7Fb7cslVK77lA2hBgMYqI2Sh+T64o6R33dU++Ej7CuImmv7PAqVUn5MjYr05t3LK9dwWM8Cm6aJ/QIDAQAA" ) ; ----- DKIM key ECAC22D2-DCA2-11E6-BA30-B554729FE32A for example.com


Обновите DNS, и проверьте результат выполнения команды:

# host -t txt SELECTOR._domainkey.DOMAIN

Например:

# host -t txt ECAC22D2-DCA2-11E6-BA30-B554729FE32B._domainkey.example.com ns1.example.com 

Если ключ извлекается используйте /opt/zimbra/common/sbin/opendkim-testkey, чтобы убедиться, что открытый ключ соответствует закрытому.

$ opendkim-testkey -d example.com -s ECAC22D2-DCA2-11E6-BA30-B554729FE32B -x /opt/zimbra/conf/opendkim.conf

Если получили ошибку:

opendkim-testkey: /opt/zimbra/conf/opendkim.conf: configuration error at line 0

Это означает, что файла /opt/zimbra/conf/opendkim.conf не существует, создать его можно командой:

$ zmprov ms `zmhostname` +zimbraServiceEnabled opendkim ./libexec/configrewrite opendkim

Если возникнет необходимость отозвать ключ подписи DKIM, установите пустой «р=» тег в записи TXT
По умолчанию создается 1024-битный ключ (зависит от версии ZCS), изменить размер можно параметром -b

P.S: Есть проблема с изменением body hash подписи dkim в письмах, содержащих кириллицу, из-за чего получаем dkim=neutral (body hash did not verify) или dkim=false

Решение найдено, возможно кому то еще пригодится:
#su zimbra
zimbra@mail:$ /opt/zimbra/postfix/sbin/postconf -e disable_mime_output_conversion='yes'
zimbra@mail:$ zmmtactl restart

10 ноября 2017

Микротик не отвечает на пинги через WAN, mangle настроен, интернет есть. Что может быть не так?

Если вы ищете руководство по настройке dual-wan failover на микротике, то среди задач вы будете решать, как сделать, чтобы при пинге через ISP1 микротик направлял бы ответ через шлюз GW1, а при пинге через ISP2 - соответственно, через GW2.
Штука в том, что даже если все правильно настроено, и NAT работает, и локальные клиенты в сеть ходят, и firewall вроде разрешает пинг снаружи, а снаружи к микротику не обратитьсяНе пингуется и все тут.
Вы наверняка видели что-то вроде:
/ip firewall mangle
add chain=input action=mark-connection new-connection-mark=ISP1->Input passthrough=no dst-address=IP1 in-interface=ether1
add chain=output action=mark-routing new-routing-mark=ISP1 passthrough=no connection-mark=ISP1->Input
add chain=input action=mark-connection new-connection-mark=ISP2->Input passthrough=no dst-address=IP2 in-interface=ether2
add chain=output action=mark-routing new-routing-mark=ISP2 passthrough=no connection-mark=ISP2->Input
Т.е.:
1) если пришел пакет со стороны провайдера ISP1 (через интерфейс ether1) с конечным адресом нашего микротика IP1 (т.е. в input), то пометить это соединение меткой "ISP1->Input".
2) исходящий трафик, связанный с установленным ранее соединеним, помеченным меткой "ISP1->Input", маршрутизировать по правилам таблицы ISP1.
Аналогично для входящих пакетов со стороны провайдера ISP2.
И все бы хорошо, если у вас есть маршрут по-умолчанию без указания таблицы маршрутизации.
Но у вас могут быть только такие дефолтные машруты (до 0.0.0.0/0):
/ip route
add distance=1 gateway=GW1 routing-mark=ISP1
add distance=1 gateway=GW2 routing-mark=ISP2
и ни одного маршрута по-умолчанию без указания routing-mark. Т.е. основная таблица маршрутизации пустая.
При пинге IP1 снаружи через ISP1 (input) из примера выше входящий пакет будет принят, промаркируется соединение (new-connection-mark=ISP1->Input). А вот ответ (output) никуда не уйдет, т.к. ответный пакет не попадет в output. Вообще. И промаркирован он не будет. И микротик не отправит его никуда.

Решить проблему можно по-разному.
1. prerouting вместо output
Любой пакет до того, как будет принято решение о его судьбе, проходит цепочку prerouting. И если заменить output на prerouting, то еще до попадания в output пакет будет промаркирован для маршрутизации через таблицу ISP1 (new-routing-mark=ISP1), далее будет принято верное решение о необходимости отправить пакет в output.
2. добавить маршруты по-умолчанию без указания таблиц маршрутизации
Например, как-то так:
/ip route
add distance=1 gateway=GW1 distance=10
add distance=1 gateway=GW2 distance=10
Или даже просто один из них:
/ip route add distance=1 gateway=GW1 distance=10
Не важно, будет этот маршрут доступен или нет, осноная таблица маршрутизации не будет пустой и микротик начнет искать замену этому маршруту. А если в основной таблице пусто - то и микротик делать ничего не будет и дело не дойдет до момента маркировки пакета в mangle -> output.

https://bozza.ru/art-282.html

08 ноября 2017

Два интернет провайдера на Mikrotik RouterOS

В этой статье рассмотрим настройку роутера компании Mikrotik, с RouterOS на борту, для одновременной работы с двумя провайдерами.
Устройства от латвийской компании MikroTik — гибкие в настройке, функциональные решения для домашних и корпоративных сетей. Операционную систему RouterOS можно так же установить на различные аппаратные платформы, включая x86.
Дано:
  • локальная сеть 192.168.1.0/24 — роутер выступает в роли DNS сервера и шлюза. Адреса в локальной сети присваиваются вручную;
  • сеть провайдера 1.1.1.0/29, шлюз — 1.1.1.6, DNS1 — 1.1.10.1, DNS2 — 1.1.10.2;
  • сеть провайдера 1.1.2.0/29, шлюз — 1.1.2.6, DNS1 — 1.1.10.1, DNS2 — 1.1.10.2
Рис.1 - Схема сети
Схема сети
Настраивать будем на компьютере с адресом в локальной сети 192.168.1.10. Для примера возьмем роутер модели RB951G-2HnD.

Порт 1 и 2 будем использовать под интернет провайдеров, а остальные под локальную сеть.
Теперь Вы можете подсоединить все патч-корды с соответствующими портами. Я же предпочитаю первоначальную настройку производить на отдельном ноутбуке, соединив LAN порт ноута с пятым портом роутера. Подключаться будем через программу Winbox. Скачать можно с самого роутера, введя в браузере адрес по умолчанию «192.168.88.1» или с mikrotik.com. Сразу можно скачать обновление для RouterOS — ветки Bugfix only. На момент написания статьи это была версия 6.34.6 (правки при 6.39.3).
Итак, запустим Winbox при подключеном роутере.
На вкладке Neighbors автоматически выполняется поиск всех видимых устройств на RouterOS в сети. Подключаемся по mac-адресу к найденному устройству пользователем admin с пустым паролем.
winbox_neighbors
После входа появится окно описания конфигурации по умолчанию. Нажимаем «Remove Configuration»
reset-configuration
Описание конфигурации по умолчанию

Далее как минимум необходимо задать пароль для пользователя. Рекомендуется создать своего пользователя, а встроенную учетную запись отключить, что мы и сделаем. Идём в меню System -> Users и добавляем пользователя, нажав на плюс (+). Name — на Ваш выбор, Group — права пользователя ставим в full, Password — на Ваш выбор. Также можно перечислить адреса, с которых разрешено подключаться к роутеру, в опции Allowed Address. Жмём ОК. Встроенную учетную запись отключаем или удаляем нажав на (x) или (-) соответственно. Переподключаемся под новым пользователем.
Управление учётными записями
Управление учётными записями


Теперь определимся с сетевыми интерфейсами, перейдя в меню Interfaces. Как было описано выше, первый и второй порт роутера используем под wan порты, а остальное выпускаем в локальную сеть, указывая для портов с 3го по 4й в поле Master Port 5й порт. Для удобства к названию портов были приписаны описания (ether1-wan1, ether2-wan2, ether3-slave, ether4-slave, ether5-lan-master). Последний порт был выбран мастером не случайно. Если возникнет необходимость добавить еще один wan интерфейс, то мы просто уберем зависимость третьего порта от мастер-порта и настроим его под свои нужды. Необходимость переназначать мастер порт не возникнет, в отличии от варианта с присвоением роли мастер-порта третьему порту роутера.
Настроим интерфейсы


При необходимости использовать wi-fi-интерфейс потребуется создать bridge интерфейс и добавить в него мастер-пор ethernet интерфейсов и wi-fi интерфейс  (на своём оборудовании wi-fi я отключил, так как в нём не было необходимости). В данной статье используется так называемая switch-коммутация портов, которая обладает большей производительностью по сравнению с bridge-коммутацией. В приведенном роутере используется один switch-микроконтроллер на 5 портов. При наличии более одного switch-контроллера на каждый контроллер назначается один мастер порт, затем они объединяются в bridge, если есть необходимость объединить их в одно пространство. Подробнее о различиях способов коммутации портов можно прочитать здесь. Ниже приведен пример создания bridge-интерфейса и добавление в него мастер-интерфейса.
Создадим bridge- интерфейс
Создание bridge- интерфейс
Добавим порт в bridge-интерфейс
Добавление порта в bridge-интерфейс


Теперь укажем ip адреса для интерфейсов. Переходим в меню IP -> Addresses и добавляем адреса, вписывая его в поле Address с маской и выбирая интерфейс в поле Interface. Адрес сети в поле Network можно не вводить т.к. он заполнится автоматически, но при изменении адреса не забудьте проверить это поле. При объединении свитч-группы портов и wifi интерфейса в bridge — ip адрес присваивается на bridge интерфейс. В моём случае адрес присваивается мастер-порту.
Адрес для wan1
Адрес для wan1
Адрес для wan2
Адрес для wan2
Адрес роутера в локальной сети


Адреса присвоены
Т.к. у нас будет два wan-интерфейса и статические адреса, настраиваемые на интерфейсах вручную, то все маршруты мы напишем вручную. В случае настройки wan-интерфейса, например, на ppp подключение, то не забудьте убрать галочку ‘Add Default Route’.
В меню IP-> DNS укажем DNS-серверы и поставим галочку на Allow Remote Requests (если оно Вам надо).  Тут же можно создать запись с именем нашего роутера, предварительно изменив его (имя) в меню System -> Identity.
Настроим DNS
Настроим DNS


В случае классической настройки роутера с одним ISP WAN далее следовало бы указать шлюз, добавить стандартные правила Firewall’а и правило NAT для преобразования адресов. Но так как мы имеем дела с двумя ISP, то следует сначала настроим Firewall и NAT, а так же пометим интерфейсы и трафик для корректной маршрутизации. Для каждого wan интерфейса создаём по правилу в IP -> Firewall на вкладке NAT. В поле Chain на вкладке General выбираем srcnat, Src.Address — пишем локальную сеть с маской, Out. Interface — выбираем wan интерфейс. Если провайдер выдает динамически изменяющийся ip адресс, то на вкладке Action в поле Action выбираем masquerade. При статическом IP адресе, как в текущем примере, выбираем Action — src-nat и в поле To Address пишем адрес wan интерфейса. Нажимаем ОК.


Теперь переходим на вкладку Filter Rules и добавляем набор стандартных правил. В графической оболочке принцип настройки такой же как и при добавления правила NAT — на вкладке General выбираем параметры и цепочку, а на вкладке Action выбираем действие. Ниже привожу набор команд для термина, из которых понятно что и как настроить в каждом правиле. Так же можно скопировать и выполнить в окне терминала (кнопка New Terminal) одним списком.

Для установленных и связанных соединений в цепочке forward добавлено правило fasttrack connection. Это правило позволит разгрузить процессор маршрутизатора, отключив (пропустив) дополнительную обработку пакетов в установленных и связанных соединениях. Подробнее на MikroTik Wiki.
В рассматриваемом примере в локальной сети находится сервер, с которым будет вестись работа извне. Для выполнения этой задачи необходимо чтобы ответы на запросы, пришедшие по какому-либо из двух wan-интерфейсов, отправлялись на тот же самый интерфейс.
Для выполнения поставленной задачи необходимо пометить соединения с провайдером и после направлять трафик по соответствующим маршрутам, а так же создать сами маршруты.
Сразу добавим статические маршруты до шлюзов каждого из провайдера, плюс по маршруту на провайдера для соединений с метками маршрутизации. Маршрут до гейтов провайдеров можно указать одним правилом с одним на всех значением Distance, таким образом получив своеобразную балансировку нагрузки по wan интерфейсам. [По резервированию и Check Gateway чуть позже]
Маршрут до гетов провайдеров. Балансировка нагрузки
Маршрут до гейтов провайдеров. Балансировка нагрузки
В каждом маршруте для помеченных соединений я указывал IP адреса интерфейсов wan1 и wan2. В зависимости от типов настроенных соединений для wan’ов можно указывать IP интерфейса или сам интерфейс. Для статичных адресов метод с интерфейсами не заработал, так как адреса статикой были присвоены на бродкастные интерфейсы и с другой стороны wan интерфейса находятся медиаконвертеры провайдеров без proxy-arp на интерфейсах. В поле Routing Mark выбираем соответствующую метку.
Маршрут для помеченных пакетов через wan1
Маршрут для помеченных соединений через wan1
Маршрут для помеченных пакетов через wan2
Маршрут для помеченных соединений через wan2


В IP -> Firewall на вкладке Mangle создаём правила для двух провайдеров, которые будут помечать соединения идущие по цепочке forward с wan интерфейсов. На вкладке General в поле Chain выбираем forward, в поле In. Interface выбираем ether1-wan1, затем на вкладке Action выбираем mark connection, в поле New Connectio Mark пишем произвольную метку, например wan1-con. Аналогичным образом создаём правило для wan2.
Помечаем соединения для wan1
Помечаем соединения для wan1
Помечаем соединения для wan2
Помечаем соединения для wan2
Следом создаем еще два правила на вкладке Mangle — для помеченных ранее соединений указываем метки для маршрутизации, чтобы помеченные ранее соединения продолжали работать через wan интерфейсы, через которые были установлены (соединения). На вкладке General в поле Chain выбираем prerouting, в поле Src.Address пишем 192.168.1.0/24 (если за маршрутизатором несколько подсетей, то удобно занести их в Firewall->Address Lists и затем указать созданый лист на вкладке Advanced в поле Src. Address List), в поле Connection Mark выбираем метку нашего соединения — wan1-con. Переходим на вкладку Action, в поле Action выбираем mark routing, в поле New Routing Mark пишем wan1-rt. Аналогично создаем правило для wan2, выбирая wan2-con и вписывая wan2-rt для Connection Mark и New Routing Mark соответственно.
mikrotik_mark_rt_wan1
Добавляем метку маршрутизации для соединений через wan1
mikrotik_mark_rt_wan2
Добавляем метку маршрутизации для соединений через wan2

Теперь подобным образом создаём пары правил для каждого интерфейса, чтобы корректно обрабатывать соединения извне с самим маршрутизатором (например SSH, WinBox, VPN). Для каждого wan выбираем Chain — input, Dst.Address — ip адрес wan интерфейса, In/Interface — wan интерфейс, Action — mark connection, New Connection Mark — текстовую марку, уникальную для каждого правила.


Теперь похожим образом добавляем помеченным маршрутам метку маршрутизации. Цепочка output, Connection Mark — присвоенная метка правилом выше для wan интерфейса. Action — mark routing, New Routing Mark — метка для наших маршрутов через wan интерфейсы.

Пометим собственные соединения маршрутизатора (DNS запросы от маршрутизатора к внешним серверам, проверка пакетов в System->Packages). Цепочка output, Src.Address — адрес wan интерфейса, Action — mark connection, New Connection Mark — уникальная текстовая метка для каждого wan интерфейса.


И добавляем метку маршрутизации. Цепочка output, Src.Address — адрес wan интерфейса, Connection Mark — присвоенная метка правилом выше для wan интерфейса. Action — mark routing, New Routing Mark — метка для наших маршрутов через wan интерфейсы.


Вот и всё. Выпустив роутер в сеть проверяем доступность шлюзов провайдера — посмотрев на список маршрутов в колонке Gateway к адресу шлюза будет дописано reachable. Так же в списке появятся динамически созданные маршруты. Проверяя работу из локальной сети можно отключая интерфейсы wan в MikroTik’е или просто попеременно выдергивать по одному проводу из wan’ов. Активные соединения, установленные ранее через отключенный wan будут теряться, но перезапустив соединение (например обновив страницу в браузере) оно будет установлено через оставшийся активный wan.
В приведенном примере оба wan порта работают в подсетях одного провайдера и DNS серверы для подсетей общие. Если провайдеры разные, то скорее всего потребуется указать через какой интерфейс ходить до конкретного DNS сервера, так как к каждому DNS серверу может быть разрешен доступ только из сети соответствующего ему повайдера. Таким же образом можно принудительно пускать трафик до конкретных ресурсов через конкретный wan (например, если до ресурса во внешней сети соединение оптимально по скорости/стабильности через конкретного провайдера, или просто только из сети/ip-адреса этого провайдера разрешен доступ).
Перейдем в IP -> Firewall и на вкладке Address Lists создадим для каждого wan по группе адресов (over-wan1 и over-wan2) попутно добавляя необходимые адреса или подсети. Каждый последующий элемент добавляется с выбором группы адресов из списка в поле Name. Допустим есть некий сервис по адресу 110.110.110.1 до которого минимальные задержки у провайдера на wan1, а для сервиса по адресу 220.220.220.2 такая же история, но на wan2. В группу over-wan1 мы добавляем 110.110.110.1, а в over-wan2 добавляем 220.220.220.2. Так же в соответствующие группы нужно добавить адреса DNS серверов провайдера, если провайдеры разные. В приведенном примере добавляем только адреса сервисов.
Создаём списки. Добавляем адреса
Создаём списки. Добавляем адреса
Теперь переходим на вкладку Mangle и создаём по правилу на каждый список чтобы пометить маршруты. На вкладке General поле Chain = prerouting и внизу ставим галочку на Connection State — new. Далее на вкладке Advanced в поле Dst. Address List выбираем список адресов (over-wan1) и на вкладке Action в поле Action выбираем mark routing, в поле New Routing Mark выбираем метку (wan1-rt). Таким же образом создаём правило для следующего списка.
mikrotik_addr_list_mang01
mikrotik_addr_list_mang02
mikrotik_addr_list_mang03
Теперь можно проверить доступность ресурсов из адресных списков запустив трассировку до узла. Соединение должно идти через шлюз определенного для выбранного wan провайдера.
Вот  и всё на этом. Удачи Вам!