The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама (postfix postgresql imap virus mail imap)


<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: postfix, postgresql, imap, virus, mail, imap,  (найти похожие документы)
From: Владимир В. Агапов AKA -=Onix=- <onix@deepnet.ru.> Date: Mon, 24 May 2005 14:31:37 +0000 (UTC) Subject: Почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама Оригинал: http://www.deepnet.ru/docs/postfix-pgsql.shtml Безопасная почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама на FreeBSD 5.3 Введение. На данный момент в сети и бумажных изданиях все больше и больше появляется информации о установке почтовых систем на основе postfix. Вариантов достаточно много, начиная от обычной установки и заканчивая информацией о сборке системы достаточной для крупных почтовых шлюзов. Есть варианты позволяющие хранить всю информацию о пользователях в БД: MySQL или PostgreSQL, варианты с SMTP авторизацией пользователя, варианты использования для защиты соединения TLS, и прочее. Если поискать, в сети можно найти подобное how-to на основе MySQL, но нигде пока не удалось найти информацию по установке подобной связки на базе PgSQL. С целью восполнить данный пробел и была написана эта статья. Необходимые пакеты * PostgreSQL * Postfix * Cyrus-SASL2 * sudo * ClamAV * ClamSMTP * SpamAssassin * courier-imap * squirrelmail Приступаем к установке PostgreSQL (http://www.postgresql.org/) Общая информация PostgreSQL - объектно-реляционная СУБД базирующаяся на POSTGRES, разработанная в департаменте Беркли, Калифорнийского Университета. В POSTGRES они первыми внедрили много концепций, которые стали доступными в некоторых коммерческих базах данный намного позже. PostgreSQL - открытый потомок оригинального кода Беркли. Поддерживает стандарты SQL92, SQL99 и предлагает несколько новых возможностей: комплексные запросы, внешние ключи, триггеры, представления, транзакции и прочее. Для более подробной информации, рекомендую посетить официальный сайт. Установка и конфигурирование Собираем PgSQL из портов # cd /usr/ports/databases/postgresql80-server/ # make install clean После благополучной установки инициализируем служебную директорию PgSQL # /usr/local/etc/rc.d/010.pgsql.sh initdb Запускаем PgSQL # /usr/local/etc/rc.d/010.pgsql.sh start И проверяем что PgSQL работает нормально, выполнив простой SQL запрос: # sudo -u pgsql psql template1 Welcome to psql 8.0.1, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit template1=# select * from pg_language; lanname | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl ----------+---------+--------------+---------------+--------------+------------ internal | f | f | 0 | 2246 | c | f | f | 0 | 2247 | sql | f | t | 0 | 2248 | {=U/pgsql} (3 rows) template1=#\q Создаем пользователя базы данных postfix и задаем пароль для доступа к базе # sudo -u pgsql createuser --no-adduser --no-createdb postfix # echo "alter user postfix with password 'password';" | sudo -u pgsql psql template1 Создаем саму почтовую базу данных sudo -u pgsql createdb mail Создаем таблицы для почты и даем пользователю postfix права на выборку данных из базы # sudo -u pgsql psql mail CREATE TABLE users ( login text not null primary key, password text not null, maildir text not null, expired int not null default '0', comment text ); CREATE TABLE aliases ( alias text not null primary key, rcpt text not null, comment text ); CREATE TABLE transport ( domain text not null primary key, transport text not null, comment text ); grant select on users to postfix; grant select on aliases to postfix; grant select on transport to postfix; Сделаем несколько записей INSERT INTO transport VALUES ('domain.ru', 'virtual:', 'VIRTUAL TRANSPORT'); INSERT INTO users VALUES ('you@domain.ru', 'Pasw0Rd', 'domain.ru/you/', '0', 'General mail'); INSERT INTO aliases VALUES('root@domain.ru', 'you@domain.ru'); INSERT INTO aliases VALUES('MAILER-DAEMON@domain.ru', 'postmaster@domain.ru'); INSERT INTO aliases VALUES('postmaster@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('daemon@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('system@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('uucp@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('abuse@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('security@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('ftp@domain.ru', 'root@domain.ru'); INSERT INTO aliases VALUES('ftp-bugs@domain.ru', 'ftp@domain.ru'); Этим мы объявляем domain.ru виртуальным, создаем пользователя you@domain.ru и описываем служебные алиасы (см /etc/mail/aliases) с перенаправлением всей почты на you@domain.ru. Важно не забывать финальный слеш при вставке значения в поле maildir таблицы users, в противном случае postfix будет производить доставку почты не в maildir, а mailbox. Если есть желание усилить безопасность, то правим файл /usr/local/pgsql/data/pg_hba.conf и меняем значения trust на md5 local all all md5 host all all 127.0.0.1/32 md5 Этим мы меняем тип авторизации с доверенной (вход без пароля) на md5 (вход с паролем используя md5 шифрование). Перезапускаем postfix и проверяем # sudo -u postfix psql mail Password: Welcome to psql 8.0.1, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit mail=> \d List of relations Schema | Name | Type | Owner --------+-----------+-------+------- public | aliases | table | pgsql public | transport | table | pgsql public | users | table | pgsql (3 rows) mail=> SELECT * FROM aliases; ... mail=> SELECT * FROM transport; ... mail=> SELECT * FROM users; ... mail=> \q На этом с минимально необходимой настройкой PgSQL мы закончили. Cyrus-SASL2 (http://asg.web.cmu.edu/sasl/) Общая информация SASL (Simple Authentication and Security Layer) определяет общий метод добавления поддержки аутентификации к протоколам, ориентированным на соединение (POP3, IMAP4, SMTP, FTP, telnet, ACAP, LDAPv3). Для этого протокол включает в себя команды для идентификации и подтверждения подлинности пользователя и для опционального договора выбора метода защиты последующих взаимодействий. Установка и конфигурирование Собираем SASL2 из портов # cd /usr/ports/security/cyrus-sasl2 # vi Makefile Находим строку CONFIGURE_ARGS+=--with-pgsql=${LOCALBASE} И меняем ее на CONFIGURE_ARGS+=--with-pgsql=/usr/local/lib/postgresql Если не планируем использовать saslauthd, то можно закомментировать строку --with-saslauthd=${SASLAUTHD_RUNPATH} Собираем и устанавливаем # make WITH_PGSQL=yes install clean Создаем файл /usr/local/lib/sasl2/smtpd.conf следующего содержания: pwcheck_method: auxprop auxprop_plugin: sql sql_engine: pgsql sql_user: postfix sql_passwd: password sql_hostnames: 127.0.0.1 sql_database: mail sql_select: select password from users where login='%u@%r' sql_verbose: yes После окончания тестирования рекомендую изменить sql_verbose: yes на sql_verbose: no На этом с Cyrus-SASL2 мы закончили. Postfix (http://www.postfix.org/) Общая информация Что такое postfix? Postfix - это полноценная почтовая система, предназначенная для замены sendmail-а. В отличии от него, представляющего из себя единую программу, postfix является набором нескольких небольших программ, каждая из которых выполняет только свою задачу. В этом postfix ближе к QMail, но в отличие от последнего, postfix не занимается постоянным порождением/убиванием процессов, а держит в памяти несколько основных резидентов, что позволяет экономить ресурсы системы, расходуемые на порождение процессов. Для более детального знакомства со структурой и принципами работы postfix, рекомендую посетить официальный сайт разработчиков программы. Установка и конфигурирование Итак, приступаем к сборке самого виновника торжества. Скачиваем дистрибутив Postfix (на данный момент это postfix-2.2.1) Распаковываем его Создаем пользователя в системе postfix группу postdrop Правим /etc/rc.conf для отключения автоматического старта sendmail (sendmail_enable="NO") Переходим в директорию с распакованным postfix-ом и собираем его с поддержкой TLS, SASL и PgSQL # gmake tidy # gmake makefiles CCARGS="-DUSE_TLS -I/usr/local/include \ -DUSE_SASL_AUTH -I/usr/local/include/sasl \ -DHAS_PGSQL -I/usr/local/include" \ AUXLIBS="-L/usr/local/lib \ -lssl -lcrypto -L/usr/local/lib \ -lsasl2 -L/usr/local/lib/postgresql -lpq" # gmake # gmake install В процессе установки можно принимать значения по умолчанию, в этом случае конфигурационные файлы будут установлены в директорию /etc/postfix. Если Вы впервые устанавливаете postfix, то возможно следует указать куда ставить файлы readme и html - по умолчанию они не устанавливаются. Для автоматического старта postfix-a при старте системы создадим скрипт /usr/local/etc/rc.d/postfix.sh следующего содержания: #!/bin/sh case "$1" in start) echo "Starting POSTFIX..." /usr/sbin/postfix start ;; stop) echo "Stopping POSTFIX..." /usr/sbin/postfix stop ;; restart) echo "Restarting POSTFIX..." /usr/sbin/postfix stop sleep 1; /usr/sbin/postfix start ;; reload) echo "Restarting POSTFIX..." /usr/sbin/postfix reload ;; *) echo "usage [start] [stop] [restart] [reload]" ;; esac exit 0 Следующим шагом требуется объяснить postfix каким образом он будет общаться с БД. Создаем папку /etc/postfix/sql В ней создаем файлы следующего содержания: aliases.pgsql user = postfix password = password dbname = mail table = aliases select_field = rcpt where_field = alias hosts = localhost gids.pgsql user = postfix password = password dbname = mail table = users select_field = 6 where_field = login additional_conditions = and expired = '0' hosts = localhost transport.pgsql user = postfix password = password dbname = mail table = transport select_field = transport where_field = domain hosts = localhost uids.pgsql user = postfix password = password dbname = mail table = users select_field = <postfix UID> where_field = login additional_conditions = and expired = '0' hosts = localhost users.pgsql user = postfix password = password dbname = mail table = users select_field = maildir where_field = login additional_conditions = and expired = '0' hosts = localhost Создаем директорию где postfix будет хранить maildir-ы виртуальных пользователей: # mkdir /var/mail/virtual # chown postfix:mail /var/mail/virtual # chmod 775 /var/mail/virtual Произведем минимальную настройку postfix в файле /etc/postfix/main.cf, а именно как минимум установим значения следующих переменных mail_owner = postfix default_privs = nobody myhostname = domain.ru mydomain = domain.ru myorigin = $mydomain mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks_style = host mynetworks = 127.0.0.0/8 relay_domains = $mydestination Добавим следующие строки в конец файла smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_non_fqdn_recipient, reject_rbl_client list.dsbl.org, reject_rbl_client relays.ordb.org, reject_rbl_client dynablock.wirehub.net, reject_rbl_client blackholes.wirehub.net, reject_rbl_client dnsbl.njabl.org, reject_rbl_client dialups.mail-abuse.org, reject_rbl_client dul.ru transport_maps = pgsql:/etc/postfix/sql/transport.pgsql virtual_mailbox_base = /var/mail/virtual virtual_mailbox_maps = pgsql:/etc/postfix/sql/users.pgsql virtual_alias_maps = pgsql:/etc/postfix/sql/aliases.pgsql virtual_uid_maps = pgsql:/etc/postfix/sql/uids.pgsql virtual_gid_maps = pgsql:/etc/postfix/sql/gids.pgsql relay_domains = $transport_maps local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps smtpd_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_local_domain = За объяснением значений используемых здесь параметров рекомендую посмотреть документацию на официальном сайте. Тестирование Теперь попробуем с этим всем взлететь. # postfix check Если команда выполнилась без каких либо сообщений - значит все нормально и можно делать # postfix start Смотрим /var/log/maillog на предмет каких либо ошибок. Если все прошло нормально, пробуем отправить себе почту, telnet или mail - кому как удобней. После отправки снова смотрим в логи, должна быть примерно такая запись postfix/virtual[65791]: 33AD467846: to=<user2@domain.ru.>, orig_to=<test@domain.ru.>, relay=virtual, delay=0, status=sent (delivered to maildir) Ключевыми словами здесь являются <<status=sent (delivered to maildir)>>, что обозначает успешную доставку почты postfix-ом отправленного письма в maildir пользователя. Пробуем отправить почту куда-нибудь в мир с другой машины, не включая в настройках почтовой программы SMTP авторизацию. postfix/smtpd[14512]: NOQUEUE: reject: RCPT from new.domain.ru[x.x.x.x]: 554 <user@other.ru.>: Relay access denied; from=<test@domain.ru.> to=<user@other.ru.> proto=ESMTP helo=<user.new.domain.ru> Если появилась запись подобно приведенной выше - значит все нормально, наш postfix не собирается выступать в роли open relay и позволять пересылать через себя почту для других доменов. Осталось проверить что SASL авторизация у нас работает нормально, и авторизованному пользователю позволено писать куда угодно. Для этого включаем в настройках почтовой программы SMTP авторизацию и пробуем отправить это же письмо еще раз. postfix/smtpd[69747]: 7F83667845: client=user.new.domain.ru[x.x.x.x], sasl_method=CRAM-MD5, sasl_username=you@domain.ru ... postfix/smtp[69758]: 7F83667845: to=<user@other.ru.>, relay=otherrelay[x.x.x.x], delay=2, status=sent (250 Ok: queued as 25657164825) Если присутствуют строки типа <<sasl_method=<метод>, sasl_username=you@domain.ru>>, значит все нормально и postfix+sasl функционируют нормально. Шифруем дальше На этом можно было бы и остановиться, если бы не одно <<но>>: при стандартной SMTP авторизации, пароль пользователя передается в открытом виде или в слабо защищенном, и при наличии злоумышленника в одном с вами сегменте сети (да и не только), может быть перехвачен и расшифрован. И хотя этот пароль не имеет никакого отношения к паролю пользователя в системе (если таковой там присутствует), кому понравится, что кто-то имеет возможность читать его почту? Что бы избежать этого неприятного факта, воспользуемся дополнительными средствами, которые может предоставить нам postfix, а именно - TLS (Transport Layer Security protocol) TLS Общая информация Данный вопрос достаточно подробно раскрыт в статье Семёнова Ю.А. (ГНЦ ИТЭФ), http://citforum.ru/nets/semenov/6/tls.shtml Настройка Для начала нам необходимо создать свой собственный сертификат сервера. Для этого воспользуемся несколько модифицированным скриптом из поставки Cyrus-IMAP # vi /etc/ssl/mkcert.sh #!/bin/sh test -x /usr/bin/openssl || exit 0 prefix="/" if test -f /etc/ssl/server.pem then echo "/etc/ssl/server.pem already exists." exit 1 fi cp /dev/null /etc/ssl/server.pem chmod 600 /etc/ssl/server.pem chown root /etc/ssl/server.pem cleanup() { rm -f /etc/ssl/server.pem rm -f /etc/ssl/server.rand exit 1 } dd if=/dev/urandom of=/etc/ssl/server.rand count=1 2>/dev/null /usr/bin/openssl req -new -x509 -days 3650 -nodes -config /etc/ssl/openssl.cnf \ -out /etc/ssl/server.pem -keyout /etc/ssl/server.pem /usr/bin/openssl gendh -rand /etc/ssl/server.rand 512 \ >>/etc/ssl/server.pem || cleanup /usr/bin/openssl x509 -subject -dates -fingerprint \ -noout -in /etc/ssl/server.pem || cleanup rm -f /etc/ssl/server.rand При помощи этого скрипта, мы создаем в директории /etc/ssl самоподписанный сертификат нашего сервера - server.pem. В процессе создания будет необходимо указать некоторые значения, названия достаточно понятные и я думаю проблем не должно возникнуть. Главное в поле Common Name (eg, YOUR name) [mail.domain.ru]: указать FQDN вашего почтового сервера, в данном примере: mail.domain.ru. Если имя сервера для отправки/приема почты в настройках почтовой программы не совпадает с указанным в сертификате - почтовая программа будет <<ругаться>>. Теперь редактируем файл /etc/postfix/main.cf, а именно - добавляем следующие строки: smtp_use_tls = yes smtp_tls_key_file = /etc/ssl/server.pem smtp_tls_cert_file = $smtp_tls_key_file smtp_tls_CAfile = $smtp_tls_key_file smtp_tls_note_starttls_offer = yes smtp_tls_loglevel = 0 smtpd_tls_auth_only = yes smtpd_use_tls = yes smtpd_tls_loglevel = 0 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom smtpd_tls_key_file = /etc/ssl/server.pem smtpd_tls_cert_file = $smtpd_tls_key_file smtpd_tls_CAfile = $smtpd_tls_key_file Опция smtpd_tls_auth_only = yes позволяет производить SMTP авторизацию только в режиме TLS. Тестирование Для тестирования воспользуемся telnet-ом на 25 порт локальной машины. Жирным шрифтом выделен ввод с клавиатуры. # telnet localhost 25 Trying ::1... Trying 127.0.0.1... Connected to localhost.domain.ru. Escape character is '^]'. 220 new.domain.ru Mail Server ehlo domain.ru 250-onix.domain.ru 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-STARTTLS 250 8BITMIME starttls 220 Ready to start TLS quit quit Connection closed by foreign host. Обращаем внимание на появившуюся строку 250-STARTTLS, это обозначает, что сервер готов работать с использованием протокола TLS. Это так называемое <<безопасное соединение на стандартном порту>>. Если вы хотите использовать безопасное соединение на специальном порту, раскомментируйте строку smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes в файле /etc/postfix/master.cf и перезапустите postfix. Фильтрация входящей/исходящей почты На этом с первичной настройкой postfix-а мы закончили. Но хотелось бы ведь еще что бы почта проверялась на вирусы и спам. Для этого нам потребуется установить и настроить дополнительные пакеты, а именно clamav (бесплатный антивирус с возможностью обновления баз через Интернет), clamsmtp (SMTP фильтр для проверки на вирусы при помощи clamav) и SpamAssassin (программа предназначенная для проверки почтовых сообщений на спам). Начнем по порядку ClamAV (http://www.clamav.net/) Общая информация ClamAV - бесплатный антивирусный продукт, распространяемый под лицензией GPL. Его основное применение, по словам разработчиков - интеграция с почтовой системой (сканирование вложений). Однако его можно использовать и как обычный антивирусный сканер - в комплекте идет сканер файловой системы. Однако антивирус без своевременного обновления вирусных баз мало чем способен помочь. Невзирая на бесплатный статус, ClamAV имеет собственное средство обновления вирусных баз через Интернет. Из личного опыта работы с данный антивирусом, могу сказать что обновления выпускаются достаточно быстро, по скорости реакции во время появления нового вируса его превосходит разве что антивирус Касперского, но и то не намного. Этот небольшой минус на мой взгляд вполне компенсируется бесплатностью продукта и по этой причине на своих серверах и домашней машине я использую именно его. Еще один минус: он не умеет проверять архивированные вложения формата RAR v3. Это связано с расхождениями в политике лицензирования программных продуктов. На данный момент, насколько мне известно, ведутся переговоры для устранения этого разногласия. Установка и конфигурирование Установка вполне стандартная и не имеет никаких подводных камней. # cd /usr/ports/security/clamav # make install clean На вопрос нужен ли нам milter можно отвечать <<нет>>, поскольку для интеграции его с postfix-ом мы будем использовать другой механизм. CURL - по желанию, например я его не использую. После установки редактируем конфигурационные файлы /usr/local/etc/clamd.conf LogFile /var/log/clamav/clamd.log LogFileMaxSize 2M LogTime PidFile /var/run/clamav/clamd.pid TemporaryDirectory /tmp DatabaseDirectory /var/db/clamav LocalSocket /var/run/clamav/clamd FixStaleSocket MaxThreads 10 ReadTimeout 120 IdleTimeout 30 MaxDirectoryRecursion 15 FollowDirectorySymlinks SelfCheck 1800 User clamav AllowSupplementaryGroups ScanPE ScanOLE2 ScanMail ScanHTML ScanArchive ArchiveMaxFileSize 15M ArchiveMaxRecursion 10 ArchiveMaxFiles 1500 ArchiveMaxCompressionRatio 300 /usr/local/etc/freshclam.conf DatabaseDirectory /var/db/clamav UpdateLogFile /var/log/clamav/freshclam.log PidFile /var/run/clamav/freshclam.pid DatabaseOwner clamav AllowSupplementaryGroups DatabaseMirror database.clamav.net Checks 48 NotifyClamd Добавляем в /etc/rc.conf строки: clamav_clamd_enable="YES" clamav_freshclam_enable="YES" И запускаем: /usr/local/etc/rc.d/clamav-clamd.sh start /usr/local/etc/rc.d/clamav-freshclam.sh start Тестирование Для проверки работоспособности будем использовать EICAR строку. Создаем файл virus.com со следующим содержанием: X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* Сохраняем его и выполняем # clamscan virus.com virus.com: Eicar-Test-Signature FOUND ----------- SCAN SUMMARY ----------- Known viruses: 30736 Scanned directories: 0 Scanned files: 1 Infected files: 1 Data scanned: 0.00 MB I/O buffer size: 131072 bytes Time: 1.356 sec (0 m 1 s) Если вы видите что то подобное, значит все прошло успешно и ClamAV благополучно установлен на вашем компьютере. ClamSMTP (http://memberwebs.com/nielsen/software/clamsmtp/) Общая информация ClamSMTP - фильтр SMTP, который позволяет Вам проверять почтовые сообщения используя антивирус ClamAV. По словам разработчиков, <<ClamSMTP стремится быть небольшим, надежным и простым>>. В связи с этим он написан на С и имеет минимум конфигурационных опций. Так же по словам разработчиков, <<Если Вы нуждайтесь в большем количестве вариантов тогда, Вы можете использовать что-нибудь большое, как AMaViS, который написанный на PERL и может сделать почти все.>> Однако при построении системы, я отказался от использования AMaViS, поскольку для программы-посредника, на мой взгляд, он занимает слишком много памяти. Установка и конфигурирование Установка тоже стандартная и не вызывает каких либо вопросов. # cd /usr/ports/security/clamsmtp/ # make install clean # cp /usr/local/etc/clamsmtpd.conf-sample /usr/local/etc/clamsmtpd.conf # vi /usr/local/etc/clamsmtpd.conf OutAddress: 10026 XClient: off Listen: 127.0.0.1:10025 ClamAddress: /var/run/clamav/clamd Header: X-Virus-Scanned: -=Onix=- TempDirectory: /tmp Bounce: off Quarantine: off TransparentProxy: off User: clamav Добавляем в /etc/rc.conf строку clamsmtpd_enable="YES" И запускаем его /usr/local/etc/rc.d/clamsmtpd.sh start Для проверки можно сделать # sockstat -4 | grep clamsmtpd Должна присутствовать строка наподобие этой: clamav clamsmtpd 39991 3 tcp4 127.0.0.1:10025 *:* SpamAssassin (http://spamassassin.apache.org/) Общая информация SpamAssassin - почтовый фильтр, который использует различные эвристические анализаторы заголовков почты и в основном тексте для идентификации спама. Написан на PERL (исключение составляет модуль spamd). Использует комплексный подход к проверке писем на спам, начиная от заголовков SMTP сессии (к сожалению на данный момент не умеет получать эту информацию из самой сессии, использует для этого заголовки письма) и заканчивая фильтрацией тела письма. Из плюсов: большое количество проверок увеличивает шанс отлова спама, возможность самообучения, возможность вручную переопределять веса правил, эвристический анализатор текста письма. Из минусов: из-за большого количества проверок возможны ложные срабатывание, эвристические методы в режиме самообучения могут ошибочно посчитать SPAM нормальным письмом, после чего количество правильно распознаваемого спама сильно упадет, достаточно сильно нагружает систему. Установка и конфигурирование Данная тема выходит за пределы обсуждения этой статьи, в связи с большим количеством документации как на официальном сайте программы, так и в русскоязычной части Интернета и бумажных изданиях. Тестирование Проверяем его работоспособность. # echo "TEST" | spamc X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on localhost X-Spam-Level: X-Spam-Status: No, score=-1.2 required=7.5 tests=ALL_TRUSTED,MISSING_DATE, MISSING_SUBJECT autolearn=failed version=3.0.2 Если вы ведете, что то подобное - значит SpamAssassin настроен нормально и вполне боеспособен. Что бы узнать как он реагирует на спам - можете воспользоваться GTUBE тестом. Файл spam.eml можно взять здесь: http://www.deepnet.ru/files/mail/spam.eml Дополнительная информация Для дополнительной информации по SpamAssassin рекомендую: Официальный сайт: http://spamassassin.apache.org/ Проект OpenNet: http://www.opennet.ru/ Поисковые системы. Подключаем ClamSMTP к postfix Добавляем в файл /etc/postfix/main.cf строки content_filter = avscan:127.0.0.1:10025 receive_override_options = no_address_mappings Добавляем в файл /etc/postfix/master.cf строки avscan unix - - n - 10 smtp -o smtp_send_xforward_command=yes 127.0.0.1:10026 inet n - n - 10 smtpd -o content_filter=spamfilter -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8 Подключаем SpamAssassin к postfix Поскольку SpamAssassin сам не имеет SMTP модуля, нам придется ему в этом помочь. Напишем скрипт, который будет принимать письмо, передавать его для разбора SpamAssassin-у и потом возвращать письмо обратно в postfix. Создаем директорию /etc/postfix/scripts/ Создаем файл spam.pl #!/usr/bin/perl -w use strict; use Net::SMTP; my $host = &sall_ch(shift(@ARGV), '"'); my $ehlo = &sall_ch(shift(@ARGV), '"'); my $mail_from = &sall_ch(shift(@ARGV), '"'); my $rcpt_to = &sall_ch(shift(@ARGV), '"'); my $spamc = &sall_ch(shift(@ARGV), '"'); if (!defined($host)||!defined($ehlo)||!defined($mail_from)||!defined($rcpt_to)) { die("use $0 <host> <ehlo> <mail_from> <rcpt_to> [cmd]\n"); } if (defined($spamc)) { open(CF, "$spamc |") or undef($spamc); } my $smtp = Net::SMTP->new($host); $smtp->hello($ehlo); $smtp->mail($mail_from); $smtp->to($rcpt_to); $smtp->data(); if (defined($spamc)) { while(<CF>) { next if (/^delivered\-to\:/i); $smtp->datasend($_); } } else { while(<>) { next if (/^delivered\-to\:/i); $smtp->datasend($_); } } $smtp->dataend(); close(CF) if defined($spamc); $smtp->quit; exit 0; ############################################################ sub sall_ch($$) { my($string, $chars) = (shift(), shift()); return(undef) unless defined($string); $string =~ s/^[\Q$chars\E]+//; $string =~ s/[\Q$chars\E]+$//; return($string); } Добавляем в файл /etc/postfix/master.cf строки spamfilter unix - n n - 10 pipe flags=R user=filter argv=/etc/postfix/scripts/spam.pl "localhost:10027" "spamfilter"\ "${sender}" "${recipient}" "/usr/local/bin/spamc" localhost:10027 inet n - n - 10 smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o myhostname=localhost Установка pop3 и imap сервера Однако одной отправкой писем достаточно сложно обойтись в электронной почте - почту еще бы хотелось и принимать. Для этого воспользуемся пакетом Courier-IMAP Courier-IMAP (http://www.courier-mta.org/imap/) Общая информация Courier-IMAP - сервер, предоставляющий IMAP доступ к почтовым ящикам формата Maildir. IMAP сервер не позволяет работать с традиционными почтовыми ящиками формата mailbox. Courier-IMAP включает в себя некоторые расширения к стандартному формату хранения Maildir почты, для поддержания дополнительных возможностей, таких как IMAP папки и <<мягкие>> квоты. Так же он способен работать со стандартными папками Maildir, правда в этом случае дополнительные возможности не доступны. И главное, он позволяет работать с виртуальными пользователями, что будет весьма полезно при построении нашей системы. Помимо IMAP сервера, он включает в себя POP3 сервер, с возможностью работы через SSL. Установка и конфигурирование Если у вас новые порты, то демон идентификации Courier-IMAP вынесен в отдельный порт - courier-authlib. Для начала поставим его. # cd /usr/ports/mail/courier-authlib/ # make config Выбираем опции POSTGRESQL и MERGECFGS, со всех остальных выделение снимаем. # make install clean # cd /usr/local/etc/authlib/ # vi authdaemonrc authmodulelist="authpgsql" authmodulelistorig="authpgsql" daemons=5 authdaemonvar=/var/run/authdaemond DEBUG_LOGIN=0 DEFAULTOPTIONS="wbnodsn=1" # vi authpgsqlrc PGSQL_HOST localhost PGSQL_PORT 5432 PGSQL_USERNAME postfix PGSQL_PASSWORD password PGSQL_DATABASE mail PGSQL_USER_TABLE users PGSQL_CLEAR_PWFIELD password PGSQL_UID_FIELD <POSTFIX UID> PGSQL_GID_FIELD 6 PGSQL_LOGIN_FIELD login PGSQL_HOME_FIELD '/var/mail/virtual' PGSQL_MAILDIR_FIELD maildir PGSQL_WHERE_CLAUSE expired = '0' Добавляем строку courier_authdaemond_enable="YES" в /etc/rc.conf и запускаем /usr/local/etc/rc.d/courier-authdaemond.sh start С демоном аутентификации закончили, устанавливаем сам Courier-IMAP. # cd /usr/ports/mail/courier-imap/ # make config Выбираем пункт OPENSSL, со всех остальных снимаем выделение. # make install clean # cd /usr/local/etc/courier-imap/ В зависимости о того, будем ли мы использовать POP3/IMAP и POP3/IMAP over SSL редактируем соответствующие файлы. Для примера рассмотрим только настройку POP3 и POP3 over SSL серверов. # cp pop3d.dist pop3d # cp pop3d-ssl.dist pop3d-ssl # vi pop3d PIDFILE=/var/run/pop3d.pid MAXDAEMONS=10 MAXPERIP=2 AUTHMODULES="authdaemon" POP3AUTH="LOGIN PLAIN" POP3AUTH_ORIG="LOGIN PLAIN" POP3AUTH_TLS="LOGIN PLAIN" POP3AUTH_TLS_ORIG="LOGIN PLAIN" POP3_PROXY=0 PORT=110 ADDRESS=0 TCPDOPTS="-nodnslookup -noidentlookup" POP3DSTART=YES # vi pop3d-ssl prefix=/usr/local exec_prefix=/usr/local SSLPORT=995 SSLADDRESS=0 SSLPIDFILE=/var/run/pop3d-ssl.pid POP3DSSLSTART=YES POP3_STARTTLS=YES POP3_TLS_REQUIRED=0 COURIERTLS=/usr/local/bin/couriertls TLS_PROTOCOL=SSL3 TLS_STARTTLS_PROTOCOL=TLS1 TLS_CERTFILE=/etc/ssl/server.pem TLS_VERIFYPEER=NONE TLS_CACHEFILE=/usr/local/var/couriersslcache TLS_CACHESIZE=524288 MAILDIRPATH=Maildir IMAP настраивается по аналогии. Добавляем с /etc/rc.conf строки courier_imap_pop3d_enable="YES" courier_imap_pop3d_ssl_enable="YES" И запустим сервера # /usr/local/etc/rc.d/courier-imap-pop3d.sh start # /usr/local/etc/rc.d/courier-imap-pop3d-ssl.sh start Тестирование Проверим, что POP3 демон и авторизация у нас работают нормально. # telnet localhost 110 Trying ::1... Trying 127.0.0.1... Connected to localhost.domain.ru. Escape character is '^]'. +OK Hello there. user you@domain.ru +OK Password required. pass Pasw0Rd +OK logged in. list +OK POP3 clients that break here, they violate STD53. 13258 . quit +OK Bye-bye. Connection closed by foreign host. Заключение Если все прошло нормально, то на данный момент мы имеем минимально настроенную, но работоспособную защищенную почтовую систему. Однако многие тонкости настройки как postfix-а, так и глобальной безопасности остались за пределами данной статьи. Если вам интересна эта тема, то я всегда готов выслушать ваши вопросы, комментарии, предложения и замечания. Владимир В. Агапов AKA -=Onix=-

