Для настройки правил iptables существуют различные виды таблиц:
Mangle –для изменения заголовков пакетов
Nat – необходима для настройки трансляции сетевых адресов.
Filter – в данной таблице указываются правила для фильтрации трафика. Данная таблица задействована по умолчанию.
Continue Reading

Ситуация проста: на новый и очаровательный сервер с Ubuntu 10.04+ и современным (когда-то) PHP 5.3, пригодным для всех актуальных версий CMS, вдруг требуется подселить старый-старый сайт, начинающий сыпать ошибками при попытке запуска на PHP 5.3 (подавай ему чего-нибудь постарше, например, PHP 5.2). Кто виноват — понятно. Но что делать?

Continue Reading

Лог-файлы размещаются в каталоге /var/log/exim/:

  • текстовые файлы:
    exim_mainlog — текущий лог-файл работы почтового сервера
    exim_rejectlog — текущий лог-файл ошибок доставки корреспонденции
  • архивные файлы:
    exim_mainlog.0.gz —exim_mainlog.7.gz — архивы предыдущих лог-файлов работы почтового сервера
    exim_rejectlog.0.gz — exim_rejectlog.7.gz — архивы предыдущих лог-файловошибок доставки корреспонденции

Формат логов подробно описан в документации на exim. Основной сайт —www.exim.org.

Пример фрагмента лог-файла с подробной расшифровкой:
2004–04–13 07:38:59 1BDElF-0006fT-Jz@radiomayak.ru H=(interost.ru) [82.148.19.253] P=esmtp S=41294
2004–04–13 07:38:59 1BDElF-0006fT-Jz => alexey R=localuser T=local_delivery
2004–04–13 07:38:59 1BDElF-0006fT-Jz Completed

Первая строка — запись о принятии сообщения, на это указывают символы ’<=’.

Во всех записях первыми идут дата и время. Практически во всех записях далее идет внутренний идентификатор сообщения, здесь это 1BDElF-0006fT-Jz. Он одинаков для всех записей, относящихся к обработке одного и того же сообщения. Далее идет знак операции:
<= — прием
=> — доставка
— > — доставка за один прием сообщения на несколько адресов
== — сообщение отложено для последующей обработки из-за нефатальной ошибки
** — прекращение обработки из-за фатальной ошибки
Completed — обработка сообщения завершена.

В строках с знаком ’<=’:
сразу после знака идет адрес отправителя (аргумент SMTP команды MAIL FROM)
H=(…) — аргумент SMTP команды HELO или EHLO
[..] — IP адрес с которого принято сообщение
P=…. — протокол. Варианты:

  • smtp — SMTP, была дана команда HELO
  • esmtp — SMTP, была дана команда EHLO
  • asmtp — SMTP c авторизацией
  • local — сообщение передано локально — например вызовом команды sendmail из скрипта

S=… — размер сообщение в байтах
U=… — пользователь, от имени которого запускалась команда sendmail
R=… — идентификатор сообщения, в ответ на которое было порождено данное сообщение (обычно для сообщений об ошибке доставки)
id=… — собственный идентификатор сообщения (находится в заголовке Message-ID)

Таким образом, первая строка говорит о том, что 13 апреля в 07:38:59 с сервера 82.148.19.253, представившегося как interost.ru было принято сообщение размером 41294 байт с обратным адресом inform@radiomayak.ru.

В строках с знаком ’=>’ или ’->’:
сразу после знака идет адрес получателя. В случае локальной доставки перед ним идет имя почтового ящика.
R=… — название использовавшегося роутера. В наших типовых настройках это:

  • localuser — в локальный почтовый ящик
  • shadow_autorep — автоответчик с доставкой сообщения
  • regular_autorep — автоответчик без доставки
  • lookuphost — доставка на удаленный сервер, определяемый по MX записи.

T=… — название использовавшегося транспорта. В наших типовых настройках это:

  • local_delivery — в локальный почтовый ящик
  • remote_smtp — на удаленных сервер.
  • autoreply_pipe — один из автоответчиков
  • address_pipe — передача скрипту через email-alias
  • address_pipe — запись в файл через email-alias

H=… — имя сервера куда была осуществлена доставка по smtp
[…] — IP адрес этого сервера

Вторая строка вашего примера говорит о том, что это сообщение практически сразу было доставлено в локальный почтовый ящик alexey, соответствующий адресу alexey@interost.ru.

Третья строка отмечает дату и время завершения обработки письма.

Также бывают строки с записями об ошибке:

В строках с знаком ’==’ и ’**’:
адрес получателя

R=… — роутер
далее идет текст ошибки

Записи без идентификатора сообщения после даты и времени — это обычно ошибки при приеме сообщения. В них может быть следующая информация:
H=(…) — аргумент SMTP команды HELO или EHLO
F=<…> — адрес отправителя
[…] — сервер с которого производилась отправка далее идет текст ошибки.

В общем, понадобилась мне версия php 5.3 на новом debian 7. В репозиториях только версия 5.4. Немного гугления и решение найдено.

