Анализ падения ядра в Linux (kernel crash dump)

Завалить ядро линукс не так то и просто (если не преднамеренно, конечно), но такое случается… не все баги выловлены, а новые “фишки” приносят новые баги.

Итак, для сохранения дампа при падении ядра в Linux или kernel panic, необходимо настроить сервис kdump и установить несколько дополнительных пакетов.
Сам механизм представляет собой дополнительное маленькое ядро, смысл существования которого состоит в том, чтобы после падения основного ядра системы, перехватить управление, сохранить дамп и перезагрузить систему.

Для Fedora Linux устанавливается всё хозяйство просто командой:

yum install –enablerepo=fedora-debuginfo –enablerepo=updates-debuginfo kexec-tools crash kernel-debuginfo

А вот для Oracle Linux 6.4 чуть сложнее:

yum install crash -y
export DLP=”https://oss.oracle.com/ol6/debuginfo”

wget ${DLP}/kernel-uek-debuginfo-`uname -r`.rpm 
wget ${DLP}/kernel-uek-debuginfo-common-`uname -r`.rpm

rpm -Uhv kernel-uek-debuginfo-`uname -r`.rpm kernel-uek-debuginfo-common-`uname -r`.rpm

Команды приведены для текущего ядра системы. Если нужны пакеты для других версий ядра, то нужно указать версию вместо `uname -r`.

Далее, необходимо добавить в конфиг загрузчика (/boot/grub/grub.conf или /boot/efi/EFI/redhat/grub.conf – зависит от того, используется UEFI при загрузке сервера или нет): параметр ядра “crashkernel=128M“. Цифра указывает, сколько ОЗУ резервируется под резервное ядро. Через @ можно указать так же смещение в памяти, если необходимо. Например 128M@16 – зарезервирует 128 Мб ОЗУ начиная с физического адреса 0x01000000 (16MB).

Находим запись с нужной версией ядра (или можно ко всем добавить) и в итоге получим что-то в виде:
kernel /boot/vmlinuz-2.6.39-400.109.4.el6uek.x86_64 ro root=UUID=<> rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet crashkernel=128M

Теперь надо включить службу kdump для автозагрузки:

chkconfig kdump on

Также можно подредактировать конфиг /etc/kdump, но он и по-умолчанию достаточно хорош.
Теперь перезагрузим сервер, чтобы ядро загрузилось с новым параметром:

shutdown -r now

Проверяем, правильно загрузилось ядро с нашими параметрами:

cat /proc/cmdline

Также проверим, работает ли kdump:

service kdump status
Kdump is operational

Теперь, искусственно вызовем kernel panic командой:

echo c > /proc/sysrq-trigger

При этом будет подгружаться маленькое резервное ядро и сохранит дамп. На сохранение дампа нужнон екторое время, потому в определенный момент может показаться, что ядро подвисло – нужно дождаться окончания процесса.

После перезагрузки, мы сможем найти наши дампы (по-умолчанию) в папке /var/crash. Запускаем анализатор дампа:

crash /var/crash/2009-07-17-10:36/vmcore /usr/lib/debug/lib/modules/`uname -r`/vmlinux

После запуска crash покажет нам некоторую полезную инфу и даст свою командную строку:

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-unknown-linux-gnu”…

      KERNEL: /usr/lib/debug/lib/modules/2.6.39-400.210.2.el6uek.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2013-11-13-12:04:56/vmcore  [PARTIAL DUMP]
        CPUS: 2
        DATE: Wed Nov 13 12:03:52 2013
      UPTIME: 00:21:58
