Балансировка каналов


          В наличие имеется канал интернет 1 через провайдера 1 и канал интернета 2 через провайдера 2. Оборудование роутер на базе Ralink с DD-WRT (роутер 1) и ADSL модем в режиме роутера (роутер 2), который подключен в LAN порт роутера 1 и имеет IP адрес "192.168.130.100". Провайдер 1 для подключения выдал нам – статический IP адрес "172.16.у.2", шлюз "172.16.у.1", DNS сервера, вид подключения PPTP, кабель включен в WAN порт роутера 1. Провайдер 2 для подключения –вид подключения PPPoE. Клиенты подключены к роутеру 1 как по LAN кабелю так и по Wi-fi. 

Задача. Использовать оба канала доступа в интернет одновременно, т.е. организовать балансировку каналов. Для выполнение данной задачи воспользуемся командой:

ip ro add default scope global nexthop  
via [IP_адрес_1] dev [имя_интерфейса_1] weight [коэф_1] nexthop
via [IP_адрес_2] dev [имя_интерфейса_2] weight [коэф_2]

где IP_адрес_1 – адрес от провайдера 1, после подключения по PPTP он будет в NVRAM переменной “wan_pptp_get_ip; IP_адрес_2 – адрес от провайдера 2, точнее сам шлюз 192.168.130.100; имя_интерфейса_1 – имя интерфейса по доступу к шлюзу провайдера 1, в данном случае это “ppp0; имя_интерфейса_2 – имя интерфейса по доступу к шлюзу провайдера 2, в данном случае это “br0”; коэф_1/коэф_2 – это весовой коэффициент, отношение прохождения пакетов через данные интерфейсы.
Произведем настройку данного режима ручным способом, а потом напишем скрипт и поместим его в “Startup”, т.е. в автозапуск для роутера 1, который будет организует нам данную балансировку каналов.
 


 root@My-Fan:/tmp/var/tmp# ifconfig
 br0       Link encap:Ethernet HWaddr 00:0C:43:x:x:x
          inet addr:192.168.130.1 Bcast:192.168.130.255 Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 ppp0      Link encap:Point-to-Point Protocol
          inet addr:172.18.x.2 P-t-P:193.x.x.6 Mask:255.255.255.255
          UP POINTOPOINT RUNNING MULTICAST  MTU:1400  Metric:1

 vlan2     Link encap:Ethernet HWaddr х:х:х:х:х:х
          inet addr:172.16.у.2 Bcast:172.16.у.255 Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 root@My-Fan:/tmp/var/tmp# route del default
 root@My-Fan:/tmp/var/tmp# ip ro flush cache
 root@My-Fan:/tmp/var/tmp#  ip ro add default scope global nexthop
 via 172.18.x.2 dev ppp0 weight 5 nexthop
 via 192.168.130.100 dev br0 weight 10
 root@My-Fan:/tmp/var/tmp# ip ro
 default
        nexthop via 172.18.х.2 dev ppp0 weight 5
        nexthop via 192.168.130.100  dev br0 weight 10
 ...
 root@My-Fan:/tmp/var/tmp#
Обозначения :
br0 – имя интерфейса в который входят “ra0” (wi-fi) и “vlan1” (порты LAN1-LAN4) роутера 1; vlan2 – имя интерфейса в который входит WAN порт роутера 1.

Примечание, так как у нас два провайдера, то мы решаем использовать DNS сервера от второго, как более надежного и стабильного у нас, для этого необходимо указать маршрут доступа до данных серверов, через конкретный шлюз и через интерфейс:
route add -host [IP_адрес_DNS2_1]/32 gw 192.168.130.100 dev br0

route add -host [IP_адрес_DNS2_2]/32 gw 192.168.130.100 dev br0

 root@My-Fan:/tmp/var/tmp# ip ro
 default
        nexthop via 172.18.x.2 dev ppp0 weight 5
        nexthop via 192.168.130.100  dev br0 weight 10
 84.у.у.4 via 192.168.130.100 dev br0
 84.у.у.2 via 192.168.130.100 dev br0
 …
 root@My-Fan:/tmp/var/tmp#


