После продолжительных мучений со связкой Racoon+IPSec, решено было перейти на OpenVPN. Дело в том, что предыдущий вариант организации VPN не обеспечивал адекватного и надежного варианта переключения каналов при падении интернета. Всяческие сбросы ключей и т.п. все равно время от времени приводили к необходимости ручками лезть на роутеры и что-то перезагружать/дописывать. OpenVPN отлично себя показал в этом плане, однако возникла другая проблема — в него не заложено возможности одновременно работать по протоколам TCP и UDP, а UDP и multihome вообще не предусмотрен в версии под FreeBSD.

Итак, имеем 2 офиса по 2 интернет-канала в каждом (основной+резервный). На обоих сторонах FreeBSD, один назовем «Центральный офис» второй «Филиал». Установка и настройка делалась по статье Cancer . Далее возникли первые проблемы. Оказалось, что при некоторых комбинациях этих каналов, VPN лучше работает по TCP, а при других — только UDP. Соответственно требуется такая настройка, чтобы без вмешательства админа, каналы могли сами переключаться. Решается все путем запуска трех серверов OpenVPN — один на TCP протокол и два на UDP-по одному на канал (см. проблему с multihome во FreeBSD).

Центральный офис

убираем из /etc/rc.conf упоминания openvpn
добавляем в /etc/rc.conf:

openvpntcp_enable="YES"
 openvpntcp_if="tun"
 openvpntcp_configfile="/usr/local/etc/openvpn/routertcp.conf"
 openvpntcp_dir="/usr/local/etc/openvpn"
openvpnudpop1_enable="YES"
 openvpnudpop1_if="tun"
 openvpnudpop1_configfile="/usr/local/etc/openvpn/routerudpop1.conf"
 openvpnudpop1_dir="/usr/local/etc/openvpn"
openvpnudpop2_enable="YES"
 openvpnudpop2_if="tun"
 openvpnudpop2_configfile="/usr/local/etc/openvpn/routerudpop2.conf"
 openvpnudpop2_dir="/usr/local/etc/openvpn"

 

копируем базовый /usr/local/etc/rc.d/openvpn в /usr/local/etc/rc.d/openvpntcp и т.д. и допиливаем:

...
 pidfile="/var/run/openvpntcp.pid"
 ...
 load_rc_config openvpntcp
 ...
 eval ": ${openvpntcp_enable:="NO"}"
 eval ": ${openvpntcp_flags:=""}"
 eval ": ${openvpntcp_if:=""}"
 eval ": ${openvpntcp_configfile:="/usr/local/etc/openvpn/openvpntcp.conf"}"
 eval ": ${openvpntcp_dir:="/usr/local/etc/openvpn"}"
 ...
 configfile="$(eval echo ${openvpntcp_configfile})"
 dir="$(eval echo ${openvpntcp_dir})"
 interfaces="$(eval echo ${openvpntcp_if})"
 ...
 command_args="--cd ${dir} --daemon openvpn --config ${configfile} --writepid ${pidfile}"

Аналогично поступаем с двумя остальными, меняя openvpntcp на openvpnop1 и openvpnop2
Далее ставим права:

chmod 755 /usr/local/etc/rc.d/openvpntcp
 chmod 755 /usr/local/etc/rc.d/openvpnudpop1
 chmod 755 /usr/local/etc/rc.d/openvpnudpop2

Далее конфиги:

/usr/local/etc/openvpn/routerudpop1.conf:

