Используем несколько каналов Интернет для загрузки торрент-трафиком

FreeBSD
Итак, есть 4 узла: А, Б, В, Г. Каждый из узлов подключен к сети Интернет. Задача: на узле А запущен торрент-клиент, который должен поглощать интернет с узлов Б, В, Г.
Скорость между узлами А-Б, А-В, А-Г — заведомо выше скорости подключения к Интернет каждого из услов, другими словами, трафик считается внутрисетевым.

Первым делом потребуется собрать все узлы в один виртуальный сегмент. После недолгих размышлений — решаем использовать в этом сегменте адресацию 192.168.130.1, и распределяем адреса следующим образом:
— узел А — 192.168.130.1;
— узел Б — 192.168.130.2;
— узел В — 192.168.130.3;
— узел Г — 192.168.130.4.

Для построения сегмента был выбрна openvpn (http://openvpn.net/)
Процесс установки описывать не буду, ибо там нет ничего сложного. Итак, расставляем на каждом из узлов openvpn.

Настраиваем узел А как сервер:
1. Заводим пользователя ovpn_vpn:
[dk@moon ~]$ sudo pw useradd ovpn_vpn

2. Создаем каталог для логов:
[dk@moon ~]$ sudo mkdir -p /var/log/openvpn/vpn

3. Составляем файл настроек:
[dk@moon ~]$ cat /usr/local/etc/openvpn/vpn.conf
# Изменяем каталог после запуска
cd /usr/local/etc/openvpn/vpn
# Сетевой интерфейс
dev tap0
# Протокол и порт, на котором будем принимать соединения
port 1237
proto udp
# Режим - сервер
mode server
tls-server
# Присваиваем IP адрес
ifconfig 192.168.130.1 255.255.255.0
# Указываем ключи
ca rsa/keys/ca.crt
cert rsa/keys/server.crt
key rsa/keys/server.key
dh rsa/keys/dh1024.pem
# Размер ключа. 32 бита хватит, ибо никакой сверхсекретной информации там не предвидится
keysize 32
#
keepalive 30 120
#
persist-key
persist-tun
# Изменяем пользователя и группу, от которой будет запущен сервис
user ovpn_vpn
group ovpn_vpn
# Протоколирование
verb 3
log /var/log/openvpn/vpn.log
status /var/log/openvpn/vpn.status
# Разрешаем обмен трафиком между клиентами
client-to-client
# Разрешаем подключения с одинаковыми ключами
duplicate-cn

4. Пишем rc-скрипт для запуска:
#!/bin/sh
#
# PROVIDE: ovpn_vpn
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="ovpn_vpn"
rcvar=${name}_enable
pidfile="/var/run/${name}.pid"
config="/usr/local/etc/openvpn/vpn.conf"
command=/usr/local/sbin/openvpn
command_args="--daemon ${name} --config ${config} --writepid ${pidfile}"

load_rc_config ${name}

run_rc_command "$1"

5. Разрешаем запуск вместе с системой, для этого вносим изменения в файл /etc/rc.conf:
ovpn_vpn_enable="yes"

6. Проверяем запуск:
[dk@moon ~]$ sudo /usr/local/etc/rc.d/ovpn_vpn start
Starting ovpn_vpn.
[dk@moon ~]$ sockstat -l|grep "openvpn"
ovpn_vpn openvpn    12865 5  udp4   *:1237                *:*

7. Изменяем правила firewall — разрешаем подключения к openvpn-серверу, и разрешаем icmp пакеты до узла А в виртуальном ethernet-сегменте. Входящие подключения происходят на интерфейсе xl0:
# Разрешаем подключения к openvpn-серверу
pass in quick on xl1 inet proto udp to xl1 port 1237
# Разрешаем icmp трафик в виртуальном ethernet-сегменте
pass in quick on tap0 inet proto icmp to tap0
# Разрешаем любой исходящий трафик на интерфейсе tap0
pass out quick on tap0

После этого узел А настроен как openvpn-сервер и готов обслуживать подключения

Настраиваем узлы Б, В, Г как клиенты
1. Создаем пользователя, от которого будет запущен openvpn:
[dk@kote ~]$ sudo pw useradd ovpn_vpn

2. Создаем каталог для логов:
[dk@kote ~]$ sudo mkdir -p /var/log/openvpn/vpn

3. Составляем файл настроек:
[dk@kote ~]$ cat /usr/local/etc/openvpn/vpn.conf
# Изменяем каталог после запуска
cd /usr/local/etc/openvpn/vpn
# Адрес openvpn-сервера
remote 1.2.3.4 1237 udp
# Сетевой интерфейс
dev tap2
# Режим работы - клиент
tls-client
# IP адрес
ifconfig 192.168.130.2 255.255.255.0
# Запрашиваем настройки с openvpn-сервера
pull
#
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
# Протоколирование
verb 3
log /var/log/openvpn/vpn/openvpn.log
# Ключи
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
keysize 32

Адрес openvpn-сервера необходимо заменить на реальный адрес, 1.2.3.4 — был поставлен в качестве примера.
4. Пишем rc-скрипт для запуска:
#!/bin/sh
#
# PROVIDE: ovpn_vpn
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="ovpn_vpn"
rcvar=${name}_enable
pidfile="/var/run/${name}.pid"
config="/usr/local/etc/openvpn/vpn.conf"
command=/usr/local/sbin/openvpn
command_args="--daemon ${name} --config ${config} --writepid ${pidfile}"

load_rc_config ${name}

run_rc_command "$1"

5. Разрешаем запуск вместе с системой, для этого вносим изменения в файл /etc/rc.conf:
ovpn_vpn_enable="yes"

6. Проверяем запуск:
[dk@kote ~]$ sudo /usr/local/etc/rc.d/ovpn_vpn start
Starting ovpn_vpn.
[dk@kote ~]$ ps -axu|grep "openvpn"
ovpn_vpn  48983  0,0  0,6  5084  2944  ??  Ss    9апр10 2271:02,96 /usr/local/sbin/openvpn --daemon ovpn_vpn --config /usr/local/etc/openvpn/vpn.conf --writepid /var/run/ovpn_vpn.pid

7. Изменяем правила firewall — разрешаем любые пакеты от узла А (192.168.130.1):
# Разрешаем любой входящий трафик от узла А (192.168.130.1)
pass in quick on tap2 from 192.168.130.1
# Разрешаем любой исходящий трафик на интерфейсе tap2
pass out quick on tap2

Узел Б настроен, узлы В и Г настраиваются аналогично, за исключением файла конфигурации openvpn, в строчке ifconfig для этих узлов нужно подставить их адреса внутри сегмента — 192.168.130.3 и 192.168.130.4 соответственно.

Продолжение будет чуть попозже ...

Продолжение ...
Итак, у нас есть виртуальный ethernet-сегмент, состоящих из 4 узлов.
Теперь необходимо настроить маршрутизацию. Надо добиться — чтобы все исходящие соединения от узла А по очереди проходили через узы Б, В, Г. Для этого средствами pf настроим policy based routing на узле А. Для этого есть параметр route-to:
pass out quick route-to{(tap0 192.168.130.2), (tap0 192.168.130.3), (tap0 192.168.130.4)} user tr_moon

Таким образом, все исходящие соединения от пользователя tr_moon будут по алгоритму round-robin устанавливаться через узлы Б, В, Г. На этом настройка маршрутизации закончена.

Настройка торрент-клиента transmission
Устанавливаем из портов сам клиент:
[dk@moon ~]$ sudo bash
Password:
[root@moon /usr/home/dk]# cd /usr/ports/net-p2p/transmission-daemon/
[root@moon /usr/ports/net-p2p/transmission-daemon]# make && make install && make clean

Добавляем пользователя, под которым будет запущен клиент:
[dk@moon ~]$ sudo pw useradd tr_moon

Стандартный скрипт запуска transmission-daemon не подходит для наших целей, поэтому пишем свой:
[dk@moon ~]$ cat /usr/local/etc/rc.d/tr_moon
#!/bin/sh
#
# PROVIDE: tr_moon
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="tr_moon"
rcvar=${name}_enable

command=/usr/local/bin/transmission-daemon
user="tr_moon"
config="/mnt/transmission/moon/config"
downloads="/mnt/transmission/moon/downloads"
logfile="/var/log/transmission/${name}.log"
command_args="-g ${config} -w ${downloads} -e ${logfile}"
start_cmd="start_cmd"
stop_cmd="stop_cmd"

load_rc_config ${name}

start_cmd()
{
    daemon -u ${user} ${command} ${command_args}
}

stop_cmd()
{
    pid=`pgrep -f -u ${user} ${command}`
    kill $pid
    wait_for_pids $pid
}


run_rc_command "$1"

Создаем каталоги настроек, закачек и логов для transmission. Даем права на запись в эти каталоги пользователю tr_moon:
[dk@moon ~]$ sudo mkdir -p /mnt/transmission/moon/downloads
[dk@moon ~]$ sudo mkdir -p /mnt/transmission/moon/incomplete
[dk@moon ~]$ sudo mkdir -p /mnt/transmission/moon/config
[dk@moon ~]$ sudo chown -R tr_moon /mnt/transmission/moon
[dk@moon ~]$ sudo mkdir -p /var/log/transmission
[dk@moon ~]$ sudo chown -R tr_moon /var/log/transmission

Копируем файл настроек transmission в каталог /mnt/transmission/moon/config и правим его под существующие каталоги, попутно жестко привязывая к адресу узла А (192.168.130.1):
[root@moon /usr/home/dk]# cat /mnt/transmission/moon/config/settings.json
{
    "alt-speed-down": 50,
    "alt-speed-enabled": false,
    "alt-speed-time-begin": 540,
    "alt-speed-time-day": 127,
    "alt-speed-time-enabled": false,
    "alt-speed-time-end": 1020,
    "alt-speed-up": 50,
    "bind-address-ipv4": "192.168.130.1",
    "bind-address-ipv6": "::",
    "blocklist-enabled": false,
    "dht-enabled": true,
    "download-dir": "/mnt/transmission/moon/downloads",
    "download-limit": 56,
    "download-limit-enabled": 0,
    "encryption": 0,
    "incomplete-dir": "/mnt/transmission/moon/incomplete",
    "incomplete-dir-enabled": true,
    "lazy-bitfield-enabled": true,
    "message-level": 2,
    "open-file-limit": 500,
    "peer-limit-global": 2000,
    "peer-limit-per-torrent": 100,
    "peer-port": 51414,
    "peer-port-random-enabled": 0,
    "peer-port-random-high": 65535,
    "peer-port-random-low": 49152,
    "peer-port-random-on-start": false,
    "peer-socket-tos": 20,
    "pex-enabled": true,
    "port-forwarding-enabled": false,
    "preallocation": 1,
    "proxy": "",
    "proxy-auth-enabled": false,
    "proxy-auth-password": "",
    "proxy-auth-username": "",
    "proxy-enabled": false,
    "proxy-port": 3128,
    "proxy-type": 0,
    "ratio-limit": 2.0000,
    "ratio-limit-enabled": false,
    "rename-partial-files": false,
    "rpc-authentication-required": false,
    "rpc-bind-address": "0.0.0.0",
    "rpc-enabled": true,
    "rpc-password": "",
    "rpc-port": 9092,
    "rpc-username": "",
    "rpc-whitelist": "*",
    "rpc-whitelist-enabled": false,
    "speed-limit-down": 250,
    "speed-limit-down-enabled": false,
    "speed-limit-up": 100,
    "speed-limit-up-enabled": false,
    "start-added-torrents": true,
    "trash-original-torrent-files": false,
    "umask": 18,
    "upload-limit": 100,
    "upload-limit-enabled": 0,
    "upload-slots-per-torrent": 50
}

Разрешаем запуск transmission вместе с системой, для этого в файл /etc/rc.conf заносим строчку:
tr_moon_enable="yes"


Собственно на этом вся настройка и заканчивается, торрент-трафик будет идти через узлы Б, В и Г, что и требовалось.

7 комментариев

avatar
Вот ты загнул :)
А openvpn с циско дружит?
avatar
нет, openvpn и cisco не дружат между собой
avatar
а в линуксе как так сделать? и желательно не в transmission
avatar
все можно свести к 3 этапам:
1) создание vpn-концентратора
2) установка и запуск торрент-клиента
3) балансировка трафика от торрент-клиента на vpn-концентраторе

Я сейчас нахожусь в командировке, по этому со временем плохо :( буквально на днях вернусь — и попробую описать 3 этап для линукс
avatar
Интересно, это не этот сервер упал?
avatar
Нет.
По схеме (http://lanta.opentmb.ru/static/nagios.png), упавший — earl. А этот трудится и проблем не знает :)
avatar
Service Temporarily Unavailable
:(
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.