« Как компьютер я собирал, или почему крашатся программы...Не бландинки на дороге или как мужики дорогу барышне уступали.. »

Ставим консольный bittorrent клиент(rTorrent) на Linux.

Дошли руки до перепечатки небольшой инструкции, которую написал давным давно(05-Май-2006 22:34). Здесь, инструкция перепечатана в первозданном виде, с небольшим удалением неактуальных коментариев. Все это, еще тогда, было адаптировано под ISP Volia(к стати интересное совпадение - сегодня есть большая вероятность, что я отключусь от ISP Volia), для обмена трафиком внутри районного сегмента, в последствии все это было прикрыто, а очень жаль. Но инструкция всеже может быть в некотором роде полезной, поскольку данный клиент я использую и по сей день, но уже в пределах “ОГО!".

Инструкция объясняет, как можно поставить торент клиент, в домашний каталог пользователя, не проставляя при этом пакетов в системе. Мне лично это удобно, остальное мне не важно. Версии софта на данный момент далеко улетели вперед, но схема сборки осталась той же.

Итак, инструкция:
===========================================================================================
Сидел я как-то на работе, размышлял о смысле жизни…, случилось так, что, параллельно, просматривал форум одного трекера UA-IX. Решил попробовать подключиться к файлообменной жизни украинского сегмента сети Internet. Все бы хорошо, да работа обязывает к тому, что, на рабочей станции, одну часть дня работает WIN XP, другую часть работает Linux. Да и у нас не принято оставлять не выключенным писюк, в конце рабочего дня.

Посему решено! Клиента ставим на сервер. Да и серверу пофиг, что там у него запущено и клиент работать может круглосуточно используя unlimited канал ночью, а днем, спокойно пусть работают юзеры и смотрят свои любимые порносайты =).

Решено - сделано. После некоторых поисков по сети было найдено несколько клиентов. Часть из них не захотела собираться, требуя какие-то модули языка Python, на сервере была ОС старенькая, модулей не хватало, доставлять самому было лень. Еще часть клиентов требовала X Window System, такой подход отпадал сразу, потому что на сервер иксы ставят только идиоты, ну или в очень редких случаях по жестокой необходимости. Клиенты на разных языках типа perl, php, python – отпали сразу тоже, потому что языки программирования, по моему мнению, использованы не по назначению. Я сторонник бинарных файлов сделанных командами make, под моим чутким руководством. =)

Выбрал клиент rTorrent. Поскольку на сервере не было установлении ни одной лишней программы, поэтому пришлось потрудиться немного больше.

Вся эта схема чуть позже была перенесена домой, для раздач на волевском трекере.

Итак, для начала нужно скачать нужные программы.

Идем на сайт http://libtorrent.rakshasa.no/ и качаем libtorrent-0.8.5.tar.gz и rtorrent-0.4.5.tar.gz. Скажу сразу, качать желательно стабильные релизы данных программ, я поначалу было собрал libtorrent-0.9.0.tar.gz и rtorrent-0.5.0.tar.gz, эта «сладкая парочка» почему-то не хотела подключать пира на входящее соединение, поэтому пришлось все переделать.

Для нормальной работы и компиляции вышеприведенных программ необходимо наличие пакетов libsigc++ и curl. Идем на http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.0/ и забираем там последнюю версию libsigc++. На http://curl.haxx.se/download.html нужно забрать последнюю версию curl. Curl собирается в том случае если его нету у вас в ОС, хотя почему бы и не собрать новую версию персонально для клиента.

Теперь, когда все готово, в системе нужно создать юзера у меня это был юзер torrent - который принадлежит группе torrent:

groupadd torrent –g 5555
useradd –s /bin/bash –d /home/torrent –g torrent torrent

Ставим пароль для юзера. Отмечу, что, GID может у вас быть каким угодно, главное чтобы он не пересекался с другими юзерами в системе.
Логинимся на нашу машинку юзером вновь созданным и развиваем бурную деятельность.

Версии всех программ, которых я использовал, приведены на момент сборки, не факт что они сейчас не стали новее.

Вышли новые версии libtorrent и rTorrent, 0.9.3 и 0.5.3 соответственно, пока не пробовал, но версия 0.5.1 клиента работает нормально - проверено. Новые версии должны собираться без ошибок. С 0.5.1 именно так и было. В новых версиях добавилось немного приятного функционала - рекомендую.

Для начала нужно собрать curl:

tar -xjf curl-7.15.3.tar.bz2
cd curl-7.15.3
./configure --prefix=$HOME/usr
make
make install

В домашнем каталоге нашего юзера создается подкаталог usr, в который мы и производим установку всех нужных программ.
Если curl и его библиотеки не установлены в системе, то имеет смысл сделать следующее:

mkdir ~/bin
cd ~/bin
ln -s ../usr/bin/* ./

Таким образом мы линкуем файлы из $HOME/usr/bin в стандартный путь для исполняемых файлов. Также следует проверить переменную PATH на наличие пути $HOME/bin, если он отсутствует, делаем:

echo -ne "\nPATH=$PATH:$HOME/bin\nexport PATH\n" >> ~/.bash_profile

или

echo -ne "\nPATH=$PATH:$HOME/bin\nexport PATH\n" >> ~/.bashrc

В зависимости от того, какой файл является профилем.

Далее собираем библиотеки libsigc++:

tar -xjf libsigc++-2.0.17.tar.bz2
cd libsigc++-2.0.17
./configure --prefix=$HOME/usr
make
make install

Собираем libtorrent:

tar -xzf libtorrent-0.8.5.tar.gz
cd libtorrent-0.8.5

Кофигурим библиотеки, указывая пути к curl и libsigc++, перенос строки в виде ‘\’ можно убрать и все сделать одной большой строчкой.

PKG_CONFIG_PATH="$HOME/usr/lib/pkgconfig/" \
CXXFLAGS="`pkg-config --cflags $HOME/usr/lib/pkgconfig/sigc++-2.0.pc`" \
LDFLAGS="-L$HOME/usr/lib -L$HOME/usr/lib/sigc++-2.0" \
CFLAGS="-I$HOME/usr/include/sigc++-2.0 -I$HOME/usr/lib/sigc++-2.0" \
./configure --prefix=$HOME/usr --without-openssl --with-gnu-ld

Не используем -openssl – потому что шифровать трафик нам не нужно.
При сборке libtorrent-0.8.5 у меня возникла ошибка следующего характера:

-L/home/torrent/usr/lib -lsigc-2.0
../../libtool: line 1: cd: no/lib: No such file or directory
libtool: link: cannot determine absolute directory name of `no/lib'
make[3]: *** [libsub_torrent.la] Error 1

Сие безобразие появляется скорее всего потому, что, конфигуратор, где-то, не может подцепить библиотеки GNU линковщика, не смотря на то что указываем его использование.

Дабы не лопатить все Makefile файлы руками, во всех подкаталогах, сделал такой тривиальный скриптик:

for i in `grep -r -e "no\/lib" * | sed -e '/config\./d; s|:.*||'`; do
sed -e 's|\-Lno\/lib||' $i > $i.1 ; mv $i.1 $i
done

Он исправляет все ошибки в файлах. Далее:

make
make install

Ну и собственно собираем сам клиент:

tar -xzf rtorrent-0.4.5.tar.gz
cd rtorrent-0.4.5
PKG_CONFIG_PATH="$HOME/usr/lib/pkgconfig/" \
CXXFLAGS="`pkg-config --cflags $HOME/usr/lib/pkgconfig/sigc++-2.0.pc` \
`pkg-config --cflags $HOME/usr/lib/pkgconfig/libtorrent.pc` \
`pkg-config --cflags $HOME/usr/lib/pkgconfig/libcurl.pc`" \
LDFLAGS="-L$HOME/usr/lib" \
CFLAGS="-I$HOME/usr/include/curl -I$HOME/usr/include/" \
./configure --prefix=$HOME/usr
make
make install
cp doc/rtorrent.rc ~/.rtorrent.rc

Еще раз делаем линки на исполняемые файлы в стандартный каталог:

cd ~/bin/
ln -s ../usr/bin/* ./

Клиент готов, почти, теперь приступим к его конфигурированию.
Отредактируем файл ~/.rtorrent.rc, который мы скопировали шагом выше.
Не буду приводить полный файл, приведу лишь те опции, что нас интересуют.
Файл конфигурации клиента читается только при старте, по сути, это конфигурация клиента по умолчанию, потом ее можно изменять как угодно, но только лишь на время запуска клиента.
Итак, опции:


# максимальное число пиров на торент
max_peers = 25
# максимальная скорость загрузки
download_rate = 1
# максимальная скорость аплоада
upload_rate = 29
# каталог для сохранения закачек или от куда буду сидироваться торенты
directory = ~/torrents/dl
# каталог куда будет сохраняться состояние торентов
session = ~/torrents/sessions
# адрес передаваемый трекеру, на самом деле это бесполезная опция
ip = 0.0.0.0
# на каких сетевых интерфейсах клиент открывает порт для обмена данными
# такая настройка, потому что, опять, же, у воли DHCP
bind = 0.0.0.0
# номер порта ктр. открывает клиент для обмена данными
# я выбрал один порт, дальше станет понятно почему.
port_range = 19176-19176
# максимальное число открытых сокетов. Я поставил так, можно вообще
# закомментировать эту опцию
max_open_sockets = 100

Пожалуй все, теперь нужно сделать скриптик, для того чтобы торент клиент стартовал при загрузке системы под скринами(screen), потом можно логиниться на машинку, аттачить скрины и смотреть состояние клиента. Доку по скринам читать как обычно man screen =).

Собственно скриптик (torrentd - ИСПРАВЛЕНЫЙ):
Самая первая версия скрипта не корректно завершала работу клиента, он не сообщал трекеру состояние трафика.


#!/bin/sh
# torrentd      starting script rtorrent user
# chkconfig: 2345 98 05
# description: Runs rtorrent

user="torrent"
# обратные косые убрать - хостинг думает что это взлом и блокирует словосочетание на файл паролей :)
home="`grep $user \/etc\/passwd | awk -F: '{print $6}'`"
prog="rtorrent"
client="$home/bin/$prog"
screen="/usr/bin/screen"
cmd="$screen -d -m -T linux -fa $client"
SIG="-INT"

[ ! -x $client ] && exit 0

[ ! -x $screen ] && exit 0

. /etc/rc.d/init.d/functions

RETVAL=0

check_run()
{
    ps axu|grep ^$user | \
        grep $prog | \
        grep -v [Ss][Cc][Rr][Ee][Ee][Nn] | \
        awk '{print $2}'
}

case "$1" in
    start)
        echo -n "Starting torrent client program..."
        pid=`check_run`
        if [ "$pid" == "" ]; then
            su - $user -c "$cmd"
            RETVAL=$?
        fi
        if [ $RETVAL -eq 0 -a "$pid" == "" ]; then
            touch /var/lock/subsys/$prog
            success
        else
            failure
        fi
    ;;
    stop)
        echo -n "Shutting down torrent client program..."
        killall $SIG $prog 2>/dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            rm -f /var/lock/subsys/$prog
            success
        else
            failure
        fi
    ;;
    restart)
        $0 stop
        sleep 1
        $0 start
    ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        RETVAL=1
esac

exit $RETVAL

Данный скрипт адаптирован под систему инициализации Red Hat подобных систем.

Далее, не забываем сделать:

chkconfig --add torrentd
chkconfig --level 2345 torrentd on

Далее, во избежание, потери трафика, нужно настроить подобающим образом файрволл.
У меня конфигурация файрволла довольно сложная, поэтому обращу внимание на доку по iptables: http://www.opennet.ru/docs/RUS/iptables/

Конфиг файрволла, у меня построен на переменных, поэтому приведу все как есть в текущих настройках.

Все политики в дефолтном состоянии сброшены в состояние DROP.
Ниже приведенный конфиг пакетного фильтра приведен исключительно для работы конкретного юзера, и не может быть использован для работы системы в целом, для этого нужно почитать доку и добавить несколько десятков правил (в моем случае).


# собственно расположение iptables
ipt="`which iptables`"

# интерфейсы.
# Мне больше нравиться тип названия интерфейсов как в cisco.
# e0 – внешний интерфейс.
e0="eth0"

# описание 7-го сегмента сети.
vnet=85.202.240.0/20

# адрес трекера
vtrack=62.149.13.138

# порты
www=80
torrent=19176
safeb=1024
safee=65535

# создаем нужные цепочки
$ipt -t filter -N torrent
# поскольку у меня используется контроль состояния пакета, то приведу часть
# рабочего конфига своего файрволла.
$ipt -t filter -N tcp_allow
$ipt -t filter -N udp_allow
$ipt -t filter -N icmp_allow
# цепочки для входящего трафика
$ipt -t filter -N tcp_in

# дефолтовые состояния для TCP пакетов, если не понятно – читать доку
$ipt -A tcp_allow -p tcp --syn -j ACCEPT
$ipt -A tcp_allow -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A tcp_allow -p tcp --syn -j LOG --log-prefix "TCP_allow DIE: "
$ipt -A tcp_allow -p tcp --syn -j DROP

# дефолтовые состояния для UDP пакетов
$ipt -A udp_allow -p udp -m state --state ESTABLISHED,NEW,RELATED -j ACCEPT
$ipt -A udp_allow -p udp -j LOG --log-prefix "UDP_allow DIE: "
$ipt -A udp_allow -p udp -j DROP

# дефолтовые состояния для ICMP пакетов
$ipt -A icmp_allow -p icmp -m state --state ESTABLISHED,NEW,RELATED -j ACCEPT
$ipt -A icmp_allow -p icmp -j LOG --log-prefix "ICMP_allow DIE: "
$ipt -A icmp_allow -p icmp -j DROP

# открываем порт для работы ходящих соединений
$ipt -A tcp_in -s $vnet -p tcp -i $e0 --dport $torrent -j tcp_allow

# наполняем цепочку torrent, для контроля исходящего трафика от нашего клиента
# контроль трафика производиться по user-id и group-id.
# user-id и group-id можно узнать, залогинившись юзером и выполнив команды:
# id –u, id –g

# открываем доступ, для клиента к трекеру
$ipt -A torrent -d $vtrack -p tcp --dport $www -m owner --uid-owner 1009 -j tcp_allow
$ipt -A torrent -d $vtrack -p tcp --dport $www -m owner --gid-owner 5555 -j tcp_allow

# разрешаем юзеру посылать TCP пакеты на безопасные порты в сеть 7-го сегмента
$ipt -A torrent -d $vnet -p tcp --dport $safeb:$safee -m owner --uid-owner 1009 -j tcp_allow
$ipt -A torrent -d $vnet -p tcp --dport $safeb:$safee -m owner --gid-owner 5555 -j tcp_allow
# разрешаем юзеру посылать UDP пакеты на безопасные порты в сеть 7-го сегмента
$ipt -A torrent -d $vnet -p udp --dport $safeb:$safee -m owner --uid-owner 1009 -j udp_allow
$ipt -A torrent -d $vnet -p udp --dport $safeb:$safee -m owner --gid-owner 5555 -j udp_allow
# разрешаем юзеру посылать ICMP пакеты в сеть 7-го сегмента.
$ipt -A torrent -d $vnet -p icmp -m owner --uid-owner 1009 -j icmp_allow
$ipt -A torrent -d $vnet -p icmp -m owner --gid-owner 5555 -j icmp_allow
# Создаем правила для сброса в логии всех правил, которые
# не удовлетворяют правилам выше для владельца user
$ipt -A torrent -p all -m owner --uid-owner 1009 -j LOG --log-prefix "rTorrent OUT UID DROP: "
# запрещаем отправку пакетов
$ipt -A torrent -p all -m owner --uid-owner 1009 -j DROP
# Создаем правила для сброса в логии всех правил, которые
# не удовлетворяют правилам выше для владельца group
$ipt -A torrent -p all -m owner --gid-owner 5555 -j LOG --log-prefix "rTorrent OUT GID DROP: "
# запрещаем отправку пакетов
$ipt -A torrent -p all -m owner --gid-owner 5555 -j DROP

# загружаем правила цепочки tcp_in в цепочку INPUT
$ipt -A INPUT -p all -i $e0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A INPUT -p tcp -j tcp_in

# загружаем правила цепочки torrent в цепочку OUTPUT, это и будет
# завершением конфигурирования пакетного фильтра.
$ipt -A OUTPUT -p all -o $e0 -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A OUTPUT -j torrent

Если кому лень разбираться в цепочках и правилах, может быть нет времени, или лень читать доку, то можно использовать следующий вариант конфигурирования пакетного фильтра:


# собственно расположение iptables
ipt="`which iptables`"

# интерфейсы.
# Мне больше нравиться тип названия интерфейсов как в cisco.
# e0 – внешний интерфейс.
e0="eth0"

# описание 7-го сегмента сети.
vnet=85.202.240.0/20

# адрес трекера
vtrack=62.149.13.138

# порты
www=80
torrent=19176
safeb=1024
safee=65535

# создаем нужные цепочки
$ipt -t filter -N torrent

# открываем порт для работы ходящих соединений
$ipt -A INPUT -s $vnet -p tcp -i $e0 --dport $torrent -j ACCEPT

# контроль трафика производиться по user-id и group-id.
# user-id и group-id можно узнать, залогинившись юзером и выполнив команды:
# id –u, id –g
# разрешаем юзеру посылать TCP пакеты на безопасные порты в сеть 7-го сегмента
$ipt -A OUTPUT -d $vnet -p tcp --dport $safeb:$safee -m owner --uid-owner 1009 -j ACCEPT
$ipt -A OUTPUT -d $vnet -p tcp --dport $safeb:$safee -m owner --gid-owner 5555 -j ACCEPT
# разрешаем юзеру посылать UDP пакеты на безопасные порты в сеть 7-го сегмента
$ipt -A OUTPUT -d $vnet -p udp --dport $safeb:$safee -m owner --uid-owner 1009 -j ACCEPT
$ipt -A OUTPUT -d $vnet -p udp --dport $safeb:$safee -m owner --gid-owner 5555 -j ACCEPT
# разрешаем юзеру посылать ICMP пакеты в сеть 7-го сегмента.
$ipt -A OUTPUT -d $vnet -p icmp -m owner --uid-owner 1009 -j ACCEPT
$ipt -A OUTPUT -d $vnet -p icmp -m owner --gid-owner 5555 -j ACCEPT
# Создаем правила для сброса в логии всех правил, которые
# не удовлетворяют правилам выше для владельца user
$ipt -A OUTPUT -p all -m owner --uid-owner 1009 -j LOG --log-prefix "rTorrent OUT UID DROP: "
# запрещаем отправку пакетов
$ipt -A OUTPUT -p all -m owner --uid-owner 1009 -j DROP
# Создаем правила для сброса в логии всех правил, которые
# не удовлетворяют правилам выше для владельца group
$ipt -A OUTPUT -p all -m owner --gid-owner 5555 -j LOG --log-prefix "rTorrent OUT GID DROP: "
# запрещаем отправку пакетов
$ipt -A OUTPUT -p all -m owner --gid-owner 5555 -j DROP

В обеих случаях конфигурации пакетного фильтра, для юзера torrent, открыты протоколы UDP и ICMP, это сделано прежде всего для того, чтобы можно было проверить работу правил, во первых. Во вторых от имени данного юзера можно было запустить либо traceoroute или ping.

Вот собственно и все описание.

Если кто найдет ошибки, или неточности – больно не бейте, отмыльте в ПМ, постараюсь все исправить.

За неправильное конфигурирование пакетного фильтра iptables, да и других фильтров, ответственности не несу – внимательно читайте доку.

Дурацкие вопросы, принимаются с удовольствием и тут же отправляются по назначению в /dev/null

Данная дока ни на что не претендует и не дает точных указаний для конфигурирования чего-либо, а направляет лишь на путь истинный, указывая направление для деятельности.

Спасибо всем кто дочитал до конца, верю – это было не так легко сделать.

WBR
inittab VY15-UANIC

PS: За второй вариант конфигурации пакетного фильтра, на 100% не могу быть уверенным на счет правильности, так как не проверял на приктике. Первый же у меня прекрасно работает.
===========================================================================================

Минимум правил можно конечно оставить, в контексте более глобального обмена трафиком, чтобы видеть статистику сколько трафика было отдано/принятно по портам, но если задаться целью статистики, то данные правила лучше убрать и в цепочке mangle сделать новые и полноценные правила для статистики клиента.

от vova, 2008-09-14. 10:22:35. 239 просмотров. Рубрики: Linux писанина. Теги: rtorrent. Оставить комментарий »

Еще нет отзывов

Оставить комментарий


Ваш email адрес не будет показан на сайте.

Ваш URL будет показан.
ПлохоПревосходно
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)