11 июня 2011 г.

Как собрать Linux-роутер. Часть 4


6. Настройка IPTV
  • Cборка и установка igmpproxy
Программа igmpproxy нужна для проксирования IGMP-запросов из Вашей локальной сети в локальную сеть провайдера, а также "пробрасывания" входящих IPTV-потоков в вашу локальную сеть. Перейдем к делу - для начала скачаем исходники igmpproxy, соберем их и установим:
# wget --content-disposition "http://downloads.sourceforge.net/project/igmpproxy/igmpproxy/0.1/igmpproxy-0.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Figmpproxy%2Ffiles%2F&ts=1307785094&use_mirror=mesh"
# tar xzf igmpproxy-0.1.tar.gz
# cd igmpproxy-0.1
# ./configure --prefix=/usr
# make
# make install
Далее нужно создать конфигурационный файл igmpproxy.
# nano /etc/igmpproxy.conf
Синтаксис данного файла ничуть не сложнее, чем те что мы создавали раньше. Вот пример:
quickleave
phyint eth1 upstream ratelimit 0 threshold 1
altnet 192.168.0.0/16

phyint eth0 downstream ratelimit 0 threshold 1
altnet 169.254.0.0/24

phyint ppp0 disabled
phyint wlan0 disabled
Описание параметров:
quickleave - данную опцию следует оставить незакомментированной только в том случае, если предполагается, что в сети может быть только лишь один IPTV-клиент (хотя это не столь важно - просто если Вы оставите эту опцию включенной и два клиента будут смотреть один и тот же канал, а потом один из них переключится, у второго на несколько секунд оборвется трансляция того канала).
phyint eth1 upstream ... - интерфейс upstream, здесь нужно указывать сетевой интерфейс подключенный непосредственно к провайдеру. В нашем случае это eth1.
altnet 192.168.0.0/16 - здесь нужно указать IP либо подсеть IP-адресов с которых ведется вещание IPTV. Эти адреса нужно узнавать непосредственно у провайдера. Разрешается использовать несколько опций altnet с указанием разных подсетей.
phyint eth0 downstream ... - интерфейс downstream, здесь нужно указывать сетевой интерфейс, на котором будут прослушиваться входящие IGMP-запросы на подключение к multicast-группе (в нашем случае это eth0). Параметр altnet тут указывать необязательно, но лучше указать  по причине того, что igmpproxy иногда коряво определяет подсеть заданного интерфейса (и потом банально не пропускает IPTV-потоки). Здесь мы указали 169.254.0.0/24 - подсеть, используемую на нашем сетевом интерфейсе (у Вас она может отличаться в зависимости от того, как Вы настраивали сеть в первичной настройке сети (Часть 1 данного руководства)).
phyint wlan0 disabled - указывает на disabled-интерфейсы, через которые не будет пропускаться multicast запросы (в данном случае это wlan0 и ppp0).
Сохраняем файл и пробуем для проверки запустить igmpproxy.
# igmpproxy -d /etc/igmpproxy.conf
Программа "повиснет" в консоли - это нормально (она не умеет переводить себя в режим демона самостоятельно). В данный момент нам это и нужно для проверки работоспособности IPTV в сети. Попробуйте запустить (НЕ через Wi-Fi) какой нибудь канал. Если канал не воспроизводится, следует обратить внимание на сообщения, которые скорее всего появятся в консоли. Чаще всего появляются сообщения типа "address x.x.x.x for group x.x.x.x is not in any of the valid upstream VIF". Формулировка сообщения может отличаться от этой (по памяти не могу уже вспомнить точно), но последние слова определенно такие же как и тут. Данная ошибка означает, что неверно прописаны (либо не дописаны) адреса вещания IPTV в параметре altnet у upstream-интерфейса. В этом случае нужно обратить внимание, какой IP идет после "address" - это и есть адрес вещания. Но для большей уверенности лучше все же проконсультироваться с провайдером.
Если все работает как положено, можно смело выходить из igmpproxy с помощью Ctrl+C. Далее нужно внести igmpproxy в автозапуск системы. Сделать это можно 2 способами - создав скрипт в init.d либо просто внести команду в /etc/rc.local. Сделаем это вторым способом. Открываем /etc/rc.local и вписываем (перед "exit 0") следующее:
/usr/sbin/igmpproxy /etc/igmpproxy.conf >/dev/null 2>/dev/null &
Сохраняемся, выходим.
  • Настройка udpxy
