Я не нашел в данном пакете встроенного механизма авторизации для просмотра потока в браузере через интернет. Из-за этого сервис будет постоянно доступен для всех. Доступ конечно можно ограничить через нужный IP адрес правилами в iptables, но это неудобно, т.к. IP адрес может быть динамическим, к примеру, интернет на смартфоне.
В таком случае, сделаем авторизацию через Apache+IPTables.
Предположим, что в системе уже установлены пакеты Motion, Apache и IPTatables. Есть сайт доступный в интернете mysite.ru
Физически на диске он расположен:
#/home/www/mysite.ru/cgi-bin
#/home/www/mysite.ru/www
Нам нужно создать файл webcam.cgi, положить в папку /home/www/mysite.ru/cgi-bin и назначить на него права доступа 775:
#touch /home/www/mysite.ru/cgi-bin/webcam.cgi
#chmod 755 /home/www/mysite.ru/cgi-bin/webcam.cgi
Содержимое файла webcam.cgi:
#!/usr/bin/perl
$ENV{PATH} = "/usr/bin";
print "Content-type: text/html nn";
print <<HTML;
<html>
<head>
<title> Веб - камера </title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<center>
<img src="http://mysite.ru:8081">
</center>
</body>
</html>
HTML
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то этот файл будет транслировать поток, который отдает motion на порту 8081.
Далее создаем файл паролей для авторизации через apache, выполняем:
#htpasswd -cb /home/www/mysite.ru/.htpasswd user parol
Далее создаем файл .htaccess в /home/www/mysite.ru/cgi-bin:
#touch /home/www/mysite.ru/cgi-bin/.htaccess
Содержимое файла .htaccess:
AuthType Basic
AuthName "Monitor MySite.Ru"
AuthUserFile /www/mysite.ru/.htpasswd
require valid-user
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то появится панель авторизации для ввода логина и пароля.
Всё это хорошо, логин с паролем уже есть, но поток всё еще можно видеть по прямому адресу mysite.ru:8081 минуя страницу файла вызова webcam.cgi
Вот теперь самое интересное.
Создаем файл webcam_ipt.cgi и кладем в папку /home/www/mysite.ru/
#touch /home/www/mysite.ru/webcam_ipt.cgi
#chmod 755 /home/www/mysite.ru/webcam_ipt.cgi
Содержимое файла webcam_ipt.cgi:
#!/usr/bin/perl
$ENV{PATH} = "/usr/bin";
foreach $arg_ip (@ARGV){
if ($arg_ip =~ /^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/){
$arg_ip =~ /(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/;
$ip_on = "$1.$2.$3.$4";
system("/sbin/iptables -A Motion-Port-INPUT -p tcp -m state -m tcp -s $ip_on --dport 8081 --state NEW -j ACCEPT");
}
}
Далее нам необходимо, чтобы файл webcam_ipt.cgi выполнялся при выполнении webcam.cgi.
Приводим файл webcam.cgi к виду:
#!/usr/bin/perl
$ENV{PATH} = "/usr/bin";
$ip_for_ipt = "$ENV{'REMOTE_ADDR'}";
system("/home/www/mysite.ru/webcam_ipt.cgi $ip_for_ipt");
print "Content-type: text/html nn";
print <<HTML;
<html>
<head>
<title> Веб - камера </title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<center>
<img src="http://mysite.ru:8081">
</center>
</body>
</html>
HTML
Мы уже стали ближе к цели, но работать не будет, необходимо следующее. Чтобы запускать perl скрипты из ВЕБ от имени root, необходимо установить пакет:
#yum install perl-suidperl
Файлам, которые необходимо запускать нужно, установить UID при выполнении chmod 4755 file.cgi
Т.е. чтобы наш файл webcam_ipt.cgi запускался от имени root выполняем:
#chmod 4755 /home/www/mysite.ru/webcam_ipt.cgi
Попытаюсь описать на пальцах, как это работает.
Заходим в браузер, вводим mysite.ru/cgi-bin/webcam.cgi, появляется запрос авторизации apache, вводим логин и пароль, если авторизация пройдена в скрипте webcam.cgi выполняется:
$ip_for_ipt = "$ENV{'REMOTE_ADDR'}"; # получение IP адреса
system("/home/www/mysite.ru/webcam_ipt.cgi $ip_for_ipt"); # выполнение скрипта webcam_ipt.cgi которому на вход подан IP адрес
Далее выполняется файл webcam_ipt.cgi, в нем полученный IP адрес подставляется в команду iptables, которая открывает порт 8081 для полученного IP адреса.
Правило создано, порт открыт, и файл webcam.cgi начинает гнать поток видео с mysite.ru:8081
Теперь нужно позаботиться о том, чтобы порт закрылся. Делаем это просто и кардинально, добавляем в файл crontab запись * * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null
#echo "* * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null" >> /etc/crontab
Результат выполнения будет таков, что команда iptables будет очищать все правила таблицы в цепочке Motion-Port-INPUT и порт 8081 через минуту будет закрыт.
Содержимое файла c расположением цепочек и правил в них /etc/sysconfig/iptables:
*filter
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:Motion-Port-INPUT - [0:0]
:RH-Firewall-1-INPUT - [0:0]
:OUTPUT ACCEPT [0:0]
### Цепочка Motion-Port-INPUT
-A INPUT -j Motion-Port-INPUT
###
### Цепочка RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp -m state --dport 21 --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp -m state --dport 22 --state NEW -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 80 --state NEW -j ACCEPT
-A INPUT -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -j REJECT
###
COMMIT
Автор: SergeyShibka