Для начала нужно подключить репозитории squeeze. Открываем файл /etc/apt/sources.list редактором nano или другим и добавляем туда вот это:

deb http://ftp.de.debian.org/debian/ squeeze main
deb-src http://ftp.debian.org/debian/ squeeze main

deb http://packages.dotdeb.org squeeze all
Для dotdeb.org  добавляем ключ
wget -O - http://www.dotdeb.org/dotdeb.gpg |  apt-key add -

После чего выполняем команду apt-get update.

Перед установкой необходимо удалить всё, что связано с php 5.4.

apt-get remove --purge `dpkg -l | grep php | grep -w 5.4 | awk '{print $2}' | xargs`

Далее смотрим, какая версия php 5.3.* доступна для установки:

apt-cache showpkg php5

Будет что-то вроде этого:

Provides:
5.4.35-0+deb7u2 -
5.4.4-14+deb7u14 -
5.3.29-1~dotdeb.0 -
5.3.3-7+squeeze19 -

Последняя — то, что нам нужно. Для удобства присвоим ей переменную:

VERSION="5.3.3-7+squeeze19"

Устанавливаем основные пакеты:

apt-get install php5=$VERSION php5-cli=$VERSION php5-common=$VERSION

или

apt-get install php5=5.3.3-7+squeeze19 php5-cli=5.3.3-7+squeeze19 php5-common=5.3.3-7+squeeze19

или
apt-get install -t squeeze php5

Также и с другими пакетами. Допустим, нужен модуль mysql.

apt-get install php5-mysql=$VERSION

Если php как модуль apache:

apt-get install libapache2-mod-php5=$VERSION

После установки, все пакеты нужно будет заморозить, чтобы при установке обновлений ОС php не был обновлён до последней версии 5.4. Делается это при помощи aptitude. Напечатайте aptitude hold и названия установленных пакетов:

aptitude hold php5 php5-cli php5-common

Если вдруг понадобилось разморозить эти пакеты, то hold следует заменить на unhold. Пример:

aptitude unhold php5 php5-cli php5-common

Как говориться «лень — двигатель прогресса» поэтому я покажу как можно еще работать с командной строкой bash, стандартно с помощью клавиш перемещения курсора можно перемещаться по списку ранее введенных команд. Если мне была нужна определенная команда из ранее введенных — „стрелка вверх“ и до тех пор пока нужная команда не появиться в терминале далее корректировка по надобности и выполнения ее.
Оказываеться есть еще один хороший способ — для просмотра списка ранее введенных команд в bash — имеется команда history. По умолчанию она выводит список команд хранящийся в истории.
$ history
1 sudo route del -net
2 cat /etc/resolv.conf
3 htop
......
50 nslookup
51 ping mail.ru
52 ifconfig
......
200 sudo aptitude full-upgrade
......
300 mc


По умолчанию все пишиться в файл ~/.bash_history, а его размер — 500 команд.
Если хотим хранить историю в другом файле, то нужно в .bashrc, задать команду HISTFILE=~/.my_history.
HISTSIZE — определяет число строк, хранящихся в списке истории (в памяти интерпретатора).
HISTFILESIZE — максимальное количество команд хранящихся в файле истории.
Если интересует больше записей, по можно поменять под себя:

$ export HISTSIZE=1000
$ export HISTFILESIZE=1000

При запуске команды history без параметров, выдаеться весь список сохранненных команд, что довольно громоздко, поэтому есть возможность указать
количество выводимых строк (команд):
$ history 20
280 sudo aptitude full-upgrade
281 ps ax | grep conky
282 dig @217.23.122.130 ya.ru mx
......
300 mc

Выдаст 20 последних команд, все команды имеею свой номер, с помощью которого к ней можно обратится.
Если нам надо повторить 282 команду, то просто набираем в терминале:
$ !282
dig @217.23.122.130 ya.ru mx
; <<>> DiG 9.5.0-P2 <<>> @217.23.122.130 ya.ru mx
; (1 server found)
... ......

Сначало показываеться команда соответствующая этому номеру, потом ее выполнения.
Cписок наиболее распространенных команд:

 

  • !! — ссылается на предыдущую команду;
  • !n — ссылается на команду под номером n;
  • !-n — ссылается на команду по номером „текущая минус n“;
  • history -c — очистить историю команд, удалив все записи
  • history -d n — удалить из истории запись под номером n
  • history -a — дописать команды, введенные в текущей сессии bash, в конец файла $HISTFILE

 

Дополнения:
Так же можно сохранить дату и время для каждой команды в истории, для этого в конец .bashrc дописываем:
$ nano .bashrc

export HISTTIMEFORMAT="%h/%d-%H:%M:%S"

и применяем изменений в .bashrc без перезапуска сеанса/системы делаем командой
$ bash
Получаем :
$ history 3

147 Aug/11 — 11:05:28 sudo aptitude install gspca-source
148 Aug/11 — 11:07:23 cd /lib/modules/2.6.32-22-generic/
149 Aug/11 — 11:11:08 modprobe gspca

 

Контролируйте Bash History