IPTV по проводной сети мы организовали. Пора организовать IPTV по Wi-Fi (если это необходимо, если нет - можете смело пропускать этот пункт). Вы можете спросить - зачем устанавливать какой-то udpxy для IPTV, если можно воспользоваться уже установленным и работающим igmpproxy? Вполне уместный вопрос, но опыт показывает что мультикаст и wi-fi вещи хоть и совместимые, но зачастую некачественно работающие в паре (вследствие использования UDP-протокола, который не гарантирует доставку всех пакетов к месту назначения, а wi-fi работает по воздуху, где потери пакетов могут быть значительными из-за различных факторов). Для обхода этой проблемы будем использовать передачу IPTV-потоков используя TCP-протокол. Итак, скачаем и установим последний udpxy:
# wget --content-disposition "http://downloads.sourceforge.net/project/udpxy/udpxy/Chipmunk-1.0/udpxy.1.0-Chipmunk-19.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fudpxy%2Ffiles%2Fudpxy%2FChipmunk-1.0%2F&ts=1307799837&use_mirror=ovh"
# tar xzf udpxy*
# cd udpxy*
# make lean && make install
Настройка этой программы еще более проста, нежели предыдущих - потому что она осуществляется уже при запуске в командной строке. Для автозапуска программы при старте системы пропишем уже в знакомый /etc/rc.local строку:
/usr/local/bin/udpxy -m eth1 -p 8055 -a wlan0
Параметр "-m" указывает на сетевой интерфейс подключенный к провайдеру (eth1), "-p" на порт прослушивания соединений (8055), "-a" на сетевой интерфейс на котором будут прослушиваться входящие соединения - wlan0 (последний можно не указывать - в этом случае при наличии "белого" IP можно будет получать доступ к вашему IPTV извне, но я все же рекомендую указывать этот параметр).
Сохраняем файл, выходим, перезагружаемся.
Проверить работоспособность прокси можно, попытавшись зайти в браузере по адресу http://x.x.x.x:8055/status где x.x.x.x - IP-адрес Wi-Fi интерфейса на сервере. Если все верно, Вы увидите простенькую страницу отображающую служебную информацию о прокси со списком подключенных в данный момент к ней клиентов. Ну и наконец самое главное, как все же смотреть IPTV по Wi-Fi с использованием udpxy? Вариантов решения тут 2 и каждый вправе выбрать тот, который ему больше по душе, а именно:
1) запустить на сервере HTTP-сервер с небольшим php-скриптом, который будет на лету получать плейлист IPTV от провайдера и на лету уже отдавать готовый сконвертированный плейлист в плеер - этот способ немного сложнее в реализации, но тогда Вы всегда будете использовать актуальный плейлист каналов.
2) скачать плейлист вручную и отредактировать его блокнотом заменив все определенные строки по шаблону на тот, который позволить использовать udpxy; после этого разумеется новый плейлист нужно будет сохранить. Этот способ намного проще, но в этом случае плейлист всегда будет таким, которым Вы его сохранили в последний раз.
Я рассмотрю первый способ так как он более сложный в реализации, но более эффективный.
Итак, нам понадобится HTTP-сервер и PHP. Для этого установим:
# apt-get install apache2 php5 libapache2-mod-php5 php5-curl
Далее создадим PHP-cкрипт следующего содержания (команда "nano /var/www/iptv.php"):
<?php
$url = 'http://'; // здесь в кавычках пропишите адрес m3u-плейлиста провайдера
$c = curl_init($url);
curl_setopt($c,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
curl_setopt($c,CURLOPT_RETURNTRANSFER,1);
$m3u = curl_exec($c);
curl_close($c);
$m3u = str_replace('udp://@','http://x.x.x.x:8055/udp/', $m3u); // здесь замените x.x.x.x на IP-адрес Wi-Fi интерфейса
header('Content-type: audio/x-mpegurl; charset=UTF-8');
echo $m3u;
?>
Изменяем 2 строки, согласно комментариям после них. Сохраняем файл. Теперь можно смело заходить в плеер (например VLC) и использовать следующий адрес плейлиста - "http://x.x.x.x/iptv.php" (x.x.x.x заменить на адрес Wi-Fi интерфейса).

10 июня 2011 г.

Как собрать Linux-роутер. Часть 3

5. Настройка "раздачи" интернета в сети
  • Настройка точки доступа Wi-Fi 
Для начала установим GIT и некоторые пакеты необходимые для сборки программы точки доступа hostapd. GIT будет нужен нам для того, чтобы скачать самые свежие исходники hostapd - собственно программы точки доступа и шифрования wi-fi трафика. Приступим:
# apt-get install git libnl-dev
Далее приступим к закачке исходников hostapd.
# git clone git://w1.fi/srv/git/hostap.git
Если все выполнилось успешно, перейдем к правке конфигурационного файла сборки hostapd.
# cd hostap/hostapd
# cp defconfig .config
# nano .config
Здесь нужно обратить внимание на строку "CONFIG_DRIVER_NL80211=y". Важно, чтобы перед ней небыло знака "#". Убедившись в этом, можно приступать к сборке hostapd.
# make
# make install
Если нет никаких ошибок при сборке и установке - можно приступать к настройке ТД.
Для начала нужно создать конфигурационный файл hostapd:
# mkdir /etc/hostapd
# nano /etc/hostapd/hostapd.conf
Файл имеет довольно простой синтаксис, но обильное количество настроек. Всех их указывать абсолютно необязательно, для базовой настройки нужно указать лишь основные. Итак, приступим:
interface=wlan0
driver=nl80211
ssid=test
country_code=UA
ieee80211d=1
hw_mode=g
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
wmm_enabled=1
wpa=3
wpa_passphrase=123456789
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=TKIP CCMP
channel=9
eapol_version=1
interface=wlan0 - опция говорит сама за себя - тут указывается интерфейс wi-fi (wlan0). 99.99%, что у вас он будет таким же (может быть не таким только в случае 2 и более подключенных wifi-адаптеров).
driver=nl80211 - драйвер используемый для работы с wi-fi адаптером. Его надо оставить таким же как и тут.
ssid=test - данная строка указывает имя нашей беспроводной сети. В данном случае именем будет test. Именно это имя будет отображаться при поиске сетей с wi-fi клиентов. Здесь можно прописать абсолютно любое имя, какое Вы хотите.
hw_mode=g - указывает на использование режима G для wi-fi адаптера. Данный режим позволяет достичь максимальных скоростей, потому рекомендую эту строку оставить такой же.
wmm_enabled=1 - Wireless Multimedia Managenent - подробнее тут.
wpa=3 - указывает на использование комбинированного шифрования wifi-трафика (как WPA, так и WPA2).
wpa_passphrase=123456789 - здесь указывается пароль для подключения к Вашей wi-fi сети. Подойдите к выбору пароля внимательно. Рекомендую использовать комбинацию букв и цифр одновременно, а также чтобы длина пароля не была менее 9 символов.
channel=9 - канал частот, на котором будет работать ТД. Здесь можно вводить любое значение в пределах от 1 до 11.
Остальные строки можно оставлять такими же как и данном примере. Сохраняем файл, выходим.
Далее нам нужно настроить автозапуск hostapd при старте системы.
# nano /etc/default/hostapd
Впишем туда следующую строку:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Думаю, данная строка не требует объяснений :-). Далее выполним следующее:
# wget -O /etc/init.d/hostapd http://pastebin.com/raw.php?i=ev7qrnKS
# chmod +x /etc/init.d/hostapd
# update-rc.d hostapd defaults
Данный набор команд установит скрипт запуска, а также добавит его в автозапуск системы. Если все выполнено верно - идем на перезагрузку. По идее после запуска системы с wi-fi клиентов должна уже быть видна наша точка доступа.
  • Настройка DHCP-сервера
Дабы не утруждать себя прописыванием IP-адресов и прочих сетевых параметров на каждой машине, которая будет получать интернет от нашего сервера, нужно установить и настроить DHCP-сервер, что мы сейчас и сделаем. 
# apt-get install dnsmasq
DNSMasq, который мы только что установили является DHCP-сервером и кеширующим DNS-сервером одновременно. Он очень прост в настройке и вся его конфигурация содержится всего лишь в одном файле, а именно /etc/dnsmasq.conf. В этом файле уже будет базовая конфигурация сервера, но в таком объеме и с таким количеством комментариев она нам не нужна, потому можете смело удалять файл (команда "rm /etc/dnsmasq.conf") и создать новый со следующим содержанием (попутно изменяя некоторые значения параметров на свои):
domain-needed
server=8.8.8.8
server=8.8.4.4
strict-order
interface=wlan0
interface=eth0
bind-interfaces
dhcp-range=wlan0,169.254.1.2,169.254.1.12,24h
dhcp-range=eth0,169.254.0.1,169.254.0.12,24h
2 параметра "server" указывают на использование в качестве upstream-серверов DNS гугловские (помимо основных серверов от провайдера). Параметры "interface" указывают на каких сетевых интерфейсах нужно вести "прослушивание" dhcp-запросов - здесь нужно указать Ваш интерфейс wi-fi (wlan0) и сетевой карты, подключенной к свичу (в данном случае eth0). Параметр bind-interfaces указывает, что прослушивание нужно вести ТОЛЬКО на указанных выше сетевых интерфейсах. Указание данной опции необходимо для того, чтобы Ваш DHCP-сервер не работал в локальную сеть провайдера, выдавая не те адреса клиентам. И наконец параметры dhcp-range - они указывают на то, какие нужно использовать диапазоны IP-адресов для выдачи клиентам на соответствующих сетевых интерфейсах. Здесь важно не попутать подсети используемые на сетевых интерфейсах.
Сохраняем, выходи. Выполняем перезапуск dnsmasq:
# service dnsmasq restart
Если все настроено верно - при перезапуске не будет сообщений об ошибке и Вы уже сможете получать адреса по DHCP от Вашего сервера, подключившись к нему по Wi-Fi либо по проводам от свича.
  • "Расшаривание" интернета в сеть
Настроив DHCP-сервер, Вы сможете получить адрес от сервера, а также будете иметь полный доступ к другим машинам подключенным к серверу либо проводами, либо по воздуху. Но интернета в сети не будет. Для того, чтобы он появился, нужно настроить IP форвардинг, а также настроить фаервол на пропуск трафика. Делается это довольно просто. Итак, приступим:
# nano /etc/sysctl.conf
Данный файл содержит в себе значения довольно таки важных переменных системы, в том числе и переменную включения IP-форвардинга. Находим строки "net.ipv4.ip_forward=1" и "net.ipv4.tcp_syncookies=1" и раскомментируем их. Этого хватит, чтобы включить форвардинг, но в дальнейшем мы еще будем настраивать раздачу IPTV в нашей сети, и чтобы 2 раза не лезть в этот файл сразу же впишем в конец следующие строки для того, чтобы ядро не блокировало IPTV-трафик:
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
Далее настроим фаервол на пропуск трафика. Сделаем следующее:
# wget -O /etc/iptables.conf http://pastebin.com/raw.php?i=Ga1kK3k8
Если Вы настраивали локальную сеть с адресами 169.254.*.* то вносить изменения в файл /etc/iptables.conf Вам не нужно. Если же настраивали с другими адресами то его нужно подправить изменив в нем сети 169.254.0.0/24 и 169.254.1.0/24 на свои (например если у вас IP проводной сетевой карты 10.1.0.1, а wi-fi 10.1.1.1, то адреса подсетей будут соответственно 10.1.0.0/24 и 10.1.1.0/24 - это запись в CIDR-формате). Далее нужно внести применение этих правил при запуске системы:
# nano /etc/rc.local
Данный файл отвечает за запуск любых прописанных в нем команд во время последней стадии загрузки системы. Все команды необходимо вписывать ПЕРЕД "exit 0". Саму строку "exit 0" трогать не нужно. Впишем туда следующее:
/sbin/iptables-restore </etc/iptables.conf
Сохраним и выйдем. Далее перезагружаемся. Если все выполнено верно, после запуска системы Вы уже получите полноценный интернет-шлюз, раздающий интернет по зашифрованному wi-fi, а также проводной сети 

9 июня 2011 г.

Как собрать Linux-роутер. Часть 2

  • Вторичная настройка сети
После перезагрузки можно приступать к настройке PPPoE-соединения. Для начала проверим записи в /etc/apt/sources.list:
# nano /etc/apt/sources.list  
Пока у нас нет интернета, нужно отключить интернет-репозитории пакетов. Для этого нужно закомментировать строки (добавив в самом начале строки символ "#"), начинающиеся с "deb http://". Пример такой строки (уже закомментированной):
#deb http://security.debian.org/ squeeze/updates main non-free contrib
Закомментировать нужно абсолютно все такие строки. Раскомментированной нужно только оставить строку, начинающуюся с "deb cdrom:" (чаще всего она идет самой первой). Сохраняем файл, выходим. Далее нужно вставить установочный диск с системой в привод. После этого выполним:
# apt-get update
Если никаких ошибок не возникло, затем:
# apt-get install ppp
Немного теории: apt-get - это менеджер пакетов программ в системе Debian/Ubuntu. В дальнейшем эта команда будет использоваться довольно часто. Любая операция по установке пакета выполняется посредством команды "apt-get install имя_пакета"; любая операция по полному удалению пакета (включая конфигурационные файлы): "apt-get purge имя_пакета"; операция обновления списков последних версий пакетов доступных в репозиториях - "apt-get update" (ее мы и выполнили выше); операция обновления всех существующих пакетов в системе - "apt-get upgrade"; операция обновления дистрибутива системы - "apt-get dist-upgrade".
ppp - пакет необходимый для поддержки системой PPP-соединений.
Приступим к конфигурации соединения PPPoE.
Создадим файл /etc/ppp/peers/internet:
# nano /etc/ppp/peers/internet 
Файл должен быть примерно следующего содержания:
nodeflate
debug
noipdefault
defaultroute
replacedefaultroute
noauth
persist holdoff 5
maxfail 0
logfile "/var/log/pppoe.log"
plugin rp-pppoe.so eth1
user dj_inox
Все строки нужно оставить такими же, кроме последних двух. На них и обратим внимание:
plugin rp-pppoe.so eth1 - здесь нужно лишь поменять eth1 на сетевой интерфейс подключенный непосредственно к провайдеру (его мы настраивали в первой части, возможно он у вас тоже eth1).
user login - здесь нужно заменить login на ваш логин, который используется для подключения к PPPoE.
Сохраняем данный файл, выходим.
Далее нам нужно прописать пароль для подключения к интернету:
# nano /etc/ppp/chap-secrets
Синтаксис файла очень прост. Данные вписываются следующим образом: "логин" * "пароль". В итоге строка, которую надо вписать выглядит примерно так:
"login" * "password" 
Сохраняем, выходим. Далее:
# nano /etc/ppp/pap-secrets
Вписываем в конец абсолютно такую же строку, какую вписывали в предыдущий файл.
Теперь нужно настроить "автоподнятие" PPPoE-соединения при запуске системы. Снова редактируем файл /etc/network/interfaces (команда думаю уже и так понятна :-)). Вписать туда нужно следующее:
auto internet
iface internet inet ppp
pre-up /sbin/ifconfig eth1 up
provider internet
Здесь (если нужно) eth1 меняется на интерфейс подключенный к интернету. Сохраняемся, выходим, перезагружаемся. Если все сделано правильно - по команде "ifconfig ppp0" мы получим информацию по нашему уже интернет-соединению PPPoE.
  • Настройка Wi-Fi
