magnify
Home arrow Posts tagged "apache"
formats

Использование connlimit

Опубликовано: 21.05.2008 Автор: в

В этой статье я опишу процесс установки модуля IPTables — connlimit. Для чего же он нужен? В последнее время начинает остро вставать проблема (D)DOS-атак на сервера. К сожалению, эта проблема и не минула один из веб-серверов, находящихся под моим контролем. Внезапно стал «падать» Apache. Пронаблюдав один из таких моментов с помощью netstat -an | sort -k 5, я обнаружил ненормальное количество открытых соединений на 80 порт с некоторых IP-адресов (очевидно, зомби-машин), что и приводило к непомерному увеличению нагрузки и, затем, отказу веб-сервера.

Поэтому было принято решение ограничить количество одновременных ограничений с одного IP-адреса. Поскольку на сервере установлен дистрибутив Debian 4.0, то, соответственно буду описывать действия, производимые именно для этой системы. Я реализовал данное ограничение с помощью модуля IPTables — connlimit, который собрал без перекомпиляции(переустановки) ядра.

1. Подготовка:

# Ставим исходники ядра
apt-get install linux-source-2.6.18 dpkg-dev
cd /usr/src/
# Распаковываем ядро
tar --use-compress-program bzip2 -xvf linux-source-2.6.18.tar.bz2
# Делаем симлинк на ядро (чтобы было проще потом)
ln -s /usr/src/linux-source-2.6.18 /usr/src/linux
# Копируем для совместимости
cp /boot/config-2.6.18-4-686 /usr/src/linux/.config
# Берем исходники IPTables и копируем их в /usr/src/iptables
cd /tmp
apt-get source iptables
cp -r /tmp/iptables-1.3.6.0debian1/iptables/ usr/src

2. Редактируем файл /usr/src/linux/Makefile, чтобы в начале файла было

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
EXTRAVERSION = -12etch2
NAME=Avast! A bilge rat!

3. Установка и запуск patch-o-matic

# Скачиваем и распаковываем patch-o-matic
wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20070401.tar.bz2
tar --use-compress-program bzip2 -xvf patch-o-matic-ng-20070401.tar.bz2
# Запускаем патч
cd patch-o-matic-ng-20070401
./runme --download connlimit
# На вопрос установки патча отвечаем 'y'

4. Конфигурируем ядро

cd /usr/src/linux
make menuconfig
# Идем в Networking  --- Networking options  ---  Network packet filtering (replaces ipchains)  --- IP: Netfilter Configuration
# Ставим M возле Connections/IP limit match support
# Выходим, не забыв сохранить конфиг

5. Собираем ядро

# Трюк с прерыванием сборки и запуском make M=net/ipv4/netfilter/ у меня не сработал,
# поэтому я подождал полной сборки, благо никуда не спешил..8)
make

6. Пробуем подключить модуль

cp /usr/src/linux/net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-4-686/kernel/net/ipv4/netfilter/
depmod -a
insmod ipt_connlimit.ko

Если ошибок не возникло, то радуемся и начинаем ограничивать количество одновременный соединений. Для этого необходимо добавить одно правило IPTables (куда — зависит от вашей текущей конфигурации):

# Ставим ограничение на 5 соединений на 80 порт.
-A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT

Замечу, что после включения этого правила, нагрузка на Apache сильно снизилась и он перестал «падать». Не уверен, что этот метод поможет от массированной DDOS-атаки, но с отдельными злодеями справится замечательно. Кстати, ничто не мешает таким образом ограничивать соединения на другие порты, например на 25. В случае других дистрибутивов, установка в общих чертах происходит таким же образом.

Ссылки:

  1. http://www.netfilter.org/projects/patch-o-matic/index.html
  2. http://www.opennet.ru/base/net/connlimit_fedora.txt.html
 
Просмотров: 4 948 | Комментариев нет  comments 
formats

Потоковое Flash-Video + ClipShare

Опубликовано: 16.05.2008 Автор: в

Один из моих недавних проектов был посвящен проблеме передачи потокового flash-видео.На сайте был установлен ClipShare (кто не знает — это клон популярного видеосервиса YouTube). Необходимо было исправить проблему загрузки файлов и настроить потоковую раздачу через HTTP загруженных видеороликов.

Объясню вкратце, что такое такое «потоковая» раздача flash-видео (HTTP flv streaming). Вообще говоря, передача видеороликов возможна несколькими способами:

  • Как обычный flv-файл, через flash-плеер браузера. При такой передаче файл кэшируется.
  • Как вложение в swf-файле. В этом случае, файл должен быть полностью загружен до начала проигрывания.
  • Прогрессивная загрузка по HTTP (Progressive download via HTTP). К преимуществам этого метода можно отнести буферизацию, использование обычных веб-серверов, возможность использовать один SWF-плеер для проигрывания различных роликов.Передача потока flash-video возможно только при наличии специальных метаданных в файле, описывающих стартовые позиции каждого ключевого кадра видео. Благодаря этому, Flash-плеер может запрашивать и получать любую часть видео до того как буферизация закончится. Другими словами, «перемотка» видеролика возможна без томительного ожидания закачки файла, что согласитесь, очень удобно. Вы наверняка замечали это при просмотре роликов на YouTube.
  • Поток RMTP. Реальная потоковая раздача, используя специализированные серверы, например Flash Media Server, Red5.