HISTCONTROL — представляет из себя список опций, разделенных двоеточиями.

Они контролируют каким образом список команд сохраняется в истории.

Опция Описание
ignorespace не сохранять строки начинающиеся с символа <пробел>
ignoredups не сохранять строки, совпадающие с последней выполненной командой
ignoreboth использовать обе опции 'ignorespace' и 'ignoredups'
erasedups удалять ВСЕ дубликаты команд с истории

Пример :

export HISTCONTROL=ignorespace:erasedups

Добавьте в .bashrc:

export HISTCONTROL="ignoredups"

Или даже так:

export HISTIGNORE="&:ls:[bf]g:exit"

Это заставит bash игнорировать дупликаты, так же как ls, bg, fg и exit, делая историю чище.

Забытая история bash.

Если вы открыли терминал и печатаете там команды, потом открыли еще один, немного его поиспользовали, то новый терминал не «вспомнит» ни одной команды, напечатанной в первом. Вдобавок, при закрытии первого терминала второй перезапишет все команды в истории, введённые в первом. Вдвойне досадно!

Это происходит потому, что история bash сохраняется только когда вы закрываете терминал, а не после каждой команды. Чтобы исправить такое поведение, добавьте в ~/.bashrc строки:

shopt -s histappend
PROMPT_COMMAND=`history -a`

Добавьте следующую строку, если переменная $PROMPT_COMMAND уже была задана :

PROMPT_COMMAND='$PROMPT_COMMAND; history -a'

Это заставит bash дополнять историю вместо того, чтобы перезаписывать её: каждый раз, когда показывается приглашение командной строки, последняя команда добавляется в историю.

 

Увеличиваем Размер Хранимой Истории

Увеличьте HISTSIZE — количество команд, которые необходимо запоминать в списке истории (стандартное значение — 500).

export HISTSIZE=10000

Увеличьте HISTFILESIZE — максимальное количество строк, содержащееся в файле истории (стандартное значение — 500).

export HISTFILESIZE=10000

Одна Команда — Одна Запись в Истории

Сохранять все строки многострочной команды в одной записи списка истории :

shopt -s cmdhist

Изменить Имя Файла с Историй Команд

Используйте HISTFILE для изменения имени файла, в котором сохраняется история команд. Стандартное значение ~/.bash_history.

export HISTFILE=~/.custom_file
 

Много раз наблюдал, когда системный администратор для того, чтобы узнать, сколько запросов приходит ему на nginx за секунду, сидит и выгрепывает определенную секунду из лога, после чего делает | wc -l. Не знаю, зачем так извращаться, если есть pv.
Вообще pv позволяет посчитать, сколько строчек в секунду появляется в файле (если быть занудой — то сколько строчек в секунду подается ему на STDIN). Легко предположить, что при правильном access.log’e у nginx’a количество новых строчек == количеству отправленных ответов на запросы. А при ещё более правильном — количество запрошенных страниц.
Вообще эту штуку можно натравить на любой лог, фантазируйте сами.

Для начала поставим pv:
<strong>root@debian:~# aptitude install pv</strong>
Самый простой пример:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | pv -lr</strong>
Где-то там внизу у нас замелькают какие-то цифры. При желании их можно разглядеть. Плюс этой команды в том, что мы можем одновременно видеть, что происходит в логе.

Представим, что нам не нужно смотреть, что происходит в самом логе. Сделаем так:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | pv -lr >/dev/null</strong>
[3.94/s ]

Всё хорошо, но такая статистика — цифры в вакууме. Значение будет скакать от нуля до пикового.
Нам нужна усредненная статистика, по количеству строк в секунду, за последние 30 секунд:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | pv -lr -i 30 >/dev/null</strong>
[0.933/s ]

Первое значение появится через 30 секунд, потом каждые 30 секунд будет обновляться. Такое значение колеблется намного меньше и ему уже можно верить при озвучивании цифр.
Запустив такую штуку в скрине с -i 86400 мы получим усредненное значение за сутки.

Ну и напоследок. Вам никто не запрещает использовать grep. Например, чтобы отследить количество обращений к одной странице или количество хитов с определенного адреса.
Делать это просто:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | grep 192.168.0.10 | pv -lr -i 30 >/dev/null</strong>
[0.125/s ]
Здесь мы видим, что хост 192.168.0.10 последние 30 секунд обращался к нам с частотой 0.125 запроса в секунду.

Или так:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | grep ""-"" | pv -lr -i 30 >/dev/null</strong>
[137.124/s ]
137.124 запроса в секунду с пустым реферером. Имеет смысл запретить на время коннекты с пустым реферером, не правда ли?

И grep -v тоже никто не запрещает использовать:
<strong>root@debian:~# tail -f /var/log/nginx/access.log | grep -v "/index.php" | pv -lr -i 30 >/dev/null</strong>
[15.541/s ]
Здесь мы видим 15.541 запроса в секунду к страницам, кроме index.php (в т.ч. и без index.php?чтототам).

Пользуйтесь на здоровье и поменьше вам ddos’ов, по которым нужно писать отчеты.