Underground InformatioN Center [&articles] 
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]

Построение сети с разделением трафика на базе iptables & ip route

Вот как-то встала такая задачка:
Существуют 2 входящих канала инета один быстрый, но дорогой - 0.06 за Мб, другой медленный, но с большим плюсом в плане стоимости - рунет бесплатно. Соответственно созрела мысль, тащить один трафик, иностранный, по быстрому, а российский, по другому. На лицо выгодность - экономия на российском трафике. Так вот, исходя из этих данных, встала задача разделения и учета потребленных ресурсов, решение коей я и собираюсь тут рассказать. Естественно это решение не претендует на какую-то оригинальность и новизну, но я думаю, что некоторым покажется интересным.

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

Ну, начнем по порядку...
Первое, что необходимо сделать - это определиться со списком сетей, которые мы хотим отделить от основного (Default) канала, в нашем случае это - рунет.
Список подсетей и хостов рунета можно взять здесь: http://relcom.duty.ru/dbdump.txt.gz
Соответственно, если делить по другим сетям, то нужно составить список этих сетей.

Далее составляем таблицу роутинга для подсетей или машин (зависит от задачи).
Необходимо составить следующие списки:
Runet.db - список сетей;
Ruhost.db - список хостов;
Можно использовать общий список хостов и сетей, это уж как кому нравится.
Users - список машин для которых производится деление трафика;
Приведу пример:

#!/bin/bash

RU_IP="195.182.16.3"
RU_DEV="eth2"
Default_IP="63.18.23.10"
Default_dev="eth1"
RUNET="/bin/cat /etc/routing/runet.db|grep -v 192.168.|grep -v
           127.0.0|grep -v 10.0.0|grep -v 172.0.0"
RUHOST="/bin/cat /etc/routing/ruhost.db|grep -v 192.168.|grep -v
           127.0.0|grep -v 10.0.0|grep -v 172.0.0"
USR="/bin/cat /etc/routing/users"

for US in $USR
{
/sbin/ip rule add from $US table runet
}
for RU in $RUNET
{
/sbin/ip route add $RU via $RU_IP dev $RU_DEV table runet
}
for RU in $RUHOST
{
/sbin/ip route add $RU via $RU_IP dev $RU_DEV table runet
}
/sbin/ip route add default via $Default_IP dev $Default_dev table runet

После данных махинаций мы получим то, что до заданных сетей и хостов машины будут ходить по разным маршрутам. Проверить это можно с помощью traceroute (unix) или tracert (win). Далее нам необходимо сконфигурировать шлюз для отсечения ненужного и учета входящего трафика с разных направлений. В моем случае использовался NAT, т.е. внутренняя сеть проходит через трансляцию адресов, в том числе и сервера, что и нужно отразить в скрипте шлюза.

Скрипт который у меня получился можно скачать здесь: rc.firewall.txt (Скачано 5546 раз)
Естественно там можно много, что подправить и оптимизировать, но это уже ваше дело ;)

Попробую объяснить, что происходит в данном скрипте ;-) .
Таблицы in_lan & in_inet отвечают за фильтрацию пакетов предназначенных непосредственно шлюзу соответственно с локальной сети и Интернета. Для разделения входящего трафика используется маркеровка пакетов и раскидывание по разным таблицам ru_in & ip_net_in. В каждом из этих фильтров включена строка для всех серверов и рабочих станций в счетчике которой и будет происходить накопление трафика.

Статистику по входящему трафику получаем с помощью:
iptables -L "имя таблицы" –vnx
Результат должен быть приблизительно такой:

Chain ip_net_in (1 references)

pkts    bytes target     prot opt in  out   source    destination

6061   426394 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.1
1598   135371 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.2
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.11
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.12
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.13
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.22
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.23
   0        0 ACCEPT     all  --  *   *  0.0.0.0/0    192.168.0.20
 325    17421 DROP       all  --  *   *  0.0.0.0/0    0.0.0.0/0

Вот собственно мы и получили статистику ;-), что с ней делать дальше решать вам, могу лишь подсказать пример скрипта разбирающего и пишущего ее в postgreSQL. Скачать этот скрипт можно здесь: db_add.txt (Скачано 4484 раз)

Вот и сказочке конец а кто слушал тот... ;-)

С уважением.
© Акулич Дмитрий АКА Флам (flame@uinc.ru).
9/16/2002 7:53 PM
uinC Member
[c]uinC

Статья написана специально для UInC (http://www.uinc.ru).

Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы не отвечаем ни за какие последствия, которые имели место как следствие использования этих материалов\программ. Вы используете все вышеперечисленное на свой страх и риск.

Любые материалы с этого сайта не могут быть скопированы без разрешения автора или администрации.


[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]
 Underground InformatioN Center [&articles] Choose style:
2000-2015 © uinC Team