# создание самоподписанного сертификата в одну строку
openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem -subj "/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=case.net.ru/emailAddress=case@case.net.ru"
–
# создание ключа сервера
openssl genrsa -des3 -rand /dev/urandom -out server.key
# убирание из него пароля
openssl rsa -in server.key -out server.pem
# создание запроса на подпись сертификата
openssl req -new -key server.key -out server.csr
# создание самоподписанного сертификата
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Открыть несколько файлов, каждый в своем табе:
$ vim -p file1 file2 file3
Открыть файл для редактирования в новом табе:
:tabe /path/to/file
Закрыть таб:
:tabc или :wq или ZZ
Перейти к следующему табу:
:tabn
Перейти к предыдущему табу:
:tabp
Вывести список открытых табов:
:tabs
Справка по табам:
:help tabpage
Postgrey is a program which implements greylisting and is
designed to work with the Postfix MTA.
WWW: http://postgrey.schweikert.ch/
Принцип действия серых списков основан на тактике рассылки спама. Как правило, спам рассылается в очень короткое время.
Работа серого списка заключается в намеренной задержке писем на некоторое время. При этом адрес и время пересылки заносится в базу данных серого списка. Если удалённый компьютер является настоящим МТА, то он согласно RFC2821, должен сохранить письмо в очереди и повторять пересылку в течение пяти дней. Спам-боты, как правило, писем в очереди не сохраняют, поэтому спустя непродолжительное время, прекращают попытки переслать письмо. Экспериментальным путём установлено, что в среднем время рассылки спама составляет чуть больше часа.
При повторной пересылке письма с этого же адреса, если с момента первой попытки прошло необходимое количество времени, Ваш МТА примет его. При этом IP-адрес отправляющего МТА, электронные адреса отправителя и получателя будут внесены в белый список на достаточно длительное время, после чего письма будут приниматься без задержек.
Установка:
1
2
| [root@case.net.ru]$ cd /usr/ports/mail/postgrey/
[root@case.net.ru]$ make install clean |
Добавляем в rc.conf:
Прописываем правила проверки сообщения для postfix’a в main.cf:
1
| smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023 |
Добавляем в файл /usr/local/etc/postfix/postgrey_whitelist_recipients доверенные домены и почтовые ящики для которых не производится проверка postgrey’ем.
Запускаем postgrey:
1
| [root@case.net.ru]$ /usr/local/etc/rc.d/postgrey start |
Перезагружаем postfix:
1
| [root@case.net.ru]$ postfix reload |
Отчет о проделанной работе:
1
| $ cat /var/log/maillog | postgreyreport --dbdir=/var/db/postgrey --nosingle_line --check_sender=mx,a --separate_by_subnet=":======\n" |
Ссылки: http://argo-uln.blogspot.com/2007/11/blog-post.html
AUTH PLAIN:
1
2
3
4
5
6
7
8
9
10
| #!/usr/local/bin/expect -f
set host case.net.ru
spawn telnet "$host" 25
expect "220 case.net.ru ESMTP Postfix"
send "EHLO localhost\r"
expect "250-case.net.ru"
send "AUTH PLAIN AHRlc3RAY2FzZS5uZXQucnUAMTIzNDU2\r"
expect "235 2.7.0 Authentication successful"
send "QUIT\r"
interact |
Где 7 строка – это авторизация в формате base64, полученная одним из следующих способов:
1
2
3
4
| $ perl -MMIME::Base64 -e 'print encode_base64("\000test\@case.net.ru\000123456");'
AHRlc3RAY2FzZS5uZXQucnUAMTIzNDU2
$ php -r 'echo base64_encode("\000test@case.net.ru\000123456");'
AHRlc3RAY2FzZS5uZXQucnUAMTIzNDU2 |
AUTH LOGIN:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #!/usr/local/bin/expect -f
set host case.net.ru
spawn telnet "$host" 25
expect "220 case.net.ru ESMTP Postfix"
send "EHLO localhost\r"
expect "250-case.net.ru"
send "AUTH LOGIN\r"
expect "334 VXNlcm5hbWU6"
send "dGVzdEBjYXNlLm5ldC5ydQ==\r"
expect "334 UGFzc3dvcmQ6"
send "MTIzNDU2\r"
expect "235 2.7.0 Authentication successful"
send "QUIT\r"
interact |
Где строки:
08 – Username:
09 – Имя пользователя в base64
10 – Password:
11 – Пароль в base64
Имя пользователя и пароль получаем следующим образом:
1
2
3
4
| $ php -r 'echo base64_encode("test@case.net.ru");'
dGVzdEBjYXNlLm5ldC5ydQ==
$ php -r 'echo base64_encode("123456");'
MTIzNDU2 |
Tags:
Часто при работе с asterisk возникает необходимость конвертировать файлы форматов wav и gsm. Сделать это без потери качества можно так:
gsm to wav:
$ sox infile.gsm -r 44100 -a outfile.wav
wav to gsm:
$ sox foo-in.wav -r 8000 -c 1 -s -w foo-out.wav resample -ql
(c) http://my-debian.blogspot.com/2008/10/wav-gsm-gsm-wav.html
Нижний уровень – сбор данных.
Data Input Methods – Здесь мы добавляем название нашего скрипта и определяем в какие переменные будет записывать его выхлоп.
Следующий уровень – хранение данных.
Data Templates – определяем шаблон хранилища данных. За какие периоды хранить данные, как часто они могут обновляться, какие переменные сохраняются в rrd файлах. Имена переменных соответственно берутся с нижнего уровня.
Следующий уровень – представление данных.
Graph Templates – определяем как наши данные будут рисоваться. Какие переменные рисовать линиями, какие значениями. Определяем все что выводится на картинке. Это уровень требует указания хранилища данных.
Порядок действий по созданию графика:
- написать скрипт для сбора данных, выхлоп которого имеет cacti-совместимый формат – ИМЯ:ЗНАЧЕНИЕ;
- добавить метод сбора данных;
- определить шаблон хранения данных;
- определить шаблон отображения данных;
- создать хранилище данных;
- создать график, указав ему созданное хранилище.
Ну и образец графика на последок:

XCache is a fast, stable PHP opcode cacher that has been tested and is now running on production servers under high load.
Установка:
1
2
3
4
5
6
| [root@case.net.ru]$ cd /usr/ports/www/xcache/
[root@case.net.ru]$ make showconfig
===> The following configuration options are available for xcache-1.2.2:
COVERAGER=off "Enable code coverage dumper"
===> Use 'make config' to modify these settings
[root@case.net.ru]$ make install clean |
Настройка:
1
2
| [root@case.net.ru]$ cp /usr/local/share/examples/xcache/xcache.ini /usr/local/etc/php/
[root@case.net.ru]$ cp -R /usr/local/share/examples/xcache/admin /usr/local/www/data/xcache |
В файле xcache.ini устанавливаем переменную xcache.admin.pass, хеш пароля можно получить командой:
1
| [root@case.net.ru]$ md5 -s password |
Что имеется: postfix + mysql + dovecot как imap сервер + roundcube
Задача: сделать так, что бы письма с пометкой SPAM ложились в каталог Junk, а не Inbox.
Собираем Dovecot с поддержкой LDA:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [root@case.net.ru]$ cd /usr/ports/mail/dovecot
[root@case.net.ru]$ make showconfig
===> The following configuration options are available for dovecot-1.1.11:
KQUEUE=on "kqueue(2) support"
SSL=off "SSL support"
IPV6=off "IPv6 support"
POP3=off "POP3 support"
LDA=on "LDA support"
MANAGESIEVE=off "ManageSieve support"
GSSAPI=off "GSSAPI support"
VPOPMAIL=off "VPopMail support"
BDB=off "BerkleyDB support"
LDAP=off "OpenLDAP support"
PGSQL=off "PostgreSQL support"
MYSQL=on "MySQL support"
SQLITE=off "SQLite support"
===> Use 'make config' to modify these settings
[root@case.net.ru]$ make install clean |
Устанавливаем dovecot-sieve:
1
2
| [root@case.net.ru]$ cd /usr/ports/mail/dovecot-sieve/
[root@case.net.ru]$ make install clean |
Настраиваем postfix:
Добавляем в master.cf:
1
2
| dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient} |
Меняем в main.cf:
1
| virtual_transport = dovecot |
Меняем в dovecot.conf:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| protocol lda {
postmaster_address = case@case.net.ru
hostname = case.net.ru
mail_plugins = cmusieve
mail_plugin_dir = /usr/local/lib/dovecot/lda
sendmail_path = /usr/sbin/sendmail
sieve_global_path = /usr/home/vmail/dovecot-sieve.conf
}
auth default {
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
group = vmail
}
}
} |
Настраиваем sieve в файле /usr/home/vmail/dovecot-sieve.conf:
1
2
3
4
| require "fileinto";
if header :contains "Subject" "SPAM" {
fileinto "Junk";
} |
Используется для объединения содержимого нескольких каталогов в одном.
Монтирование:
1
2
3
4
5
6
7
8
9
10
11
12
| [root@case.net.ru]$ ls -l dir1
total 12
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file1
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file3
[root@case.net.ru]$ ls -l dir2
total 0
-rw-r--r-- 1 root wheel 0 5 мар 11:41 file1
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file3
[root@case.net.ru]$ mount -t unionfs dir1 dir3
[root@case.net.ru]$ mount -t unionfs dir2 dir3 |
Каталог примонтированный первым (dir1) – становится каталогом нижнего уровня. Каталог примонтированный последним (dir2) – каталогом верхнего уровня. Данные верхнего уровня полностью перекрывают нижний.
1
2
3
4
5
| [root@case.net.ru]$ ls -l dir3
total 0
-rw-r--r-- 1 root wheel 0 5 мар 11:41 file1
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file3 |
Если удалить файл, который имеется в обоих каталогах, удалится он из верхнего уровня (dir2). На нижнем уровне он останется без изменений, но уже и не будет доступен для просмотра и работы.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [root@case.net.ru]$ rm dir3/file1
[root@case.net.ru]$ ls -l dir3
total 0
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file3
[root@case.net.ru]$ ls -l dir1
total 12
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file1
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 5 5 мар 11:20 file3
[root@case.net.ru]$ ls -l dir2
total 0
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file2
-rw-r--r-- 1 root wheel 0 5 мар 11:20 file3 |
При создании файла или изменении файла, который находится на нижнем уровне – файл создается (копируется) в верхний уровень.
1
2
3
4
5
6
7
8
| [root@case.net.ru]$ echo 'some_data' > dir3/file1
[root@case.net.ru]$ ls -l dir3/file1
-rw-r--r-- 1 root wheel 10 5 мар 11:46 dir3/file1
[root@case.net.ru]$ ls -l dir2/file1
-rw-r--r-- 1 root wheel 10 5 мар 11:46 dir2/file1
[root@case.net.ru]$ ls -l dir1/file1
-rw-r--r-- 1 root wheel 5 5 мар 11:20 dir1/file1
[root@case.net.ru]$ |
Где можно попробовать на практике: jail.
Ссылки: Unionfs во FreeBSD: разбираемся в текущей реализации (Сергей Супрунов, №50 / 01.2007).