Можно обойтись без дополнительных маршрутов для DNS серверов если воспользоваться публичными DNS серверами. После проверки работоспособности напишем скрипт и поместим его в автозапуск роутера 1,  используем для этого режим WEB интерфейс нашего роутера 1 http://192.168.130.1/Diagnostics.asp введем текст который ниже и нажмем потом кнопку “Save Startup”. Добавим в данный скрипт отслеживание состояние канала на провайдера 1 через интерфейс “ppp0” используя команду "ping" на интерфейс "ppp0", при его пропадании устанавливает маршрут по умолчанию default на шлюз 192.168.130.100” интерфейса "br0"


route add -host 84.y.y.4/32 gw 192.168.130.100 dev br0
route add -host 84.y.y.2/32 gw 192.168.130.100 dev br0
echo -e "#!/bin/sh
WANup_ppp0=\`ifconfig | awk '/ppp0/ {print \$1}'\`
R_nexthop=\`ip ro | awk '/nexthop via 192.168/ {print \$1}'\`
if [ \"\$WANup_ppp0\" = \"ppp0\" ]; then
 if [ \"\$R_nexthop\" == \"\" ]; then
  route del default; ip ro flush cache
  ip ro add default scope global nexthop \
  via $(/usr/sbin/nvram get wan_pptp_get_ip) dev ppp0 weight 5\
  nexthop via $(/usr/sbin/nvram get lan_gateway) dev br0 weight 10
  gpio enable 9; gpio enable 8; gpio disable 8; exit;
 else
  Count_ping=\`ping -c2 -I ppp0 194.186.36.167 | awk '/packets received/ {print \$4}'\`
  if [ \"\$Count_ping\" = 0 ]; then
   route del default; ip ro flush cache
   ip ro add default via $(/usr/sbin/nvram get lan_gateway) dev br0
   gpio enable 8; gpio enable 9; gpio disable 9
  fi
 fi
 exit;
else
 route del default; ip ro flush cache
 ip ro add default via $(/usr/sbin/nvram get lan_gateway) dev br0
 gpio enable 9; gpio enable 8;
 pppd
fi
exit;
">/tmp/var/tmp/route_nexthop.sh
chmod 755 /tmp/var/tmp/route_nexthop.sh

Примечание: команды "gpio enable" и "gpio disable" можно убрать, так как это индикация светодиодов на передней панели для Ralink, адрес локального шлюза 192.168.130.100 при настройке роутера 1 через интерфейс WEB в http://192.168.130.1/index.asp  в секции “Network Setup” поле  Gateway” будет помещено в NVRAM с именем  lan_gateway”. Для проверки можно воспользоваться командой:

root@My-Fan:/tmp/var/tmp# nvram get lan_gateway
192.168.130.100
root@My-Fan:/tmp/var/tmp#

Осталось только запускать данный скрипт “route_nexthop.sh один раз например в 15мин, через сервис “cron” роутера 1.

На локальных клиентах, которые подключены к роутеру 1 была следующая настройка, стат IP адрес из сетки 192.168.130.2-254, шлюз 192.168.130.1, DNS сервера имели адреса 84.y.y.4 и 84.y.y.2 это было прописано в ручную, но не кто не мешает использовать получение клиентами IP адреса по DHCP, только для этого нужно включить и настроить опции http://192.168.130.1/Services.asp служба "DNSMasq" и http://192.168.130.1/index.asp служба "Network Address Server Settings" а именно поставить галочку для использования "Use DNSMasq for DHCP" и "Use DNSMasq for DNS".
Замечание по данной реализации, при использовании данного метода “ip ro add default scope global nexthop” при доступе к интернет страницам все будет в порядке, при скачке торрентов так же будет все в порядке, но при закачке с серверов например http://depositfiles.com/  будут происходить разрывы, так как основное назначение данной реализации – балансировка на каналах, т.е. определенное время доступ на канале 1, а потом его смена на канал 2. 
Данная реализация была опробована на прошивках у которых была версия Linux 2.6.хх-svn17200. 

Комментариев нет:

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