Это старая версия документа.


FIXME IP-Балансировка: объединяем несколько интернет каналов в один


Цели и средства

  • Имеется два или более каналов интернет,работающие на разных интерфейсах
  • Необходимо объединить эти каналы,увеличив общую скорость интернет,что может быть полезно для программ,создающих множественные подключения (Transmission,aMule и т.д.)
  • В руководстве предлагается 3 способа это сделать.Два из них не требуют дополнительного программного обеспечения,третий предполагает использование пакета patch-o-matic-ng (последний способ не проверен автором данного руководства)

Способ 1

  1. Настройка iproute2 : Создать в /etc/iproute2/rt_tables две таблицы для каждого из провайдеров:
    sudo nano /etc/iproute2/rt_tables
    #
    # reserved values
    #
    255	local
    254	main
    253	default
    0	unspec
    #
    # local
    #
    #1	inr.ruhep
    101 FreeNet
    102 Wireless

  2. Создать файл /etc/routing/FreeNet.list в него можно дописывать адреса путь к которым будет идти четко через основного провайдера.
  3. Создать и запустить данный скрипт,предварительно отредактировав переменные:

    #!/bin/sh
     
    ################### CONFIG ############
    FreeNet="/etc/routing/FreeNet.list"
    ### Home Network
    l_eth=eth2
    l_ip=192.168.5.1
    l_net=192.168.5.0/24
     
    ########### Local ISP Network #########
    li_net=10.0.0.0/8
     
    ########### ISP1 ######################
    i1_eth=eth0
    i1_ip=89.252.20.173
    i1_net=89.252.20.0/24
    i1_gw=89.252.20.1
     
    ########### ISP2 ######################
    i2_eth=eth1
    i2_ip=10.1.2.161
    i2_net=10.0.0.0/16
    i2_gw=10.1.0.1
     
    #########ip route2 tables##############
    t1=101
    t2=102
    #######################################
     
    ########### Flushing ##################
    iptables -t mangle -F NEW_OUT_CONN
    iptables -t mangle -F PREROUTING
    iptables -t mangle -F OUTPUT
    iptables -t mangle -X NEW_OUT_CONN
    ip route flush table $t2
    ip rule del table $t2
    ip route flush table $t1
    ip rule del table $t1
    ip route flush cache
    #######################################
     
    iptables -t mangle -N NEW_OUT_CONN
    iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
    iptables -t mangle -A NEW_OUT_CONN -m statistic --mode random --probability 0.50 -j RETURN
    iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2
     
    for file in $FreeNet; do
    if [ -f "$file" ]; then
    { cat "$file" ; echo ; } | while read ip_addr; do
    if [ "$ip_addr" != "" ]; then
    echo "Статическая маршрутизация для $ip_addr"
    iptables -t mangle -A NEW_OUT_CONN -d $ip_addr -j CONNMARK --set-mark 1
    fi
    done
    fi
    done
     
    iptables -t mangle -A PREROUTING -d $l_net -j RETURN
    iptables -t mangle -A PREROUTING -d $li_net -j RETURN
     
    iptables -t mangle -A PREROUTING -s $l_net -m state --state new,related -j NEW_OUT_CONN
    iptables -t mangle -A PREROUTING -s $l_net -j CONNMARK --restore-mark
     
    iptables -t mangle -A OUTPUT -d $l_net -j RETURN
    iptables -t mangle -A OUTPUT -d $li_net -j RETURN
     
    iptables -t mangle -A OUTPUT -s $l_net -m state --state new,related -j NEW_OUT_CONN
    iptables -t mangle -A OUTPUT -s $li_net -j CONNMARK --restore-mark
     
    ip route add $l_net dev $l_eth scope link table $t1
    ip route add $i2_net dev $i2_eth scope link table $t1
    ip route add $i1_net dev $i1_eth scope link src $i1_ip table $t1
    ip route add 127.0.0.0/8 dev lo scope link table $t1
    ip route add default via $i1_gw table $t1
     
    ip rule add prio 51 fwmark 1 table $t1
    ip rule add from $i1_ip table $t1
     
    ip route add $l_net dev $l_eth scope link table $t2
    ip route add $i1_net dev $i1_eth scope link table $t2
    ip route add $i2_net dev $i2_eth scope link src $i2_ip table $t2
    ip route add 127.0.0.0/8 dev lo scope link table $t2
    ip route add default via $i2_gw table $t2
     
    ip rule add prio 52 fwmark 2 table $t2
    ip rule add from $i2_ip table $t2
     
    ip route flush cache

  4. Это рабочее решение в приниципе для любой Linux системы с версией iptables 1.3.8 и выше.


Способ 2

  1. Создаём папку для скриптов:
    sudo mkdir /etc/balance

  2. Для начала определим переменные:

    #!/bin/bash
     
    # LAN interface
    IF0="eth1"
     
    # WAN interface 1
    IF1="eth0"
     
    # WAN interface 2
    IF2="ppp0"
     
    IP1="194.9.xx.xx"
    IP2="`ip addr show $IF2 | grep inet | awk '{print $2}'`"
     
    # gateway 1
    P1="194.9.xx.xx"
    # gateway 2
    P2="195.5.xx.xx"
     
    # LAN netmask
    P0_NET="192.168.0.0/24"
    # WAN1 netmask
    P1_NET="194.9.xx.xx/xx"
    # WAN2 netmask
    P2_NET="195.5.xx.xx/xx"
     
     
    TBL1="provider1"
    TBL2="provider2"
     
    # Realtive weight of channels bandwidth
    W1="2"
    W2="1"

  3. Добавим в файл /etc/iproute2/rt_tables две дополнительные таблицы маршрутизации:

    echo "1 provider1" >> /etc/iproute2/rt_tables
    echo "2 provider2" >> /etc/iproute2/rt_tables
ведутся работы