magnify
Home arrow Posts tagged "debian" (Страница 2)
formats

Передача видео с IP-камер D-Link

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

Недавно столкнулся с проблемой получения и передачи потокового видео с IP-камеры D-Link 6620G. Обнаружилось, что эта камера (как и все камеры D-Link, как мне ответил сотрудник на официальном форуме) не отдает видеопоток напрямую ни по UDP, ни по HTTP в чистом виде, что меня очень неприятно удивило. С камерой можно работать только через ActiveX-компонент, т.е. только в IE. Единственное, что можно получить — это текущий кадр через cgi-bin/video.jpg. Но задача как раз была организовать раздачу через Web. Что ж, после некоторых размышлений мне удалось это сделать, организовав следующую схему:

Общая схема

Работать это должно было следующим способом:

  1. С камеры формируется MJPEG-поток, забирая текущий кадр /cgi-bin/video.jpg. Для этого используется детектор Motion. Этот программное решение подкупило меня своей легковесностью, быстротой, а также довольно гибкой функциональностью.
  2. Далее ffmpeg конвертирует MJPEG-поток в flv и отдает flv-поток с помощью ffserver.
  3. В нужную HTML-страничку встраивается FLV-плеер, который и показывает картинку.

Опишу подробнее процесс установки и конфигурирования этого добра на Debian 4.0:

1. Подготовка:
Добавляем в /etc/apt/sources.list репозиторий debian-multimedia

deb http://www.debian-multimedia.org stable main
deb-src http://www.debian-multimedia.org etch main

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

apt-get update
apt-get install motion ffmpeg

2. Конфигурация motion (/etc/motion/motion.conf):
Сам Motion, вообще говоря, это программный детектор движения. У него довольно много интересных настроек и опций. Конфигурирование происходит через файл /etc/motion/motion.conf.

# Включаем демон
daemon on
quiet on

# Указываем URL кадра камеры
# и, если необходимо, логин и пароль
netcam_url http://IP-АДРЕС/cgi-bin/video.jpg
netcam_userpass admin:adminpass
# Надпись слева
text_left Test

# Размер получаемого кадра c камеры
width 704
height 576

# Частота кадров. Иными словами, максимально количество кадров забираемое
# с камеры в секунду
framerate 5
# Качество забираемой картинки
quality 100
# Отключаем автояркость
auto_brightness off

#Различные настройки видео
threshold 4500
noise_level 64

brightness 0
contrast 0
saturation 0
hue 0

# Отключаем использование ffmpeg в реальном времени
ffmpeg_cap_new off

# Директория, где храним снимки и фильмы
target_dir /var/lib/motion/snapshots

# Включаем сервер, транслирующий MJPEG-поток на порту 8081
webcam_port 8081

# Разрешение соединения с MJPEG-потоком
# Если ffmpeg на другом IP, то ставим off. Иначе - on
webcam_localhost off

# Качество выдаваемого MJPEG-потока
webcam_quality 100
# Частота кадров выдаваемого потока
webcam_maxrate 5

# Отключаем запись снимков и видео.
# Можно и включить, кому хочется
output_all off
output_motion off
output_normal off

Проверить наличие MJPEG-потока можно, например, при помощи VLC media player.

3. Конфигурирование ffserver:
Настройка ffserver происходит через файл /etc/ffserver.conf:

# Порт, ка котором будет слушать ffserver и отдавать flv-поток
Port 8080

# Интерфейс привязки ffserver'а (в данном случае - все)
BindAddress 0.0.0.0

# Максимально дозволенное количество клиентов
MaxClients 1000

# Пропускная способность в kbit/sec
MaxBandwidth 100000

# Файл журнала
CustomLog /var/log/ffservser.log
...
# Описываем feed
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 10M
</Feed>
...
# Поток Flash Video
# Описываем его параметры (bitrate, framerate, buffersize и т.д.)
<Stream test.flv>
Feed feed1.ffm
Format flv
VideoCodec flv
#VideoFrameRate 4
VideoSize 4cif
VideoBitRate 2000
#Qscale 2
#VideoBufferSize 256
#VideoQMin 10
#VideoQMax 10
#VideoIntraOnly
PreRoll 0
NoAudio
</Stream>
...
# Можно включить статистику
<Stream stat.html>
Format status
# Only allow local people to get the status
#ACL allow localhost
ACL allow <IP-адрес>
</Stream>
...

4. Скрипты запуска и остановки ffmpeg и ffserver:
Для запуска и остановки ffmpeg и ffserver создаем простые shell-скрипты.
start_ffmpeg.sh:

#!/bin/sh

# Запускаем ffserver
/usr/bin/ffserver;
# Запускаем ffmpeg
/usr/bin/ffmpeg -s 4cif -y -an -r 4 -f mjpeg -i http://127.0.0.1:8081/stream.mjpg http://IP-АДРЕС:8080/feed1.ffm &

stop_ffmpeg.sh:

#!/bin/sh

# Для простоты...8)
killall ffserver;
killall ffmpeg;

5. HTML-код для просмотра:
Смотреть видео мы будем через FLV-плеер, например, Flowplayer.
index.html

<html>
<head>
<title>
Тестовое видео
</title>
<script type="text/javascript" src="swfobject.js"></script>
</head>
</html>
<body>
<div id="mplayer">Movie</div>
<script type="text/javascript">
    var so = new SWFObject('FlowPlayerLight.swf','player','698','600','7');
    so.addVariable("config", "{videoFile: http://IP-АДРЕС:8080/test.flv'', showMenu: false, showFullScreenButton: false, showVolumeSlider: false,
    so.write('mplayer');
</script>
</div>
<body>

FlowPlayerLight.swf можно взять здесь. Библиотеку swfobject.jsздесь.

Можно, конечно, и просто встроить FLV-плеер в HTML-код через Embed и Object.

Очень важное замечание: скорее всего придется поиграться c framerate, bitrate и другими параметрами в ffserver.conf и в скрипте запуска. Мне пришлось долго повозиться, подбирая более менее нормальные значения, поскольку возникали проблемы с проигрыванием потока в FLV-плеере.

6. Теперь все готово к пробному запуску:
Запускаем motion

/etc/init.d/motion start

Запускаем ffserver и ffmpeg

./start_ffmpeg.sh

Открываем в браузере index.html и смотрим, показывается ли изображение с камеры.

В заключение, хочется отметить, что, все-таки, такая схема не является широковещательной. Т.е. каждый подключенный клиент будет «кушать» кусок полосы канала равный битрейту видео. Я пока не разбирался, можно ли организовать таким образом broadcasting или multicasting, поскольку это немного вне моей компетенции…8) Но думаю, что при определенном усилии это можно сделать. Также к недостаткам можно отнести довольно высокий битрейт (сколько я ни пытался, получить видео хотя бы в районе 500 kbit/sec, в нормальном качестве, и приемлемой частотой обновления не получилось).

Ссылки:

  1. http://forum.dlink.ru
  2. http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome
  3. http://ffmpeg.mplayerhq.hu/
  4. http://en.wikipedia.org/wiki/Webcast
  5. http://en.wikipedia.org/wiki/Motion_JPEG
  6. http://www.videolan.org/vlc
  7. http://flowplayer.org
  8. http://blog.deconcept.com/swfobject
 
Просмотров: 28 302 | 8 комментариев  comments 
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
 
Просмотров: 5 102 | Комментариев нет  comments