22 июля 2011 г.

Network interfaces traffic collector (Python)


Данный скрипт написан на Python и использует базу SQLite для сохранения данных по трафику. Рекомендуется скрипт поместить в крон на выполнение каждую минуту.
#!/usr/bin/python

import sqlite3, time, math
from datetime import date, timedelta

conn = sqlite3.connect("/opt/netstat_db.s3db")
res = conn.execute("select * from interfaces")
for row in res:
        now_tx = open('/sys/class/net/' + row[1] + '/statistics/tx_bytes').read()
        now_rx = open('/sys/class/net/' + row[1] + '/statistics/rx_bytes').read()
        cur_day = time.strftime("%d")
        cur_mon = time.strftime("%m")
        cur_year = time.strftime("%Y")
        data = conn.execute("select count(*) from stats where iface_id=? and day=? and month=? and year=?", (row[0],cur_day,cur_mon,cur_year))
        rows = data.fetchone()[0]
        if(rows > 0):
                data = conn.execute("select tx_bytes,rx_bytes from stats where iface_id=? and day=? and month=? and year=?", (row[0],cur_day,cur_mon,cur_year))
                entry = data.fetchone()
                prev_tx = entry[0]
                prev_rx = entry[1]
                razn_tx = int(now_tx) - prev_tx
                razn_rx = int(now_rx) - prev_rx
                if(razn_tx < 0):
                        mnozh = math.ceil(math.fabs(razn_tx) / math.pow(2,32))
                        razn_tx = ((math.pow(2,32)*mnozh) - prev_tx) + int(now_tx)
                if(razn_rx < 0):
                        mnozh = math.ceil(math.fabs(razn_rx) / math.pow(2,32))
                        razn_tx = ((math.pow(2,32)*mnozh) - prev_rx) + int(now_rx)
                conn.execute("update stats set tx_bytes=tx_bytes+?, rx_bytes=rx_bytes+? where iface_id=? and day=? and month=? and year=?", (razn_tx,razn_rx,row[0],cur_day,cur_mon,cur_year))
                conn.commit()
        else:
                v4era = date.today() - timedelta(1)
                prev_day = v4era.strftime("%d")
                prev_mon = v4era.strftime("%m")
                prev_year = v4era.strftime("%Y")
                data = conn.execute("select count(*) from stats where iface_id=? and day=? and month=? and year=?", (row[0],prev_day,prev_mon,prev_year))
                rows = data.fetchone()[0]
                if(rows > 0):
                        data = conn.execute("select tx_bytes,rx_bytes from stats where iface_id=? and day=? and month=? and year=?", (row[0],prev_day,prev_mon,prev_year))
                        entry = data.fetchone()
                        prev_tx = entry[0]
                        prev_rx = entry[1]
                        razn_tx = int(now_tx) - prev_tx
                        razn_rx = int(now_rx) - prev_rx
                        if(razn_tx < 0):
                                mnozh = math.ceil(math.fabs(razn_tx) / math.pow(2,32))
                                razn_tx = ((math.pow(2,32)*mnozh) - prev_tx) + int(now_tx)
                        if(razn_rx < 0):
                                mnozh = math.ceil(math.fabs(razn_rx) / math.pow(2,32))
                                razn_tx = ((math.pow(2,32)*mnozh) - prev_rx) + int(now_rx)
                else:
                        razn_tx = now_tx
                        razn_rx = now_rx

                conn.execute("insert into stats (iface_id,day,month,year,tx_bytes,rx_bytes) values (?, ?, ?, ?, ?, ?)", (row[0],cur_day,cur_mon,cur_year,razn_tx,razn_rx))
                conn.commit()
Файл базы с уже добавленными в нее интерфейсами можно скачать отсюда - http://sendfile.su/389433 Для редактирования базы под Windows можно использовать утилиту SQLite Admin (она бесплатна). Пользуемся на здоровье, если есть вопросы - обращайтесь. ЗЫ: скрипт предназначен для использования только в ОС Linux (BSD и прочие поделки не прокатят); поддерживает 32-битные системы в которых при превышении трафика в 4 гб системные счетчики сбрасываются.

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.

1 июня 2011 г.

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

1. Вступление
Как и полагается к каждой истории есть предыстория, наша - не исключение. В наше время количеством компьютеров в квартире больше 1 уже практически никого не удивишь и при наличии широкополосного доступа в Интернет хочется, чтобы он был на каждой машине в квартире. Причем не передергиванием кабеля из одной машины в другую, а желательно одновременно на всех, а в случае с ноутбуками еще и по воздуху :). С данной задачей вполне успешно справляются современные роутеры, но в большинстве случаев мощности "железок" находящихся внутри этих роутеров довольно таки слабые. Следствием этого оказывается недостаточная скорость интернета (в нашей стране пакеты со скоростью >50 мбит/с уже не редкость и роутеры просто не "вытягивают" до максимума), тормозящий IPTV (данная услуга тоже уже довольно широко распространена в странах СНГ), нестабильная работа фоновых сервисов типа ICQ, Skype при наличии серьезной нагрузки на Интернет-канал (к примеру закачка торрента) и т.д. 
Решением данной проблемы является сборка полноценного роутера на базе какой-нибудь завалявшейся старой машинки в кладовке :) Системные требования не сильно взыскательные - процессор желательно не ниже 500 МГц и RAM не ниже 256 мб. Но это вовсе не значит что если Ваша конфигурация ниже данной, то ничего работать не будет :) Возможно будет работать чуть медленней, чем Вы могли ожидать :)

2. Аппаратная часть 
Приступим к обзору аппаратной части нашего будущего роутера. Выше я уже упоминал о процессоре и оперативной памяти. Далее нам понадобится 2 обычных сетевых карточки на 100 мбит (можно одну и на 1000 взять если Вы хотите высокие скорости по проводной локальной сети дома), одна беспроводная сетевая карта (в нашем примере я рассматриваю PCI-карту D-Link DWL G520), обычный неуправляемый свич (в случае если будет одна сетевая карта на 1000, как упоминалось ранее, то и свич должен быть гигабитный, в противном случае сойдет и на 100). Для процесса установки понадобится временно подключить клавиатуру и монитор. В процессе дальнейшей эксплуатации роутера это все можно будет отключить. Касательно жесткого диска, то тут уже следует выбирать по задачам, которые планируется возложить на роутер. Если нужен просто роутер и не более, то хватит жесткого и на 10 гб, а вот если нужен файловый сервер/торрентокачалка, то разумеется намного больше, потому выбор за Вами.

3. Установка ОС 
Я не буду останавливаться на том, как правильно выбрать ОС для нашей цели. В данном примере будет рассмотрена ОС Debian Squeeze 64-bit (если Ваша железка не поддерживает 64бит системы, то устанавливайте 32бит-ную версию, ее настройка ничем не отличается от той, что тут будет описана). Итак, скачиваем по данной ссылке образ диска (для 32бит отсюда) и записываем его на диск. Далее грузимся с диска уже с роутера, выбирая в появившемся меню диска Install. Далее процесс установки я описывать не буду, по той причине, что в интернете и так достаточно материалов по данному поводу, начиная от официального мануала по Debian, заканчивая аматорскими инстукциями от известных и не очень гениев данной мысли. Отмечу лишь одно немаловажное - при выборе пакетов установки НЕ отмечайте пакеты "графического рабочего стола". В этом меню следует отметить только "стандартные системные утилиты", а также сервер SSH. Все остальное будет настраиваться вручную в дальшейшем.


4. Настройка системы
  • Предварительная настройка
Итак, допустим система у вас уже установлена с набором базовых пакетов. Пора приступить к первоначальной настройке. Первым делом мы настроим шрифт нашей консоли, т.к. по умолчанию включен довольно ужасный шрифт. Войдя под root'ом выполним следующее:
# dpkg-reconfigure console-setup
В появившемся интерактивном меню выбираем кодировку UTF-8, комбинированные языки и шрифт TerminusBold, размер 16. Далее перезагружаемся:
# reboot
  • Первичная настройка сети
После перезагрузки приступим к одному из важнейших этапов настройки - настройки сети. В нашем примере провайдер работает по технологии Ethernet и для подключения к сети использует PPPoE (на данный момент один из наиболее распространенных типов подключения абонентов). Итак настройка сети осуществляется всего лишь с одного единственного файла. Его мы и будем редактировать (для удобства откройте дополнительную консоль посредством Alt+F2, где нужно будет опять авторизоваться - она Вам понадобится для ввода информационных команд во время редактирования. Переключение на первую консоль осуществляется с помощью Alt+F1):
# nano /etc/network/interfaces
Если Вы при установке выбрали автоматическую настройку сети и выбрали основной сетевой адаптер - скорее всего помимо записи про интерфейс "lo" в этом файле будет еще и запись про тот самый интерфейс, сконфигурированный для получения адреса по dhcp. Выглядеть оно будет примерно так:
auto eth0
iface eth0 inet dhcp 
Где eth0 - это имя сетевого интерфейса подключенного к сети провайдера. Для проверки правильности выбора интерфейса (а их у нас 2) рекомендую выполнить команду "ifconfig eth0", где eth0 тот самый провайдерский сетевой интерфейс. Если интерфейс выбран правильно то ему будет присвоен IP-адрес, а также прочие сетевые параметры. IP-aдрес в выводе вышеупомянутой команды нужно смотреть после "inet addr:". Пример вывода данной команды:

eth1      Link encap:Ethernet  HWaddr 00:30:4f:27:6b:62
          inet addr:172.16.140.151  Bcast:172.16.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:431546 errors:0 dropped:0 overruns:0 frame:0
          TX packets:478203 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:60903792 (58.0 MiB)  TX bytes:522157676 (497.9 MiB)
          Interrupt:12 Base address:0xd400
В данном случае таким интерфейсом у нас является eth1 (eth0 соответственно интерфейс подключенный к свичу).
Вернемся к редактированию файла. Если вышеупомянутые строки уже присутствуют в файле и IP-адрес получен успешно, то это еще не значит что настройка сетевого интерфейса закончена (по крайней в нашем случае именно так и есть). Провайдер для подключения использует привязку к MAC-адресу сетевой карты для авторизации PPPoE. Если Вы, допустим, до поднятия сервера использовали роутер, либо у Вас было подключение напрямую с компьютера, то авторизация будет происходить именно по MAC-у тех устройств, а он уникален у каждого сетевого устройства, следовательно на сервере нужно будет прописать нужный MAC в редактируемый нами файл. Как узнать нужный мак - однозначно ответить нельзя, но если Вы использовали роутер то его по идее можно увидеть на наклейке, где есть надпись "MAC-ID" или просто "MAC"; если Вы использовали подключение напрямую без роутера - Всемогущий Вам в помощь. Если MAC с наклейки на роутере - это просто набор 12 букв и цифр, то в файл его надо вписывать следующим образом (после строки "iface eth0 inet dhcp"):
hwaddress ether 00:11:22:33:44:55 
То есть через каждые 2 символа надо ставить двоеточие (это обязательное условие!). MAC-адрес полученный с компьютера (Windows) обычно идет разделенный тире. Как Вы уже догадались, их тоже нужно заменить на двоеточия. 
Если Вы не хотите возиться с изменением мака, то наиболее простым выходом с данной ситуации будет звонок в техподдержку провайдера с просьбой изменить вам мак. Если попросят назвать новый - его можно посмотреть опять же командой "ifconfig eth0". Он идет сразу же после "HWaddr". Его и следует назвать оператору техподдержки. 
Перейдем к настройке интерфейса подключенного к свичу. Если принять во внимание то, что интернетовский интерфейс у нас eth0, то "свичевый" будет соответственно eth1. Вписываем после настройки eth0 с новой строки следующие строки:
auto eth1
iface eth1 inet static
address 10.1.0.1
netmask 255.255.255.0
Данные строки говорят сами за себя, а именно:
1. iface eth1 inet static - "статическая" настройка интерфейса: IP, маска должны быть прописаны вручную
2. address 10.1.0.1 - собственно IP-адрес интерфейса. Здесь нужно обратить внимание на то, чтобы не возник конфликт с локальной сетью провайдера, которая может использовать ту же подсеть (например в данном случае 10.1.0.0). Проверить это можно с помощью вывода команды "ifconfig eth0" (где eth0 - опять же тот самый "провайдерский" интерфейс). Если "inet addr" интерфейса начинается с 10 или 192.168 - для Вашей внутренней сети нужно использовать IP в подсети 172.16.*.* (например 172.16.0.1). Если же он начинается со 172.16, то для локальной сети можно использовать как IP из сети 10.*.*.* так и 192.168.*.* (к примеру 10.1.0.1 или 192.168.0.1). Бывают случаи, когда локальная сеть провайдера настолько огромна, что используются сразу все 3 подсети зарезервированных локальных IP - в этом случае нужно использовать подсеть 169.254.*.*. Как правило, она не используется провайдерами. Если Вы не уверены или не разобрались как выяснить адреса подсетей локальной сети провайдера, то я рекомендую использовать именно последнюю подсеть (для справки - адреса из этого диапазона используются в Windows, когда сетевому интерфейсу не может быть присвоен адрес автоматически по DHCP). К примеру можно использовать адрес 169.254.0.1. В итоге строка будет иметь вид "address 169.254.0.1".
3. netmask 255.255.255.0 - сетевая маска подсети. Можно оставить такую же как и в примере.
В итоге после всех манипуляций файл должен выглядеть примерно так (использована наиболее оптимальная и простая конфигурация):
auto lo
iface lo inet loopback 
auto eth0
iface eth0 inet dhcp
hwaddress ether 00:11:22:33:44:55 # здесь не забыть вписать свой MAC (если нужно) 
auto eth1
iface eth1 inet static
address 169.254.0.1
netmask 255.255.255.0 
 Если все верно, сохраняем файл с помощью Ctrl+O, затем клацаем Enter. Для выхода жмем Ctrl+X. Перезагружаемся (reboot). На этом первая часть настройки закончена.


Добро пожаловать!

Наконец-то дошли руки создать свой блог на гиперизвестном сервисе Blogger :)
Тут вы сможете найти как интересные статьи о программировании, так и статьи о настройке серверов на Linux, ну и просто мысли вслух :)