Приступим к настройке Wi-Fi. Для начала установим необходимые пакеты для сборки. Для этого сначала надо подключить интернет-репозитории пакетов. Выполняем:
# nano /etc/apt/sources.list 
Сейчас надо выполнить задачу обратную той, что мы делали в предыдущем пункте. Нужно закомментировать строку с "deb cdrom:" и раскомментировать строки с "deb http://". После данных манипуляций файл должен выглядеть примерно так (можете даже просто скопировать содержимое):
#deb cdrom:[Debian GNU/Linux 6.0.0 _Squeeze_ - Official i386 CD Binary-1 201102$
deb http://security.debian.org/ squeeze/updates main non-free contrib
deb http://debian.org.ua/debian squeeze main non-free contrib
deb http://www.debian-multimedia.org squeeze main non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free
Сохраняем, выходим, выполняем "apt-get update". Списки пакетов обновятся через интернет. Далее рекомендую выполнить обновление всех пакетов системы:
# apt-get upgrade
Затем установим необходимые пакеты для сборки драйверов wifi:
# apt-get install build-essential linux-headers-2.6.32-5-amd64 bzip2
Если у вас 32бит система, "amd64" в данной команде замените на "686".
Далее выполним сборку и установку драйверов compat-wireless. В нашем случае используется PCI Wi-Fi карта D-Link DWL G550. У нее чип Atheros AR5001X+. Для нее нужен драйвер ath5k, который идет в составе compat-wireless. Какая Wi-Fi карта у вас, можно определить посредством команды "lspci | grep -i wireless" (если она PCI). Если адаптер USB, то команда "lsusb". Насчет второго, если выяснять какой в нем чип, лучше на сайте http://wireless.kernel.org. Да и вообще данный сайт располагает наиболее полной информацией о том, что поддерживают разные Wi-Fi адаптеры в ОС Linux. Его я рекомендую к просмотру перед покупкой самого адаптера, т.к. далеко не все драйвера (а часто и сами адаптеры) поддерживают режим точки доступа. А нам в дальнейшей настройке он будет необходим.
Скачиваем compat-wireless, распаковываем и устанавливаем:
# wget http://orbit-lab.org/kernel/compat-wireless-2.6/compat-wireless-2.6.tar.bz2
# tar xjf compat-wireless-2.6.tar.bz2
# cd compat-wireless*
# scripts/driver-select ath5k
# make
# make install
Последовательность данных команд соберет и установит драйвера в систему. Далее заходим в уже известный нам файл /etc/network/interfaces и вписываем туда следующее:
auto wlan0
iface wlan0 inet static
address 169.254.1.1
netmask 255.255.255.0
Данный набор строк нам уже знаком по настройке проводной сетевой карты, подключенной к свичу. Разница лишь в том, что IP здесь должен быть обязательно другим и обязательно из другой подсети. Сохраняем, выходим, перезагружаемся. После перезагрузки по команде "ifconfig wlan0" можно проверить "поднялся" ли интерфейс Wi-Fi. Если это так, то Вы увидите уже знакомые строки inet addr, Bcast, Mask.