local 85.95.105.115 #IP адрес канала 1
 port 1194
 proto udp
 dev tun0
 management localhost 8321
 ca /usr/local/etc/openvpn/keys/ca.crt
 cert /usr/local/etc/openvpn/keys/router.crt
 key /usr/local/etc/openvpn/keys/router.key
 dh /usr/local/etc/openvpn/keys/dh1024.pem
 server 10.10.100.0 255.255.255.0
 push "dhcp-option DNS 10.1.1.1"
 push "dhcp-option DNS 10.1.1.2"
 push "dhcp-option WINS 10.1.1.3"
 push "route 10.1.1.0 255.255.255.0"  #подсеть центрального офиса
 push "route 10.1.2.0 255.255.255.0"  #подсеть филиала
 push "route 10.10.100.0 255.255.255.0"
 push "route 10.10.101.0 255.255.255.0"
 push "route 10.10.102.0 255.255.255.0"
 client-config-dir ccdudpop1
 route 10.10.100.0 255.255.255.0
 client-to-client
 tls-server
 tls-auth keys/ta.key 0
 tls-timeout 120
 auth SHA1
 cipher BF-CBC
 keepalive 10 30
 comp-lzo
 max-clients 100
 user nobody
 group nobody
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status-udpop1.log
 log /var/log/openvpn/openvpn-udpop1.log
 verb 3
 push "ping 10"
 push "ping-restart 20"
 client-connect /usr/local/etc/openvpn/route.sh
 script-security 3 system

 

/usr/local/etc/openvpn/routerudpop2.conf:

local 185.195.205.215 #IP адрес канала 1
 port 1194
 proto udp
 dev tun1
 management localhost 8322
 ca /usr/local/etc/openvpn/keys/ca.crt
 cert /usr/local/etc/openvpn/keys/router.crt
 key /usr/local/etc/openvpn/keys/router.key
 dh /usr/local/etc/openvpn/keys/dh1024.pem
 server 10.10.101.0 255.255.255.0
 push "dhcp-option DNS 10.1.1.1"
 push "dhcp-option DNS 10.1.1.2"
 push "dhcp-option WINS 10.1.1.3"
 push "route 10.1.1.0 255.255.255.0"  #подсеть центрального офиса
 push "route 10.1.2.0 255.255.255.0"  #подсеть филиала
 push "route 10.10.100.0 255.255.255.0"
 push "route 10.10.101.0 255.255.255.0"
 push "route 10.10.102.0 255.255.255.0"
 client-config-dir ccdudpop2
 route 10.10.101.0 255.255.255.0
 client-to-client
 tls-server
 tls-auth keys/ta.key 0
 tls-timeout 120
 auth SHA1
 cipher BF-CBC
 keepalive 10 30
 comp-lzo
 max-clients 100
 user nobody
 group nobody
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status-udpop2.log
 log /var/log/openvpn/openvpn-udpop2.log
 verb 3
 push "ping 10"
 push "ping-restart 20"
 client-connect /usr/local/etc/openvpn/route.sh
 script-security 3 system

/usr/local/etc/openvpn/routertcp.conf:

port 1195
 proto tcp
 dev tun2
 management localhost 8323
 ca /usr/local/etc/openvpn/keys/ca.crt
 cert /usr/local/etc/openvpn/keys/router.crt
 key /usr/local/etc/openvpn/keys/router.key
 dh /usr/local/etc/openvpn/keys/dh1024.pem
 server 10.10.102.0 255.255.255.0
 push "dhcp-option DNS 10.1.1.1"
 push "dhcp-option DNS 10.1.1.2"
 push "dhcp-option WINS 10.1.1.3"
 push "route 10.1.1.0 255.255.255.0"  #подсеть центрального офиса
 push "route 10.1.2.0 255.255.255.0"  #подсеть филиала
 push "route 10.10.100.0 255.255.255.0"
 push "route 10.10.101.0 255.255.255.0"
 push "route 10.10.102.0 255.255.255.0"
 client-config-dir ccdtcp
 route 10.10.102.0 255.255.255.0
 client-to-client
 tls-server
 tls-auth keys/ta.key 0
 tls-timeout 120
 auth SHA1
 cipher BF-CBC
 keepalive 10 30
 comp-lzo
 max-clients 100
 user nobody
 group nobody
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status-tcp.log
 log /var/log/openvpn/openvpn-tcp.log
 verb 3
 push "ping 10"
 push "ping-restart 20"
 client-connect /usr/local/etc/openvpn/route.sh
 script-security 3 system

Создание ключей и т.п. делаем по статье Cancer.
Далее делаем каталоги ccd — для каждого сервера свой:

mkdir /usr/local/etc/openvpn/ccdtcp
mkdir /usr/local/etc/openvpn/ccdudpop1
mkdir /usr/local/etc/openvpn/ccdudpop2

В каждом из них делаем ccd файл для филиала:
/usr/local/etc/openvpn/ccdudpop1/filial1:

ifconfig-push 10.10.100.2 10.10.102.1
 iroute 10.1.2.0 255.255.255.0

/usr/local/etc/openvpn/ccdudpop2/filial1:

ifconfig-push 10.10.101.2 10.10.102.1
 iroute 10.1.2.0 255.255.255.0

/usr/local/etc/openvpn/ccdtcp/filial1:

ifconfig-push 10.10.102.2 10.10.102.1
 iroute 10.1.2.0 255.255.255.0

Т.е. при соединении к разным серверам, клиенту будут выдаваться адреса из разных диапазонов.

Далее самое интересное. Сервер OpenVPN оказывется не может динамически, во время подключения клиента, прописывать маршруты — он умеет это делать только в момент запуска сервера. Поскольку серверов у нас несколько и какому именно будет принадлежать этот маршрут — неясно, приходится обходить это внешним скриптом, который будет запускаться при установлении любого соединения:

/usr/local/etc/openvpn/route.sh:

#!/usr/local/bin/bash
 if [ $common_name == "filial1" ]; then    #filial1 - имя сертификата филиала
 sudo /sbin/route delete 10.1.2.0/24
 sudo /sbin/route add 10.1.2.0/24 $ifconfig_pool_local_ip
 fi

Не забываем про права:

chmod 755 /usr/local/etc/openvpn/route.sh

Однако просто так sudo не даст добавить роут — он естественно спросит пароль. Тут мы ломаем все понятия о безопасности и добавляем в /usr/local/etc/sudoers :

nobody ALL=(ALL) NOPASSWD:/sbin/route
 После этого sudo route будут выполняться без запроса пароля. Как руки дойдут — обязательно пересажу сервера на другого пользователя. Далее, запускаем сервера:
 /usr/local/etc/rc.d/openvpntcp start
 /usr/local/etc/rc.d/openvpnudpop1 start
 /usr/local/etc/rc.d/openvpnudpop2 start

Вывод ifconfig, касаемо интерфейсов tun:

tun0: flags=8051<up ,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
 inet 10.10.100.1 --> 10.10.100.2 netmask 0xffffffff
 Opened by PID 44907
 tun1: flags=8051</up><up ,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
 inet 10.10.101.1 --> 10.10.101.2 netmask 0xffffffff
 Opened by PID 43764
 tun2: flags=8051</up><up ,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
 inet 10.10.102.1 --> 10.10.102.2 netmask 0xffffffff
 Opened by PID 52890</up>

Видим как поднялись три tun-интерфейса — по одному на каждый openvpn сервер.

Филиал
Все настроено по статье Cancer, ключи размещены. Меняем конфиги.

/usr/local/etc/openvpn/filial1.conf :

dev tun
 remote 185.195.205.215 1195 tcp
 #remote 85.95.105.115 1195 tcp
 #remote 185.195.205.215 1194 udp
 remote 85.95.105.115 1194 udp
 client
 resolv-retry infinite
 pkcs12 keys/filial1.p12
 tls-client
 tls-auth keys/ta.key 1
 auth SHA1
 cipher BF-CBC
 ns-cert-type server
 comp-lzo
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status.log
 log /var/log/openvpn/openvpn.log
 verb 3
 ping-restart 20
 #connect-timeout 15

Вот и все. Комбинации каналов и портов в remote меняем по собственной необходимости...

 

 

http://www.mahno.su/freebsd/network/openvpn-tcp-udp

pkg install clamav

После установки проверяем наличие или добавляем строки в /etc/rc.conf:

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

Запускаем даемонов:

# /usr/local/etc/rc.d/clamav-clamd start
# /usr/local/etc/rc.d/clamav-freshclam start

Проверка работы.
Вот простейший пример файла (описано здесь http://ru.wikipedia.org/wiki/EICAR-Test-File), на который реагируют все антивирусы:

X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Это com-файл, который при запуске выводит сообщение: EICAR-STANDARD-ANTIVIRUS-TEST-FILE! Все антивирусы реагируют на это. Отключаем свой антивирус, создаем файл с таким содержанием, аттачим его на веб-почте, пишем тему, например «OLOLO» и присылаем себе на адрес, например на it@adminunix.ru. Результаты у меня следующие:

Письмо отсылалось на it@adminunix.ru, однако сработал роутер check_malware, и письмо попало на admin@firma.ru. В теле письма остались все вложения, в тему письма было внесено изменение и теперь, вместо «OLOLO» она выглядит так:

[CLAMAV: Eicar-Test-Signature] OLOLO

Итог: вся зараженная почта сыпется на админский ящик.

Смотрим логи в директории /var/log/clamav

На этой страничке расписано как настроить Exim для проверки почты антивирусом ClamAV.
 

  • Использованные версии ПО:
    # uname -sr
    FreeBSD 8.0-STABLE
    
    # pkg_info | grep clamav
    clamav-0.96.1
    
    # pkg_info | grep exim
    exim-4.71
    
  • ClamAVУстановка и настройка
  • Exim/usr/local/etc/exim/configure.default
    Ищем строку которая содержит:
    av_scanner =
    

    Раскомментируем если нужно и меняем на:

    av_scanner = clamd:/var/run/clamav/clamd.sock
    

    Раскомментируем строки:

    #  deny    malware    = *
    #  message    = This message contains a virus ($malware_name).
    

    Перезапускаем Exim

    # /usr/local/etc/rc.d/exim restart
    

    Проверка что Exim работает:

    # ps ax | grep exim
     1512  ??  S      0:00.00 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
     1513  ??  S      0:00.00 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
    46661  ??  Ss     0:07.51 /usr/local/sbin/exim -bd -q30m (exim-4.71-0)
    
    Смотрим /var/log/clamav/clamd.log на предмет отсутствия ошибок работы с ClamAV.
  • cat /var/log/clamav/clamd.log | grep FOUND

Понадобилось человеку поставить FreeBSD с ZFS на сервер, но никак не получалось. Решил попробовать сам – но фишка была в том, что сервер физически находился в Украине. Решили делать удаленно.

Грузимся с диска в Live CD , логинимся и проделываем следующее:

1) Создаем каталог и монтируем раздел /etc:
# mkdir /tmp/etc
# mount_unionfs /tmp/etc /etc

2) Разрешаем вход под root в SSH:
# sed -i.bak -e 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config

3) Запускаем SSHD:
# /etc/rc.d/sshd onestart

4) Задаем пароль для root:
# passwd root

5) И поднимаем сеть ( IP и тп изменены на самом деле было сделано тоже самое, но прописывались уже внешний IP и шлюз, так как инет был напрямую через свитч):

Задаем интерфейсу re0 IP 192.168.1.143 и маску 255.255.255.0
# ifconfig re0 inet 192.168.1.143 netmask 255.255.255.0 up

И прописываем шлюз:
# route add default 192.168.1.1

Теперь можно логиниться по SSH на адрес 192.168.1.143 и начать установку через sysinstall, или в моем случае как описано тут. Успехо

Ставим nginx
deathstar# cd /usr/ports/www/nginx
deathstar# make install clean

в /etc/rc.conf добавляем:
nginx_enable="YES"

Ставим MySQL
deathstar# cd /usr/ports/databases/mysql51-server
deathstar# make install clean

в /etc/rc.conf добавляем:
mysql_enable="YES"
Запускаем MySQL

deathstar# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
deathstar# mysqladmin -u root password 'password'

Ставим PHP ( отмечаем [*] FPM Build FPM version )
deathstar# cd /usr/ports/lang/php5
deathstar# make install clean

в /etc/rc.conf добавляем:
php_fpm_enable="YES"

Приводим файл /usr/local/etc/php-fpm.conf к такмоу виду:

[global]
pid = run/php-fpm.pid
error_log = /var/log/php-fpm.log
events.mechanism = kqueue
include=/usr/local/etc/php-fpm.d/*.conf

Создаем каталог,в котором будут лежать описания пулов для PHP-FPM ( кому то может пригодиться, если юзеров для сайтов больше чем один ):

deathstar# mkdir -p /usr/local/etc/php-fpm.d/ и описываем пул
deathstar# ee /usr/local/etc/php-fpm.d/www.conf

[www]
user = www
group = www
listen = /tmp/php-fpm.sock
listen.backlog = -1
pm = dynamic
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[memory_limit] = 128M

Запускаем PHP-FPM:
deathstar# /usr/local/etc/php-fpm start

Ставим Vexim (отмечаем MySQL):
deathstar# cd /usr/ports/mail/vexim/
deathstar# make install clean

Ставим модуль p5-DBD-mysql51
deathstar# cd /usr/ports/databases/p5-DBD-mysql51/
deathstar# make
deathstar# make install clean

Запускаем скрипт:
perl /usr/local/share/vexim/create_db.pl --act=newdb --dbtype=mysql -uid=110 --gid=110 --mailstore=/usr/local/mail
deathstar#
Please enter the username of the mysql superuser: root
Please enter the password of the mysql superuser:
Please enter the name of your NEW database: vexim
--------------------------------------------------
Database: vexim will be created
--------------------------------------------------
Is this correct? (Y = continue / anykey = exit ): Y

Please enter a password for the 'vexim' database user:
Confirm password:
Please enter a password for the 'siteadmin' user:
Confirm password:
The user 'siteadmin' has been added with the password
Database created successfully!

Создаем каталог с виртуальными хостами для nginx

deathstar# mkdir -p /usr/local/etc/nginx/vhosts

Приводим /usr/local/etc/nginx/nginx.conf к такому виду:

worker_processes 2;

events {
use kqueue;
worker_connections 2048;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 32M;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
reset_timedout_connection on;
server_tokens off;
gzip on;

# Закрываем обращения по IP адресу
server {
listen 80 default_server;
server_name _;
return 444;
}

# PHP-FPM
upstream php-fpm {
server unix:/tmp/php-fpm.sock;
}

# Инклюдим файлы с виртуальными хостами
include /usr/local/etc/nginx/vhosts/*;
}

Делаем виртуальный хост в nginx для Vexim

deathstar# ee /usr/local/etc/nginx/vhosts/exim.deathstar.name

server
{
listen 80;
server_name exim.deathstar.name;
access_log /var/log/nginx/exim-access.log;
error_log /var/log/nginx/exim-error.log;
root /usr/local/www/vexim;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Редактируем конфиг Vexim
deathstar# ee /usr/local/www/vexim/config/variables.php";
и вводим данные для подключения к базе данных введенные ранее.
Создаем группу и пользователя exim:
deathstar# pw groupadd vexim -g 90
deathstar# pw useradd vexim -u 90 -g vexim -d /usr/local/mail -m -s /nonexistant

Устанавливаем Exim ( отмечаем опцию SA-EXIM для работы SpamAssasin) :
deathstar# cd /usr/ports/mail/exim && make install clean
Добавляем в /etc/rc.conf:
exim_enable="YES"

Копируем и правим конфиги
deathstar# cd /usr/local/etc/exim/
deathstar# cp /usr/local/share/doc/vexim/docs/*.conf ./
deathstar# cp /usr/local/share/doc/vexim/docs/configure ./
deathstar# ee /usr/local/etc/exim/configure

Находим строку:
MY_IP = CHANGEописываем свой ip
MY_IP = 46.38.63.5/code>
Находим:
trusted_users = avleen:www
и удаляем avleen .Остается:

trusted_users = www
exim_user = mailnull
exim_group = mail
never_users = root

Находим закоментированную строку, отвечающую за подключение к MySQL серверу,раскоментируем ее и поставим там свой пароль:
hide mysql_servers = localhost::(/tmp/mysql.sock)/vexim/vexim/vexim
Раскоментируем:
AINS = SELECT DISTINCT domain FROM domains WHERE type = 'relay' AND domain = '${quote_mysql:$domain}'
ALIAS_DOMAINS = SELECT DISTINCT alias FROM domainalias WHERE alias = '${quote_mysql:$domain}'timeout_frozen_after = 2d
log_selector = +subject

Изменяем путь к антивируму ClamAV:
Находим:
av_scanner = clamd:/var/run/clamav/clamd и меняем на av_scanner = clamd:/var/run/clamav/clamd.sock

Добавляем в /etc/rc.conf
spamd_enable="YES" и запускаем
exim# /usr/local/etc/rc.d/sa-spamd start

Ставим ClamAV:
deathstar# cd /usr/ports/security/clamav && make install clean
Добавляем в /etc/rc.conf:
clamav_freshclam_enable="YES"
clamav_clamd_enable="YES"

и запускаем
deathstar# /usr/local/etc/rc.d/clamav-clamd start
Запускаем обновление баз ClamAV
deathstar# /usr/local/etc/rc.d/clamav-freshclam start

Добавялем в /etc/rc.conf
exim_enable="YES"

Устанавливаем Dovecot:
deathstar# cd /usr/ports/mail/dovecot && make install clean
Настройки хранятся в файле /usr/local/etc/dovecot.conf
Приводим конфиг к такому виду

base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
protocol imap {
listen=*:143
}
protocol pop3 {
listen=*:110
}
disable_plaintext_auth = no
log_path =/var/log/dovecot
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl = no
ssl_parameters_regenerate = 0
mail_location = maildir:~/Maildir
mail_privileged_group = mail
mail_debug = yes
mail_log_prefix = "%Us(%u): "
dotlock_use_excl = yes
verbose_proctitle = yes
first_valid_uid = 90
first_valid_gid = 90
maildir_copy_with_hardlinks = yes
protocol imap {
mail_executable = /usr/local/libexec/dovecot/imap
imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
}

protocol pop3 {
mail_executable = /usr/local/libexec/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@example.com
sendmail_path = /usr/sbin/sendmail
}
auth_username_format = %Lu
auth_verbose = yes
auth_debug = yes
auth default {
ssl_require_client_cert=no
ssl_username_from_cert=no
mechanisms = plain login
passdb pam {
args = session=yes dovecot
}
passdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
userdb passwd {
args = blocking=yes
}
userdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}
dict {
}
plugin {
}

Настраиваем подключение к MySQL в файле dovecot-sql.conf

deathstar# ee /usr/local/etc/dovecot-sql.conf

driver = mysql
connect = host=/tmp/mysql.sock user=vexim password=PASSWORD dbname=vexim
default_pass_scheme = MD5-CRYPT
password_query = SELECT crypt as `password` FROM users,domains WHERE users.username = '%u' AND users.enabled = '1' AND users.type = 'local' and domains.enabled = '1' and domains.domain_id = users.domain_id
user_query = SELECT pop as home, uid, gid FROM users WHERE username = '%u'

Добавляем запись в /etc/rc.conf:
dovecot_enable="YES"
Запускаем Dovecot:

deathstar# /usr/local/etc/rc.d/dovecot start

Ставим RoundCube (выбираем MySQL):

#deathstar cd /usr/ports/mail/roundcube/
deathstar# make install clean

И далее команды по порядку:

deathstar#cd /usr/local/www/roundcube
deathstar# chmod 777 logs/
deathstar# chmod 777 temp/

Создаем базу

deathstar# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

</code>
<code>deathstar# cd /usr/local/www/roundcube/
deathstar# mysql -p roundcubemail < SQL/mysql.initial.sql

deathstar# cp config/db.inc.php.dist config/db.inc.php
deathstar# ee config/db.inc.php

Правим конфигурационный файл /usr/local/www/roundcube/config/db.inc.php,
отвечающий за соединение с базой данных:
$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';

Правим файл main.inc.php, содержащий основные настройки:
deathstar# ee config/main.inc.php

$rcmail_config['default_host'] = 'localhost'; #хост, на котором находится почта
$rcmail_config['username_domain'] = ' mydomain.ru'; #домен, который будет автоматически добавляться к имени пользователя
$rcmail_config['mail_domain'] = 'mydomain.ru'; #почтовый домен
$rcmail_config['default_port'] = 143; #порт imap
$rcmail_config['imap_auth_type'] = null; #тип авторизации imap
$rcmail_config['smtp_server'] = 'localhost'; #сервер smtp
$rcmail_config['smtp_user'] = '%u';
$rcmail_config['smtp_pass'] = '%p';
$rcmail_config['smtp_auth_type'] = 'CRAM-MD5'; #тип авторизации smtp
$rcmail_config['create_default_folders'] = TRUE; #при первом логине юзера создаются дефолтные почтовые папки (Входящие, Исходящие, Корзина и тд.)
$rcmail_config['language'] = ru_RU; #локализация

И добавляем виртуальный хост в nginx для Roundcube

deathstar# ee /usr/local/etc/nginx/vhosts/mail.deathstar.name

server
{
listen 80;
server_name mail.deathstar.name;
access_log /var/log/nginx/mail-access.log;
error_log /var/log/nginx/mail-error.log;
root /usr/local/www/roundcube;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Перезапускаем PHP-FPM и NGINX

deathstar# /usr/local/etc/rc.d/nginx restart && usr/local/etc/rc.d/php-fpm restart

Теперь Roundcube доступен по адресу http://mail.deathstar.name а Vexim по http://exim.deathstar.name

Заходим по адресу http://exim.deathstar.name
Логинимся под siteadmin и пароль, что выставляли ранее
Жмем Add local domain
Прописываем домен, имя администратора ( по умолчанию postmaster, можно сменить на любое , так же создастся ящик вида postmaster@domain, а создадим например admin )
прописываем пароль ( например pass )
повторяем пароль
отмечаем антиспам и антивирус ( по желанию ) и жмем Submit

У нас появился почтовый аккаунт admin@domain с паролем pass

Чтоб для созданного домена создать еще ящик, логинимся под логином админа домена, в нашем случае – admin

Жмем Add, delete and manage POP/IMAP accounts
Потом Add User
Прописываем имя ( любое, оно просто для отображения в списке юзеров )
логин ( например user )
два раза пароль ( например userpass )
Has domain admin privileges? – отмечаем, есди хотим сделать юзера тоже админом домена
И жмем Submit.
У нас появился почтовый аккаунт user@domain с паролем userpass

Теперь можно зайти в roundcube по ссылке http://mail.deathstar.name под логином user@domain и паролем userpass

Существующий пакетный менеджер в FreeBSD ветки 9 и ниже был предложен Джорданом Хаббардом (Jordan Hubbard) еще в далеком 1994 году. С тех пор многое изменилось, поэтому разработчики FreeBSD, начиная с ветки 10, заменили устаревший пакетный менеджер на новый – PKGNG (package new generation). Для установки бинарных пакетов теперь предлагается использовать удаленные репозитории, например – pkg.FreeBSD.org. Из базовой системы были удалены утилиты pkg_* (такие, как: pkg_install, pkg_add, pkg_create, pkg_delete, pkg_info, pkg_updating и pkg_version).

Теперь при обновлении какого-либо порта вы можете видеть вот такое предупреждающее сообщение:

/! WARNING /!
pkg_install EOL is scheduled for 2014-09-01. Please consider migrating to pkgng
http://blogs.freebsdish.org/portmgr/2014/02/03/time-to-bid-farewell-to-the-old-pkg_-tools/
If you do not want to see this message again set NO_WARNING_PKG_INSTALL_EOL=yes in your make.conf

В котором вам предлагается до сентября 2014 года перейти на новый пакетный менеджер, т.к. поддержка старого прекратится.

Переход на новый пакетный менеджер PKGNG в операционных системах FreeBSD версии 9 и ниже осуществляется следующим образом (все нижеперечисленные процедуры осуществлялись на FreeBSD 9.0-RELEASE). Сперва установим сам порт PKG:

# make -C /usr/ports/ports-mgmt/pkg install clean

По окончанию установки вы можете видеть следующее сообщение:

If you are upgrading from the old package format, first run:
  # pkg2ng

Но перед началом его использования укажите опцию WITH_PKGNG=YES в своем make.conf:

# echo 'WITH_PKGNG=YES' >> /etc/make.conf

Теперь дадим команду pkg2ng, которая осуществить конвертацию существующей базы установленных портов в новую, для использования с pkgng:

# pkg2ng
Converting packages from /var/db/pkg
...
Converting nmap-6.40_2...
Installing nmap-6.40_2... done
...

Принудительно обновите базу данных установленных портов:

# pkgdb -fu
--->  Updating the pkgdb
[Reading data from pkg(8) ... - 46 packages found - done]

В принципе – переход на использование нового пакетного менеджера завершен. Для обновления установленных портов я использую portupgrade. Теперь при ее запуске можно видеть, что используется pkg:

# portupgrade -van
--->  Session started at: Mon, 24 Mar 2014 10:05:07 +0400
[Reading data from pkg(8) ... - 46 packages found - done]
** None has been installed or upgraded.
--->  Session ended at: Mon, 24 Mar 2014 10:05:24 +0400 (consumed 00:00:16)

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

# pkg update -f
Updating repository catalogue
No valid repository found.

Чтобы явно указать расположение репозитария необходимо выполнить следующее.

Удалить существующий конфигурационный файл для pkg и скопировать его из того, что дан по-умолчанию:

# rm -f /usr/local/etc/pkg.conf
# cp /usr/local/etc/pkg.conf.sample /usr/local/etc/pkg.conf

Создать каталог /usr/local/etc/pkg/repos и разместить в нем конфигурационный файл FreeBSD.conf с указанием расположения удаленного репозитария (обратите внимание на кавычки, они должны быть прямыми "):

 # mkdir -p /usr/local/etc/pkg/repos
 # nano -w /usr/local/etc/pkg/repos/FreeBSD.conf
 FreeBSD: {
 url: “pkg+http://pkg.FreeBSD.org/${ABI}/latest”,
 mirror_type: “srv”,
 enabled: yes
 }

Теперь выполнение обновления базы pkg:

# pkg update -f
Updating repository catalogue
digests.txz                                              100% 1097KB   1.1MB/s   1.1MB/s   00:00
packagesite.txz                                          100% 5087KB   5.0MB/s   5.0MB/s   00:00
Incremental update completed, 23432 packages processed:
0 packages updated, 0 removed and 23432 added.

Использование pkg хорошо документировано. Полный список команд вы получите дав просто pkg:

# pkg
...
Commands supported:
        add            Registers a package and installs it on the system
        annotate       Add, modify or delete tag-value style annotations on packages
...

Получить помощь по отдельно взятой команде можно так:

# pkg help update

На момент написания статьи версия pkgng:

# pkg -v
1.2.7

Однако, вам теперь необходимо изучить применение новых опций, указываемых в вашем make.conf или при сборке портов. Конструкция типа WITH_NAME, WITHOUT_NAME канула в лету. Теперь вместо, например, WITHOUT_X11=YES необходимо указывать WITHOUT=“X11” и т.д. Более подробно тут: http://wiki.freebsd.org/Ports/Options/OptionsNG.

Некоторые полезные команды из нового менеджера пакетов:

# pkg audit -F
# pkg update -f
# pkg check -Bd
# pkg info | grep nmap
nmap-6.40_2                    Port scanning utility for large networks
Перед обновлением можно проверить базу данных портов на ошибки:
# pkgdb  -Fa
и на потерянные зависимости:
# pkgdb  -L
Исправить базу данных портов (автоматически, без дополнительных ответов на вопросы системы) можно использовав ключ -fu:
# pkgdb  -fu