LOAD AVERAGE: 0.23, 0.17, 0.10
       TASKS: 93
    NODENAME: nagios
     RELEASE: 2.6.39-400.210.2.el6uek.x86_64
     VERSION: #1 SMP Thu Oct 17 16:28:13 PDT 2013
     MACHINE: x86_64  (3292 Mhz)
      MEMORY: 2 GB
       PANIC: “Oops: 0002 [#1] SMP ” (check log for details)
         PID: 1902
     COMMAND: “bash”
        TASK: ffff880037a88200  [THREAD_INFO: ffff880037f86000]
         CPU: 1
       STATE: TASK_RUNNING (PANIC)

crash>

Помощь по командам: help или help command

Core dump от любого процесса также можно посмотреть командой: gdb path_to_core
Но, чтобы создавались дампы от процессов необходимо подредактировать файл /etc/limits.conf, например, командой:

sed -i ‘s/.. *soft *core *0/*tsoftttcorettunlimited/g’ /etc/security/limits.conf

Более подробно по командам можно почитать здесь:
http://docs.oracle.com/cd/E37670_01/E41138/html/ch10s02.html

Всем удачи и поменьше багов! 🙂

http://geckich.blogspot.com/

Запуск графических приложений на удаленной Linux-машине с помощью Putty и Xming (export display)

Суть задачи в следующем. Есть у нас сервер, на котором нету X-сервера, только консоль. А нам нужно, к промеру, установить Oracle Solaris Studio и запусктаь ее удаленно. Или какое-то другое приложение, работающее в GUI-режиме.
Для решения этой задачи выполняем следующее.
1. На сервере устанавливаем пакеты xauth и xterm. Например, для Oracle Linux (или другого RHEL):
yum install xauth xterm

2. Также, нужно проверить, включено ли X11 Forwarding в конфигурационном файле SSH-демона:

nano /etc/ssh/sshd_config

X11Forwarding yes

3. Eсли вы заходите с помощью Windows-машины, то вам необходимо установить Xming – X-эмулятор для форточек.  Ну и, собсно, сам Putty – ssh-клиент для Windows.

Установка Xming тривиальна, по типу далее, далее, далее. Только поставить галочку, что мы будем использовать его вместе с Putty. Сам Putty так же устанавливаем.
4. Запускаем Xming, он свернется в трей и после этого запускаем Putty и на вкладке Connection / SSH / X11 отмечаем галочку Enable X11 forwarding, а также дописываем в поле X display location значение localhost:0.

4. Далее подключаемся к удаленному серверу и запускаем наше приложение. Например, Solaris Studio:
/opt/oracle/solarisstudio12.3/bin/solstudio

Когда всё подгрузиться, вы увидите заветное окошко:

Для тех, кто работает в Linux-среде всё еще проще. Запускать приложения на удаленной машине можно, добавляя к подключению по ssh ключ -X.

Если нужно запустить графическое приложение на удаленной машине, не доступной с вашей рабочей, но доступной через третью машину, то на этой третьей машине необходимо сделать форвардинг 22го порта для ssh и 6010 порта (для дисплея localhost:0) TCP.

Проверка доступности портов между двумя Linux-машинами (для Solaris тоже работает)

Бывают ситуации, когда нам необходимо проверить видимость TCP портов одной машины для другой. Казалось бы всё просто – telnet. А если на серверной машине еще не установлено или не запущено приложение, слушающее нужный порт? Я уверен, что существует масса способов, но мне было проще написать 2 маленьких скрипта на Python.

Один скрипт – сервер. Слушает заданный порт и пишет в консоль информацию о клиентах. А второй – клиентский скрипт – стучится по заданному IP в заданный порт и возвращает ответ от сервера (если порт доступен).

Серверный скрипт.

#!/usr/bin/env python
import socket, sys
# Server address and buffer size
TCP_IP = '0.0.0.0'
BUFFER_SIZE = 1024
# Usage string
usage = "server.py PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 2):
print(usage)
sys.exit(0)
TCP_PORT = int(sys.argv[1])
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
# Listen for client connection until Ctrl+C will be pressed
while 1:
c = s.accept()
cli_sock, cli_addr = c
cli_sock.send("Hello, person from %s"%(str(cli_addr)))
cli_sock.close()
print("received data from:", str(cli_addr))


Запуск. Копируем в текстовый файл вышенаписанный код и запускаем:

python server.py <port>

Клиентский скрипт.

#!/usr/bin/env python
import socket, sys
usage = "client.py IP PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 3):
print(usage)
sys.exit(0)
TCP_IP = sys.argv[1]
TCP_PORT = int(sys.argv[2])
BUFFER_SIZE = 1024
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
# Recieving response from the server
data = s.recv(BUFFER_SIZE)
s.close()
print("received data:", data)

Запуск. Копируем в текстовый ф
айл вышенаписанный код и запускаем:

python client.py <server_IP> <server_port>

http://geckich.blogspot.com/

Как сохранить кадр из видео в Linux

В командной строке переходим в нужную папку и выполняем команду:

mplayer -vo png -ss 00:30:00 -frames 1 video-file.mp4

Это даст нам следующее:

-vo png – формат изображения png
-ss 00:25:00 – кадр будет взят из 25й минуты фильма (формат ЧЧ:ММ:СС)
-frames 1 – сохранит только 1 кадр, в текущую директорию.
video-file.mp4 – путь к файлу содержащему видео (кодек видео должен присутствовать в системе)

http://geckich.blogspot.com/

Использование iperf для тестирования мультикаста

Для того, чтобы проверить, приходит ли на наш сервер/рабочую машину/ПК мультикаст, можно использовать и tcpdump:

tcpdump -i bond0.666 udp -nn port 4444

 но он не делает join к мультикаст группе и, в зависимости от настройки сетевого оборудования, вы можете мультикаст и не увидеть.

Лучше использовать утилиту iperf. Она служит для анализа быстродействия сети, и для наших целей отлично подходит.

 
Итак, на Debian устанавливаем просто: 
 
aptitude install iperf
 
А для RHEL дистрибутивов (RedHat, Oracle Linux, CentOS etc.) нужно или добавить репозиторий RepoForge или посмотреть пакет для своей версии ОС тут http://pkgs.repoforge.org/iperf/ и установить, например:
 

yum install http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

или

rpm -Uhv http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

Далее, если адрес мультикаст группы 239.200.1.1, а порт 4444, то делаем команду и смотрим результат:

iperf -s -u -B 239.200.1.1 -i 1 -p 4444

здесь

  • -s -режим сервера, 
  • -u – использовать UDP, 
  • -i 1 – выводить информацию каждую секунду, 
  • -B и -p – адрес нашего мультикаста.
 

Полезные команды для мультикаста:

Посмотреть подписку по группам:

netstat -gn

или

ip maddr show

Дамп по интерфейсу и группе мультикаста:

tcpdump -n -nn -i eth0 host 239.31.82.10
tcpdump -i p1p1.1302 -s0 -vv net 224.0.0.0/4

Иногда необходимо поменять системные перменные:

sysctl -ar '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.em1.rp_filter = 0
net.ipv4.conf.em2.rp_filter = 0
net.ipv4.conf.em3.rp_filter = 0
>net.ipv4.conf.em4.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.p1p1.rp_filter = 0
net.ipv4.conf.p1p1/1302.rp_filter = 0
net.ipv4.conf.p1p1/2202.rp_filter = 0
net.ipv4.conf.p1p2.rp_filter = 0
net.ipv4.conf.p1p2/1402.rp_filter = 0
net.ipv4.conf.p1p2/2202.rp_filter = 0

Изменить значение переменной sysctl:

sysctl -w net.ipv4.conf.em3.rp_filter=0

Включить маршрутизацию пакетов:

sysctl -w net.ipv4.ip_forward=1

Кофиги sysctl могут быть в:

  1. /run/sysctl.d/*.conf
  2. /etc/sysctl.d/*.conf
  3. /usr/local/lib/sysctl.d/*.conf
  4. /usr/lib/sysctl.d/*.conf
  5. /lib/sysctl.d/*.conf
  6. /etc/sysctl.conf

RHEL выключить мультикаст на интерфейсе:

ip link set multicast off dev br0

RHEL включить мультикаст на интерфейсе:

ip link set multicast oт dev br0

Проверить включен ли мультикаст:

ip link show br0
8: br0: mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000

Включить мультикаст на фаерволле (по-умолчанию выключен):

firewall-cmd --zone=zone-name --add-protocol=igmp

Выключить SELinux:

nano /etc/selinux/config

Источники:

  1. https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/
  2. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-enabling_ip_multicast_with_igmp
  3. https://unix.stackexchange.com/questions/299163/app-cannot-receive-multicast-packets-on-centos-7
  4. https://superuser.com/questions/324824/linux-built-in-or-open-source-program-to-join-multicast-group
  5. https://serverfault.com/questions/163244/linux-kernel-not-passing-through-multicast-udp-packets/216568
  6. https://support.citrix.com/article/CTX116493

Белый список спам-фильтра Amavis

Для занесения доверенных, но отсылающих по каким-либо причинам подозрительные для Amavis письма, отправителей необходимо дописать в файлик  /etc/amavis/conf.d/50-user:

# список доверенных IP: 
@mynetworks = qw( 127.0.0.0/8 192.168.1.0/24 ); 

 # разрешаем всю почту из доверенных IP: 
$policy_bank{‘MYNETS’} = {  
 bypass_spam_checks_maps => [1], # не проверять на спамl 
 bypass_banned_checks_maps => [1],  
 bypass_header_checks_maps => [1], # не проверять заголовок 
};
Только добавляйте выше этого:
#———— Do not modify anything below this line ————-
1;  # ensure a defined return
Перезапускаем демона amavis и проверяем.
http://geckich.blogspot.com/

Как разделить образ .cue на треки .flac в Linux

Вот бывает хочется сделать свой аудиодиск с подборкой композиций из разных альбомов. Делать его из mp3 не разумно, т. к. mp3 – сжатие с потерей качества и от того, что мы его “раздуем” обратно в audio cd качество не улучшится. Потому лучше брать музыку в lossless фотматах. Но очень часто музыка идет одним образом, в котором содержаться все треки альбома. А если нам нужно вытянуть оттуда только несколько песен?
На примере Debian 7 делаем следующее.
Устанавливаем вначале необходимые пакеты:
aptitude install shntool cuetools
Далее переходим в папку с .cue и разбиваем:
shntool split -f *.cue -o flac *.flac
На выходе получим файлы с именами split-track##.flac. И можем дальше собирать наш аудио-диск.
Некоторые cue файлы так разбить не удалось, помогла программа под винду Medieval CUE Splitter (PC)

Удобочитаемая панель предпросмотра в Roundcube Webmail

По-умолчанию в Raundcube Webmail очень не удобное расположение панели предпросмотра писем. Т. е. расположена сия панель внизу, горизонтально. Что на современных широкоформатных мониторах, совсем не удобно. И в настройках это дело по-умолчанию не настраиваемо.

Решить проблему сию поможет плугин Threecol Layout, доступный по ссылке:
https://github.com/tofi86/Roundcube-Plugin-Threecol-Layout

Но он работает только с версиями Roundcube 0.9.x, я же ставил версию из пакетов Debian Wheezy, а там только 0.8. Пришлось скачать архив с сайта разработчиков Roundcube и установить заново (я решил устанавливать всё в папку /var/www/roundcubemail – у вас путь может быть иной). Благо, старую БД он подхватил отлично и настройки в main.inc.php мало отличаются.

Скачиваем его на сервер, распаковываем в папку с плугинами, например:  /var/www/roundcubemail/plugins

Редактируем конфигурационный файл:

nano /var/www/roundcubemail/config/main.inc.php


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

// ———————————-
// PLUGINS
// ———————————-

// List of active plugins (in plugins/ directory)
$rcmail_config[‘plugins’] = array(‘threecol’, ‘thunderbird_labels’, ‘markasjunk2’);

Также вниз (или куда угодно) дописываем:

//threecol
$rcmail_config[‘previewpane_layout’] = ‘right’;

Перезапускаем веб-сервер и радуемся нормальному превью:

service apache2 restart

http://geckich.blogspot.com/

Удаление старых файлов одной командой в Linux

С помощью команды find легко удалять или перемещать или копировать файлы, с датой модификации старше заданной. Удобно помещать такую команду в cron.

Например, для файлов старше 5 дней:

find /path/to/files* -mtime +5 -exec rm {} ;

Для файлов, измененных в пределах 24…48 часов:

find /path/to/files* -mtime 1 -exec rm {} ;

Это версия для Debian, на RHEL надо писать чуть по-другому:

find /path/to/files* -mtime +0 -exec rm {} ;

Создать файлы для тестирования можно командой (например, дата 2 апреля):

touch -d ‘2 Apr’ /path/to/test_file
http://geckich.blogspot.com/

Борьба со спамом средствами Postfix

В этой статье постараюсь изложить свой опыт по настройки MTA Postfix для максимальной фильтрации спама и нежелательных писем встроенными средствами и средствами модулей Postfix’а. Настройка Amavis, Spamassassin, Clam и т. п. отдельных средств фильтрации спама выходит за рамки данной статьи и я возможно напишу об этом позже.

Входные данные:

  • сервер под управлением ОС Debian 7, 
  • Postfix 2.9.x, 
  • домен: example.com, 
  • внешний IP – 222.222.222.222, 
  • внутренняя сеть – 192.168.1.0/24, 192.168.2.0/24. 

Считаю, что постфикс у вас уже настроен в плане авторизации, почтовых ящиков и прочего хозяйства.

Основной файл, где настраивается фильтрация спама, это main.cf

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

mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.168.2.0/24

Далее следуют проверки HELO, т. к. многие спаммеры или пропускают команду SMTP HELO или посылают заведомо неверные данные.

smtpd_delay_reject = yes 
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_helo_access hash:/etc/postfix/helo_access,
reject_non_fqdn_hostname,
reject_invalid_hostname,
permit
1 – включаем проверки HELO и заодно совместимость с некоторыми клиентами
2 – сразу отклоняем письма от отправителей без HELO
3 – цепочка фильтрации HELO:

  • разрешить доверенным сетям,
  • разрешить авторизованным по sasl (если вы используете sasl)
  • проверка хеш-таблицы, которая собержит черный/белый список HELO, в который вы вправе добавить заведомо доверенные или нежелательные домены/адреса, например:
smap.com REJECT SPAM!
some_other_spam.com REJECT SPAM!
234.234.234.234 REJECT Some spam IP
trusted_domain.com OK
example.com REJECT Fake!
222.222.222.222 REJECT Fake!
Последние 2 строчки добавлены т. к. со всех наших сетей доступ уже был разрешен с помощью mynetworks и, если спаммер выдает себя за нас, то тут его как раз и отфильтрует.

  • далее происходит фильтрация заведомо неправильных доменов вроде “MAILSERVER” или “HOST@192.168!aol.com”
  • если с HELO письма всё хорошо, то оно проходит в следующую цепочку фильтрации

Также можно добавить перед permit опцию reject_unknown_hostname, но использование ее спорно – она фильтрует письма от доменов, которые не могут быть отрезольвены с помощью DNS. С одной стороны хорошо, а с другой – многие валидные системы имеют проблемы с DNS и их письма будут тоже отклонены.

Протестировать действие этих правил без риска ложных срабатываний можно, вставив в цепочку (до permit, естественно) опцию warn_if_reject – Postfix не будет фильтровать письма, а только писать в лог.
Далее следует цепочка фильтрации по отправителю письма.
smtpd_sender_restrictions = 
permit_mynetworks,
permit_sasl_authenticated,
check_sender_access regexp:/etc/postfix/sender_access,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
  • вначале как и раньше – разрешаем “нашим” доступ
  • проверяем, как и в предыдущем случае, хеш-таблицу с белым/черным списком и “отфутболиваем” отправителей из неправильных и неизвестных доменов
  • пропускаем тех, у кого всё Ок с отправителем
Теперь письмо уже имеет достаточно большой шанс быть легитимным и, кстати, большинство спама уже должно быть отфильтровано. Остались наиболее “тяжелые” проверки. 
Далее следует проверка по получателю письма:
smtpd_recipient_restrictions =
reject_unauth_pipelining,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_recipient_access regexp:/etc/postfix/recipient_access,
check_policy_service inet:127.0.0.1:10023,
check_policy_service unix:private/policy-spf,
permit
  • многие спаммеры посылают письма как можно быстрее сериями команд, не дожидаясь ответа – для фильтрации такого спама первая проверка
  • далее мы фильтруем неправильные и неизвестные домены
  • разрешаем “нашим”
  • опция reject_unauth_destination возможно самая важная – без нее наш сервер станет т.н. open relay
  • далее следует проверка по хешу блеклиста получателей – полезно добавлять туда даже локальных пользователей, если на их аккаунты сыпятся т. н. баунсы. Пример записи:

something@example.com REJECT This is not real account.

  • далее идет прове
    рка через внешний сервис т.н. грейлистинга – в данном случае – Postgrey.
  • а также проверка Sender Policy Framework (SPF) – он них ниже.
  • ну и, конечно же, пропуск далее валидных писем
Теперь последняя цепочка проверок:
smtpd_client_restrictions = 
permit_mynetworks,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,
permit

Здесь мы проверяем адреса отправителя в помощью сервисов черных списков. Дескредитированные IP-адреса, от которых идет спам, заносятся в эти списки. Перед использованием в своем конфиге нужно проверить, работают ли сервисы – иначе будет большая задержка приходящих писем.

Для использования Spamassassin и Amavis необходимо так же добавить строчку:

content_filter = amavis:[127.0.0.1]:10024

Но настройка этих демонов – это тема для отдельной статьи.

Теперь поподробнее о SPF и Greylisting

SPF позволяет владельцу домена указать в TXT-записи, соответствующей имени домена, специальным образом сформированную строку, указывающую список серверов, имеющих право отправлять email-сообщения с обратными адресами в этом домене.

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

Пример SPF-данных в TXT-записи DNS:

example.org. IN TXT “v=spf1 +a +mx -all”

v= определяет используемую версию SPF. Далее следует перечисление механизмов верификации: в данном случае «a» разрешает прием писем от узла, IP-адрес которого совпадает с IP-адресом в A-записи для example.org; «mx» разрешает прием писем, если отправляющий узел указан в одной из MX-записей для example.org. Строка завершается «-all» — указанием того, что сообщения, не прошедшие верификацию с использованием перечисленных механизмов, следует отвергать. Также может использоваться «~all» – в этом случае письмо, не прошедшее верификацию, не должно быть отклонено, но может быть изучено более тщательно (SoftFail).

Этой записи вполне может и не быть, но всё же.

Greylisting — способ автоматической блокировки спама, основанный на том, что «поведение» программного обеспечения, предназначенного для рассылки спама, отличается от поведения обычных серверов электронной почты. Еслипочтовый сервер получателя отказывается принять письмо и сообщает о «временной ошибке», сервер отправителя обязан позже повторить попытку. Спамерское программное обеспечение в таких случаях, обычно, не пытается этого делать.

Установить это хозяйство достаточно просто:

aptitude install postfix-policyd-spf-python postgrey
Затем необходимо добавить в main.cf постфикса, как написано выше:

check_policy_service inet:127.0.0.1:10023, check_policy_service unix:private/policy-spf,

в цепочку smtpd_recipient_restrictions (НО после reject_unauth_destination). Также необходимо добавить в этот файл (лучше в конец) опцию:

policy-spf_time_limit = 3600s

Еще в master.cf необходимо добавить следующее: 
policy-spf  unix  –       n       n       –       –       spawn
     user=nobody argv=/usr/bin/policyd-spf

Перезапускаем службы и смотрим в логи, как работает наша обновка.

Создать SPF-запись для своего домена можно с помощью мастера здесь:
http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/default.aspx

Полезные ссылки:

http://www.postfix.org/postconf.5.html
http://www.freesoftwaremagazine.com/articles/focus_spam_postfix
https://help.ubuntu.com/community/Postfix/SPF

http://geckich.blogspot.com/