<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Crion (??), 13:23, 24/05/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что за бред кочует из статьи в статью
    sql_select: select password from users where login='%u@%r'
    не работает так так как %r передает полное имя хоста, а не доменное.
    Автор не весь конфиг привер main.cf неуказан параметр disable_vrfy_command = yes # Блокируем Проверку через "expn логин_пользователя" или "vrfy логин_пользователя"
    если это не укзавать то к выводу
    # telnet localhost 25
    ehlo domain.ru
    добавиться еще
    VRFY
     
  • 1.2, MiF (??), 15:44, 24/05/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Необходимые пакеты

         * PostgreSQL
         * Postfix
         * Cyrus-SASL2
         * sudo
         * ClamAV
         * ClamSMTP
         * SpamAssassin
         * courier-imap
         * squirrelmail

    А где про установку последнего пакета? :) squirrelmail

     
  • 1.3, GaraMelek (??), 00:54, 25/05/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Правим /etc/rc.conf для отключения >автоматического старта sendmail
    >   (sendmail_enable="NO")

    sendmail_enable="NONE"

     
     
  • 2.4, Dr. Nebula (?), 10:02, 25/05/2005 [^] [^^] [^^^] [ответить]  
  • +/
    grep sendmail /etc/defaults/rc.conf
    sendmail_enable="NO"    # Run the sendmail inbound daemon (YES/NO).
     

  • 1.5, Sargan Saor (?), 14:21, 25/05/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Все здорово, только использование squirrel не совсем удобно в случае использования imap , т.к при создании в Inbox папок содержащие кирилицу ( например из thunderbird или the bat) squirrel не корректно работает с кодировкой , что выливается в нечитабельность этих самых папок.

    Если у вас возникла такая проблема, то выхода два:
    1. править код сквирла.( не пробовал )
    2. Использовать, например, iloha mail.

     
     
  • 2.6, Onix (??), 10:08, 26/05/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >Все здорово, только использование squirrel не совсем удобно в случае использования imap
    >, т.к при создании в Inbox папок содержащие кирилицу ( например
    >из thunderbird или the bat) squirrel не корректно работает с кодировкой
    >, что выливается в нечитабельность этих самых папок.
    >
    >Если у вас возникла такая проблема, то выхода два:
    >1. править код сквирла.( не пробовал )
    >2. Использовать, например, iloha mail.

    А кто сказал что я разрешаю использовать пользователям imap? imap только на 127.0.0.1
    Для обсуждения статьи есть специальный топик - http://forum.deepnet.ru/viewtopic.php?t=5

     

  • 1.7, unk (ok), 08:57, 28/05/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps
    Это явная диверсия.
     
     
  • 2.8, Dr. Nebula (?), 16:14, 30/05/2005 [^] [^^] [^^^] [ответить]  
  • +/
    А расшифровать, для неграмотных? :)
     

  • 1.9, Grand piano (?), 20:18, 05/07/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Имо, проще так
    http://postfixwiki.org/index.php?title=Virtual_Users_and_Domains_with_Courier
    достаточно подробно со всеми описаниями и ссылками.
    останется только докрутить СпамАтсосин и Клам
     
     
  • 2.10, Dr. Nebula (?), 10:17, 06/07/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >Имо, проще так
    >http://postfixwiki.org/index.php?title=Virtual_Users_and_Domains_with_Courier
    >достаточно подробно со всеми описаниями и ссылками.
    >останется только докрутить СпамАтсосин и Клам

    Там опять таки MySQL, по этому поводу и здесь статей полно

     
     
  • 3.11, zavad (ok), 15:55, 14/07/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Есть возможность зашивровать эти пароли что бы они не лежали в открытом виде в файлах:

    /usr/local/lib/sasl2/smtpd.conf
            sql_passwd: password

    aliases.pgsql
            password = password
    gids.pgsql
            password = password
    transport.pgsql
            password = password
    uids.pgsql
            password = password
    users.pgsql
            password = password

     

  • 1.12, негор (?), 17:09, 04/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    дочитал до установки постфикса и забил. ну какой нормальный бсдист будет качать сырец, чото править в мейкфайле, пускать гмейк со 108-ю опциями.. что за маразм ? это называется мы строим нормальную почтовую систему ? всё это элементарно и красиво делается через portupgrade и pkgtools.conf без всяких бубнов и кучи мусора библиотек и бинарей, которые потом ручками вытирать в случае если постфикс не устроил по каким-то причинам.. благодаря таким статьям и рождается толпа криворуких имбециолов, которых хлебом не корми, дай по засирать систему.. креатиф гавно/афтар мудаг
     
  • 1.13, Dr. Nebula (?), 10:22, 05/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А по моему даже BSDишнику было бы полезно знать как и что можно делать ручками. Ручки знаете ли они надежней, если конечно растут оттуда, откуда надо.
     
  • 1.14, негор (?), 02:05, 13/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    смысл ковыряний ? вы настолько располагаете временем что во время конфигурирования софта (процесс конфигурирования и инсталляции которого кстати специально для вас и упростили мантейнеры портов) готовы заниматся копанием в сурсах и смотреть как чего там работает ? я думал что этим обычно занимаются уже потом, когда в один прекрасный момент вдруг обнаруживается отсутствие каких-то функций, которые не включил девелопер  в код и нужными лишь под твои конкретные задачи и которые имеет смысл заимплементить только в твоем случае тебе же самому. в конечном итоге о которых нет ничего ни в Makefile'е который лежит в дереве этого порта ни в самом порте... хотя опять же, в конечном счете что помешает тебе поправить мейкфайл из скелетона этого самого порта, в который ты вмешался хирургически, т.о. можно набраться нелишнего экспириенса.
     
  • 1.15, Mercury (??), 16:50, 26/10/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Самое интересное, то, что если в таблице виртуальных пользователей прописано на один адрес несколько получателей, то в итоге письмо приходит только одному!!! Где ковырять не знаю.... от perl я далек.
     
     
  • 2.16, Onix (??), 22:20, 26/10/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >Самое интересное, то, что если в таблице виртуальных пользователей прописано на один
    >адрес несколько получателей, то в итоге письмо приходит только одному!!! Где
    >ковырять не знаю.... от perl я далек.


    Ковырять надо в сторону aliases

     
  • 2.17, Дмитрий (??), 10:15, 01/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Я тоже столкнулся с этой траблой.
     
     
  • 3.18, zavad (ok), 07:40, 21/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Для нормальной работы скрипта который передает письма для маркировки ассасину в main.cf надо добавить (у меня терялась почта если отсылали её нескольким пользователя)
    spamfilter_destination_recipient_limit = 1

    Статья хорошая для тех кто первый раз устанавливает такую систему.

     
     
  • 4.19, YMSSSG (?), 16:54, 21/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >Для нормальной работы скрипта который передает письма для маркировки ассасину в main.cf
    >надо добавить (у меня терялась почта если отсылали её нескольким пользователя)
    >
    >spamfilter_destination_recipient_limit = 1
    >
    >Статья хорошая для тех кто первый раз устанавливает такую систему.

    Интересный вариант - но я победил эту траблу по-другому - вообще отказался от скрипта Spam.pl а вместо него установил  /usr/ports/mail/spampd и все заработало.
    В master.cf оставил только (не считая того что было после установки Postfix):
    avscan    unix  -       -       n       -       10      smtp    
      -o smtp_send_xforward_command=yes
    spamchk   unix  n       -       n       -       -       smtpd
      -o content_filter=smtp:127.0.0.1:10026
      -o myhostname=mail.e5.omsktele.com
    127.0.0.1:10027 inet    n       -       n       -       10   smtpd
      -o content_filter=
      -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
      -o smtpd_helo_restrictions=
      -o smtpd_client_restrictions=
      -o smtpd_sender_restrictions=
      -o smtpd_recipient_restrictions=permit_mynetworks,reject
      -o mynetworks_style=host
      -o smtpd_authorized_xforward_hosts=127.0.0.0/8

    Поправил /usr/local/etc/rc.d/spampd.sh
    а именно строку: /usr/local/sbin/spampd --user=uucp --group=uucp --host 127.0.0.1:10026 --relayhost=127.0.0.1:10027 --maxsize=500 --dose --tagall
    а скрипт запускающий spamassassin удалил

     

  • 1.20, Владимир (??), 13:00, 12/01/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Help me!
    При получении почты в заголовке "кому" пишет undisclosed-recipients.
    В чем дело? Где ковырять.
     
     
  • 2.21, YMSSSG (?), 10:01, 13/01/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >Help me!
    >При получении почты в заголовке "кому" пишет undisclosed-recipients.
    >В чем дело? Где ковырять.

    Сделай по примеру того как я написал в предидущим постом

     

  • 1.22, Владимир (??), 14:48, 13/01/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Все переделал... ни чего не вышло, все так же и пишет :(
     
  • 1.23, Adil_18 (?), 15:53, 03/02/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    host 127.0.0.1[127.0.0.1] said: 530 Must issue a STARTTLS
        command first (in reply to MAIL FROM command)


    clamsmtp+postfix
    ????????????????????????

     
  • 1.24, Adil_18 (?), 00:06, 07/02/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    tak na moy vopros nikto i ne otvetit?
    host 127.0.0.1[127.0.0.1] said: 530 Must issue a STARTTLS
        command first (in reply to MAIL FROM command)
    po4emu tak?
     
     
  • 2.25, Dr. Nebula (?), 00:23, 07/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >tak na moy vopros nikto i ne otvetit?
    >host 127.0.0.1[127.0.0.1] said: 530 Must issue a STARTTLS
    >    command first (in reply to MAIL FROM command)
    >
    >po4emu tak?

    По моему за нас отвечает postfix :)
    Посмотрите, куда вы подключили обязательную авторизацию по SSL

     
     
  • 3.26, Adil_18 (?), 10:13, 07/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    davay vot tak, avtorizaciyu po ssl ya ne vklyu4al, ya prosto sdelal local smtp server v klientami v postgrese s tls support, a teper xo4u prikrutit clamsmtp
    esli otklyu4at tls, to clamsmtp rabotaet, esli ne otklyu4at tls, to vse......
    host 127.0.0.1[127.0.0.1] said: 530 Must issue a STARTTLS
    >    command first (in reply to MAIL FROM command)

    dayu confi:
    main.conf:
    smtp_use_tls = yes
    smtpd_use_tls = yes
    smtp_tls_note_starttls_offer = yes
    smtpd_tls_key_file = /usr/local/etc/postfix/ssl/smtpd.pem
    smtpd_tls_cert_file = /usr/local/etc/postfix/ssl/smtpd.pem
    smtpd_tls_CAfile = /usr/local/etc/postfix/ssl/smtpd.pem
    smtpd_tls_loglevel = 1
    smtpd_tls_received_header = yes
    smtpd_tls_session_cache_timeout = 3600s
    smtpd_enforce_tls = yes
    smtpd_tls_auth_only = yes
    tls_random_source = dev:/dev/urandom

    content_filter = scan:127.0.0.1:10025
    receive_override_options = no_address_mappings

    v master.cf:#
    scan unix - - n - 16 smtp

    127.0.0.1:10026 inet n - n - 16 smtp
    -o content_filter=
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks_style=host
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8
    -o smtp_use_tls=yes
    -o smtpd_use_tls=yes
    -o smtp_tls_note_starttls_offer=yes
    -o smtpd_tls_key_file=/usr/local/etc/postfix/ssl/smtpd.pem
    -o smtpd_tls_cert_file=/usr/local/etc/postfix/ssl/smtpd.pem
    -o smtpd_tls_cert_file=/usr/local/etc/postfix/ssl/smtpd.pem
    -o smtpd_tls_received_header=yes
    -o smtpd_tls_session_cache_timeout=3600s
    -o tls_random_source=/dev/urandom

     
     
  • 4.27, stend (?), 05:07, 21/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    Статья хорошая Только граблей в ней много и неточностей Если кто то будет соби... большой текст свёрнут, показать
     

  • 1.28, Павел (??), 13:31, 27/02/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вопрос если я меня ввожу новое значение например для динамических адресов которые было 3... а я ставлю 10
    и перезапускаю амавист этого достаточно ????
    З.Ы.
    после перезапуска в заголовке в поле проверки стоит тоже значение((((((
     
  • 1.29, ADil_18 (?), 00:44, 08/08/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Good
    Tolko est bolee xoroshiy sposob svyazat spamassasin i postfix bez vsyakix rakami napisannix dopolnitelnix scriptov!!!!!!!
     
  • 1.30, Oleg (??), 10:40, 09/12/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Супер, развернул на linux практечиски без допиливания
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру