Замечательная утилита udpxy имеет две особенности, которые необходимо учитывать при использовании в сети оператора.
Во-первых, команды «статус» и «сброс» доступны всем клиентам через веб-браузер.
Во-вторых, при примерно 40 одновременных потоках udpxy начинает тормозить, хотя процессор и сетевой интерфейс практически не заняты.
Небольшое отступление
Как правило, udpxy недоступен в виде двоичного пакета для нужного дистрибутива, поэтому его необходимо компилировать из исходного кода.Засорять рабочую систему необходимыми для сборки пакетами (компиляторами, библиотеками, утилитами) является плохой практикой — увеличивается размер обновлений, усложняются зависимости и т.д. С другой стороны, организация отдельной сборочной фермы усложняет сборку, т.к.
требует синхронизации версий рабочего и сборочного ПО, явного указания некоторых параметров вместо автоматического определения, передачи собранных пакетов и т.п.
Компромиссом для однократной сборки является создание временной среды сборки («песочница», также известной как «песочница») в производственной системе в отдельном каталоге.
В Debian Squeeze для этого достаточно следующих команд:
Чтобы собрать udpxy, вам нужны только gcc и make; для более крупных программ может потребоваться больше пакетов.apt-get install debootstrap mkdir /home/builder debootstrap squeeze /home/builder http://mirror.yandex.ru/debian chroot /home/builder apt-get update chroot /home/builder apt-get -y dist-upgrade chroot /home/builder apt-get -y install gcc make
Сборка и установка
Скачайте архив с исходными текстами и разверните его в песочнице: ver="1.0.23-0"
wget http://downloads.sourceforge.net/project/udpxy/udpxy/Chipmunk-1.0/udpxy.${ver}-prod.tar.gz '
tar xzf ~/udpxy.${ver}-prod.tar.gz -C /home/builder/home/
Изменяем названия команд управления на очень секретные:
cd /home/builder/home/udpxy-${ver}
sed -i.orig -e 's!/restart!/SECRET_restart!' -e 's!/status!/SECRET_status!' statpg.h
sed -i.orig -e 's!"status"!"SECRET_status"!' -e 's!"restart"!"SECRET_restart"!' -e 's!"rtp"!"SECRET_rtp"!' extrn.c
Заходим в песочницу и компилируем:
chroot /home/builder make -C /home/udpxy-${ver}
Создаем псевдопользователя для запуска udpxy и директорию для программы и утилит и переносим в него программу:
useradd --system --shell /bin/true --create-home udpxy
install -o udpxy -g udpxy -m 700 -p /home/builder/home/udpxy-${ver}/udpxy /home/udpxy/
Запуск
Для увеличения рабочего лимита одновременных подключений запустим несколько экземпляров udpxy на разных портах и разбросаем по ним запросы, поступающие на стандартный порт 4022, в зависимости от IP-адреса клиента с помощью iptables=> nat=> PREROUTING=> REDIRECT: #!/bin/bash
# /home/udpxy/start
MAINPORT="4022"
SUBPORTS="16"
SUBMASK="40d"
LOGDIR="/var/log/udpxy"
UDPXY="/home/udpxy/udpxy"
USER="udpxy"
mkdir -p $LOGDIR || { echo "ERROR: cannot create $LOGDIR, aborted."; exit 1; }
id "$USER" > /dev/null 2>&1 || { echo "ERROR: user $USER does not exists, aborted."; exit 1; }
# Run instances and create redirects.
for ((a = 0; a < "$SUBPORTS"; a++)); do
p=`printf "$SUBMASK" "$a"`
iptables -t nat -I PREROUTING -s 0.0.0.0/0.0.0.$a -p tcp -m tcp --dport "$MAINPORT" \
-j REDIRECT --to-ports "$p"
while : ; do
date +"%Y.%m.%d %H:%M:%S -- Started $p"
sudo -u "$USER" "$UDPXY" -T -p $p -c32
date +"%Y.%m.%d %H:%M:%S -- Finished $p"
sleep 30
done >> "$LOGDIR/$p.log" 2>&1 &
done
Пояснения: во-первых, скрипт требует bash, потому что sh не понимает циклы счетчиков.
Во-вторых, нельзя использовать «iptables -A» вместо «-I», потому что правило с «-s 0.0.0.0/0.0.0.0» будет первым и возьмет на себя все соединения.
В-третьих, скрипт продолжает работать в фоновом режиме и автоматически перезапускает прерванные (зависшие?) экземпляры udpxy. По умолчанию udpxy выводит минимальную информацию в файлы журналов /var/log/udpxy/*.
log. Если вам нужно сделать вывод более подробным, добавьте переключатели «-v» и «-S» в строку выполнения «sudo -u.».
Дополнительные ручки, которые имеет смысл крутить: «-B 1Mb» для увеличения входного буфера (в байтах), «-R 10» — одновременного количества сообщений (в штуках) и «-H 5» — максимального периода буферизации данных.
(в секундах)).
Добавить вызов /home/udpxy/start В /etc/rc.local (написание сценариев для /etc/init.d Отложим на другой раз).
Сценарий выхода должен выглядеть примерно так: #!/bin/bash
# /home/udpxy/stop
# Remove firewall rules.
iptables-save \
| grep -- "-p tcp -m tcp --dport 4022 -j REDIRECT --to-ports" \
| sed 's/^-A/iptables -t nat -D/' \
| sh -
# Kill program instances.
pkill -f "/home/udpxy/udpxy"
sleep 5
# Kill wrapper scripts.
pkill -f "/home/udpxy/start"
Посмотреть статус
Общий список подключений ко всем экземплярам udpxy можно просмотреть следующим образом: #!/usr/bin/perl
# /var/www/html/SECRET-udpxy-status.cgi
use strict;
use warnings;
my $port0 = 4000;
my $ports = 16;
my $status_cmd = 'SECRET_status';
my $title = "Сводный статус Udpxy";
my $hostname;
($hostname = $ENV{HTTP_HOST}) =~ s/:\d+$//;
print "Content-type: text/html\n\n" if $ENV{REMOTE_ADDR}; # .
cgi-bin mode?
print << "__HEAD__";
<html>
<head>
<title>$title</title>
</head>
<body>
<div id='bodyCon'>
<h1>$title</h1>
<div id='pgCont'>
<table border='1'>
<tr><th>Port</th><th>Process ID</th><th>Source</th><th>Destination</th><th>Throughput</th></tr>
__HEAD__
my %cnt;
my $total = 0;
my $style_copied;
my $style_passed;
for (my $p = $port0; $p < $port0 + $ports; $p++) {
open F, "wget -q -O - http://localhost:$p/$status_cmd |";
while(<F>) {
if ($style_copied and /<\/style>/) {
$style_copied = 0; # .
style finished
$style_passed = 1;
print;
} elsif (/<style/ and not $style_passed) {
$style_copied = 1; # .
style started
print;
} elsif ($style_copied) { # .
style copy in progress
print;
} elsif (/<td>\d+<\/td><td>\d+\.
\d+\.
\d+\.
\d+:\d+<\/td>/) {
s/<tr([^>]*)>/<tr$1><td>$p<\/td>/; # .
insert first column with port number
($cnt{$p} ||= 0)++;
$total++;
print;
}
}
close F;
}
print "</table><h3>Clients count</h3><table border='1'><tr><th>Port</th>\n";
print "<td><a href=' http://$hostname:$_/$status_cmd '>$_</a></td>\n"
foreach $port0 .
($port0 + $ports - 1);
print "<th>Total</th></tr><tr><th>Count</th>\n";
printf "<td>%s</td>\n", $cnt{$_} || ''
foreach $port0 .
($port0 + $ports - 1);
print "<th>$total</th></tr></table></div></div></body></html>\n";
Возможно, есть более простой способ, но этот оказался самым быстрым.
Вы можете запустить его с любого веб-сервера, поддерживающего CGI-BIN. Debian отлично подходит для этого мини-httpd : apt-get install mini-httpd
echo 'START=1' >> /etc/default/mini-httpd
echo '
port=4020
user=nobody
nochroot
dir=/var/www
data_dir=/var/www/html
cgipat=**.
cgi
logfile=/var/log/mini-httpd.log
pidfile=/var/run/mini-httpd.pid
charset=utf-8
' > /etc/mini-httpd.conf
/etc/init.d/mini-httpd restart
SNMP
Чтобы просмотреть текущее количество подключенных клиентов по SNMP в Cacti/Zabbix/MRTG (максимум на процесс + общее количество), добавьте в /etc/snmp/snmpd.conf: exec udpxy_connections /etc/snmp/udpxy_connections.sh
Фактический скрипт /etc/snmp/udpxy_connections.sh:
#!/bin/sh
A() { netstat -nt |grep ESTABLISHED |grep -v 127.0.0.1: |awk '{print $4;}' |egrep ':40[01][0-9]$'; }
A | wc -l
A | awk -F : '{print $2;}' | sort | uniq -c | sort -nr | head -1 | awk '{print $1;}'
Обследование:
snmpwalk -On -c SecretCommunity -v2c 10.20.30.40 NET-SNMP-EXTEND-MIB::nsExtendObjects
Заключение
К сожалению, не каждую старую сеть (замена дурацких на контроллеры, замена гирлянд на прямые волокна и т.п.), необходимую для нормальной работы IP-TV через мультикаст, можно провести быстро.
Временный вариант с udpxy позволяет запустить службу IPTV, не дожидаясь обновления сети.
Теги: #настройка Linux #iptv #udpxy
-
Повторное Представление Javascript
19 Oct, 24 -
От Идеи До Гаджета. Путь «Самурая» В России
19 Oct, 24 -
Dis И Iota Недоверия К Сайту Eee-Pc.ru/Shop
19 Oct, 24 -
Эргономичные Подлокотники «Эргорест»
19 Oct, 24 -
Revealapp — Firebug Для Приложений Ios
19 Oct, 24