Так вот задача была как раз была реализовать 3-ий способ.

К тому же, непонятно почему файлы не загружались на сервер.

Проблема загрузки фалов решилась следующим способом:

Запустив ‘/usr/bin/php /path/to/public_html/convert.php test.mpeg test /path/to/public_html/video/test.mpeg‘, я обнаружил, что mencoder, как раз использующийся для конвертации видеофайла не знает ничего про параметр -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames, что и указало на причину проблемы. Новые версии mencoder больше не поддерживают эту опцию. После того, как я убрал всякие вхождения этого параметра в php-файлах ClipShare (convert.php и upload.php) и заменил еще одну опцию -vop на -vf (чтобы сильно не ругался), аплоад заработал на ура.

Теперь про псевдо-потоковую раздачу видео. На стороне сервера, самым простым способом, является установка веб-сервера lighttpd. Все что нужно, это наличие такого куска в конфигурационном файле lighttpd:

server.modules = ( 
  ...,
  "mod_secdownload", ## optional
  "mod_flv_streaming",
  ...
)
flv-streaming.extensions = ( ".flv" )

К сожалению, в случае ClipShare,модуль загрузки файлов (Uber-Uploader, кстати) вместо отображения текущего процесса загрузки выплевывает ‘Failed To Find Flength File, но файл все-таки загружает. Поэтому я пошел другим путем и решил поставить модуль раздачи flash-видео mod_flvx. Для установки необходимо скачать сам модуль, запустить ‘apxs -i -a -c mod_flvx.c‘ и добавить директиву ‘AddHandler flv-stream .flv‘ в конфиг апача.

Принцип работы этих модулей довольно прост. Они лишь добавляют необходимый заголовок Content-Type и парсят запрос GET а наличие праметра start.Если этот параметр задан, то модуль сначала выдает FLV-заголовок, а затем начинает передавать файл с нужной позиции, заданной этим параметром.

Я уже отметил, что для использования возможности «перемотки» без полной буферизации необходимо наличие определенных метаданных в видеофайле. Для этого используется небольшая, но очень полезная утилитка flvtool2. Для обновления файла необходимо лишь запустить ‘flvtool2 -UP <файл>.flv‘ и после этого файл готов к HTTP-раздаче. В ClipShare при загрузке видеоролика эта утилита запускается, поэтому дополнительных телодвижений производить не надо.

Проделав необходимые манипуляции, и запустив Apachе, я столкнулся с еще одной неприятной проблемой, а именно «корявостью» интегрированного в ClipShare flash-плеера Agriya. «Перемотка» отказывалась работать.

Пришлось интегрировать другой плеер — JW FLV Media Player. Для ClipShare это было сделано следующим образом:

В файле templates/view_video.tpl заменить (не забыв, конечно скачать сам плеер)

<script type="text/javascript">
   var so1 = new SWFObject("/FLVplayer/flvplayer.swf", "flvplayer", "559", "444", "7",  null, true);
   so1.addParam("allowFullScreen", "true");
   so1.addParam("wmode", "transparent");
   so1.addParam("allowSciptAccess", "always");
   so1.addVariable("themes", "/FLVplayer/themes.xml");
   so1.addVariable("config", "/FLVplayer/playerXml.php?flv={$vinfo[0].flvdoname}");
   so1.write("playerDiv");
</script>

на

<script type="text/javascript">
   var so1 = new SWFObject("/FLVplayer/mediaplayer.swf", "flvplayer", "559", "444", "7",  null, true);
   so1.addParam("allowFullScreen", "true");
   so1.addParam("wmode", "transparent");
   so1.addParam("allowSciptAccess", "always");
   so1.addVariable('autostart','true');
   so1.addVariable('file','/flvideo/{$vinfo[0].flvdoname}');
   so1.addVariable('streamscript','lighttpd');
   so1.write("playerDiv");
</script>

Можно, и даже, наверное, нужно генерировать плейлист на лету через PHP, но я с этим играться не стал, поскольку надо было получить просто работающий вариант.

После этого потоковая раздача+»перемотка» заработали на ура.

Ссылки:

  1. http://en.wikipedia.org/wiki/Flash_Video
  2. http://blog.lighttpd.net/articles/2006/03/09/flv-streaming-with-lighttpd
  3. http://inlet-media.de/flvtool2
  4. http://www.jeroenwijering.com/?item=JW_FLV_Player
  5. http://journal.paul.querna.org/articles/2006/07/11/mod_flvx/
  6. http://apachedev.ru/2006/07/13/mod_flvx-peredacha-potokovogo-flash-video/
 
Просмотров: 7 787 | 6 комментариев  comments