Для настройки правил iptables существуют различные виды таблиц:
Mangle –для изменения заголовков пакетов
Nat – необходима для настройки трансляции сетевых адресов.
Filter – в данной таблице указываются правила для фильтрации трафика. Данная таблица задействована по умолчанию.
Continue Reading
Настройка PHP 5.2 (через fastcgi) и PHP 5.3 (как модуль Apache2) на одном сервере под управлением Ubuntu 10.04 (и бонус: прикручивание ZendOptimizer)
Ситуация проста: на новый и очаровательный сервер с Ubuntu 10.04+ и современным (когда-то) PHP 5.3, пригодным для всех актуальных версий CMS, вдруг требуется подселить старый-старый сайт, начинающий сыпать ошибками при попытке запуска на PHP 5.3 (подавай ему чего-нибудь постарше, например, PHP 5.2). Кто виноват — понятно. Но что делать?
лог-файл работы почтового сервера
Лог-файлы размещаются в каталоге /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
В общем, понадобилась мне версия 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
Работа в Linux с историей команд (history)
Как говориться «лень — двигатель прогресса» поэтому я покажу как можно еще работать с командной строкой 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?)
Много раз наблюдал, когда системный администратор для того, чтобы узнать, сколько запросов приходит ему на 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’ов, по которым нужно писать отчеты.