Шлюз+шейпер для домашней сети на Ubuntu

    Моя домашняя сеть разрослась до количества трех компьютеров. В связи с чем началась дележка: кто будет качать первым.
    Иногда даже страничка в ФФ открывается по 2-3 минуты, так как на соседнем компе во всю качает торрент.
    Советом системных администраторов (то есть мной) было принято решение создать шлюз c шейпером который будет динамически делить канал на всех.
    Ну начнем
    Имеется две сетевые карты, eth0 — смотрит в интернет (модем в режиме роутера, и eth1 — смотрит в локальную сеть
    Я не буду описывать конфиги самих сетевых интерфейсов, но скажу, что eth0 получает IP от роутера, в то время как на eth1 выставлен статический IP, мной выбран 10.2.2.1
    Для начала поднимем DHCP сервер для того, что бы оставшиеся компы могли получить IP адреса автоматом.
    Установим DHCP сервер
    sudo apt-get install dhcp3-server
    После чего правим конфиг /etc/dhcp3/dhcp.conf я привел его вот к такому виду
    subnet 10.2.2.0 netmask 255.255.255.0
    {
    option routers 10.2.2.1;
    option subnet-mask 255.255.255.0;
    option domain-name-servers 195.54.2.1;
    option domain-name-servers 195.54.3.2;
    range 10.2.2.10 10.2.2.254;
    default-lease-time 21600;
    max-lease-time 28800;
    }

    затем правим файл /etc/default/dhcp3-server вписывая в него строку
    INTERFACES=eth1
    для того, что бы сервер «слушал» именно этот интерфейс
    После чего можем запустить сервер
    sudo /etc/init.d/dhcp3-server start
    Для “раздачи” интернет во внутреннюю сеть используем IP маскарадинг (IPMASQUARADE)
    В сокращенном виде (без комментариев и не функциональных выводов сообщений) скрипт выглядит так:
    #!/bin/sh
    # полная версия находится здесь: lafox.net/docs/masq
    IPTABLES=/sbin/iptables
    DEPMOD=/sbin/depmod
    MODPROBE=/sbin/modprobe
    EXTIF="eth0"
    INTIF="eth1"
    $DEPMOD -a
    $MODPROBE ip_tables
    $MODPROBE ip_conntrack
    $MODPROBE ip_conntrack_ftp
    $MODPROBE ip_conntrack_irc
    $MODPROBE iptable_nat
    $MODPROBE ip_nat_ftp
    $MODPROBE ip_nat_irc
    echo "1" > /proc/sys/net/ipv4/ip_forward
    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -F INPUT
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -F OUTPUT
    $IPTABLES -P FORWARD DROP
    $IPTABLES -F FORWARD
    $IPTABLES -t nat -F
    $IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
    $IPTABLES -A FORWARD -j LOG
    $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
    echo -e "done.\n"

    Сохраним это в файлик в /etc/profile.d и назовем его, к примеру masq.sh.
    Делаем его исполняемым и выполняем
    sudo chmod +x /etc/profile.d/masq.sh
    sudo sh /etc/profile.d/masq.sh

    После этих действий нужно «опустить» а потом снова «поднять» сетевой интерфейс eth1
    sudo ifonfig eth1 down
    sudo ifonfig eth1 up

    После чего клиенты смогут получать IP адреса и пользоваться инетом )))
    А теперь мы настроим шейпер, в принципе для этого все и задумывалось, для того что бы динамически делить скорость инета.
    Я выбрал для шейпера скрипт htb.init который можно скачать тут sourceforge.net/projects/htbinit
    sudo cp htb.init /etc/init.d/htb
    sudo chmod +x /etc/init.d/htb
    sudo update-rc.d htb defaults

    В папке, в которую указывает HTB_PATH, (лично я поправил эту переменую и у меня получилось /etc/htb, естественно этой папки в системе нет ее нужно создать) создаем следующие файлы:
    eth1:
    R2Q=20
    DEFAULT=0

    R2Q — коэффициент, определяющий соотношение точности/скорости работы шейпера
    DEFAULT — идентификатор класса, в который попадают пакеты, если они не попадают под другие правила. Класс с идентификатором 0 существует всегда и пропускает пакеты без всякого шейпинга, то есть на полной скорости.
    Этим файлом мы инициализировали шейпер на интерфейсе eth0.
    eth1-2.root:
    RATE=24Mbit
    Этим файлом мы создали корневой класс траффика на интерфейсе eth0 и ограничили максимальную скорость отдачи через этот класс 24 мегабитами.
    eth1-2:2001:
    RATE=512Kbit
    CEIL=24Mbit
    LEAF=sfq
    RULE=10.2.2.10/24

    Этим файлом мы создали класс для первого клиента.
    RATE — гарантируемая скорость для клиента. Поскольку в нашем случае не нужно гарантировать никакой скорости, но HTB этого требует, исходим из неравенства: 24000Кбит / 3 > RATE.
    CEIL — максимальная скорость для клиента при свободном канале.
    LEAF — указывает, что класс является одним из листов дерева, то есть в него попадает трафик, удовлетворяющий определенному правилу (RULE). Параметр sfq означает, что мы хотим, чтобы внутри этого класса скорость распределялась равномерно между сессиями.
    RULE — правило, задающее, какой трафик будет попадать в этот класс (см. Замечание 1). В данном случае в класс попадает весь трафик, имеющий IP назначения от 10.2.2.10 до 10.2.2.255.
    О назначении и значениях параметров, которые указываются в файлах, и о именах файлов можно узнать из скрипта htb.init — там вверху есть неплохая справка.
    Стартуем наш шейпер
    sudo /etc/init.d/htb start
    Всё, шейпер включен. Далее, если что-то изменится в конфигруации, нужно сделать /etc/init.d/htb restart.
    Проверить работу скрипта htb.init, кроме спидтестов, можно просмотром конфигурации командами:
    tc class show dev eth1
    tc qdisc show dev eth1

    Ну можно еще много всего прикручивать к нашему серваку, и Clam AV и фаервол, но оставлю это вам )))

    Удачи!

    P.S. Статья опубликована по просьбе друга, не имеющего доступ на Хабр, но желающего стать одним из Хаброюзеров (его почта — ktattoo@gmail.ru).

    Upd1. Спасибо за карму перенес в Убунтариум
    Upd2. Автор статьи теперь пользователь хабра — KTATTOO.
    Поделиться публикацией

    Комментарии 50

      +7
      если честно, то я бы поставил ограничение не торрент-клиенте, но понятно, что это не линукс-вей :)
        +4
        и все же я не прав. речь идет о динамическом распределении — это круче.
          +2
          А можно на модеме, работающем в режиме роутера. Многие поддреживают трафик-менеджмент.
            0
            Тут дело в том, что некоторые домашние пользователи пытаются обмануть сисадмина и других, качая все на полной скорости ))) по этому и было выбрано это решение.
            +1
            Теперь можете перенести в тематический блог
              0
              спасибо, только что это и сделал
            • НЛО прилетело и опубликовало эту надпись здесь
                +1
                Можно указать самый низкий приоритет для какого-нибудь домена?
                Например, для файлообменников. Чтобы качать можно было во всю ширину канала, но не мешать сёрфать и vpn-нить другим компам в сети?
                  +1
                  Можно. Но проще в реализации будет выделить правилами высокий приоритет для интерактивного трафика (http, ssh и тд), а для остального остаток канала.

                  Кстати, кто не догадался, в статье автора шейпится только исходящий трафик, так что для тех у кого нет роутера на Линикс, придется сделать больше телодвижений.
                    +1
                    исходящий на eth1, который смотрит внутрь сети.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Можно, но придется поковыряться. Если честно то я сам еще не полностью разобрался с htb.init )))
                      0
                      Спасибо.
                      Как раз думал о подобном, смотрел в сторону Traffic Inspector под Винду, но жаба душит. А для самостоятельной настройки под свободной ОС знаний не хватает.
                      Так что продолжение настроек будет не лишним. ;)
                        –1
                        Примерно та же история дома. Неплохо бы еще про форвардинг портов написать))
                          0
                          Про L7 пока не думали? Хотя для начала хватит и этого.
                            +1
                            А есть у кого-нибудь опыт динамического шейпинга на FreeBSD? Интересно на каком методе остановились?..
                              0
                              в моем случае к шлюзу подключаются вин-клиенты по pptp, сервером которого на шлюзе с бсд является mpd, при подключении нового ng интерфейса стартует скрипт который считает количество подключенных ng интерфейсов и изменяет ширину pipe на каждый ng интерфейс
                                +1
                                Не, ну это чересчур. Pptp… Возможно так легче реализовать сам динамический шейпинг, цепляясь за ng-интерфейсы, но общую картину pptp портит. А то же самое, при простом DHCP как думаете, возможно?
                                > стартует скрипт который считает количество подключенных ng интерфейсов выданных айпишников и изменяет ширину pipe на каждый ng интерфейс айпишник
                                ?
                              0
                              а зачем роутер?
                                +5
                                Гикам лень его покупать. Им легче хранить старый хлам и извращаться
                                  0
                                  зато старый хлам более производительный и гибкий, чем большинство бюджетных роутеров :)
                                    0
                                    купить тонкий клиент на ибэе и вот оно счастье :)
                                –4
                                Ыыы… Ну задроты. ну задроты. Дома инфраструктура сети круче чем в датацентрах.
                                Кстати, я сегодня стоичный сервер дома поставил…
                                  0
                                  И обязательно динамическое переключение на резервный канал.
                                    +2
                                    у меня дома в качестве роутера cisco 3620, на днях беру ещё 3640 для экспериментов в области ipv6 ;)
                                    0
                                    торренты не будут ли засерать весь ceil? на широком канале не столь заметно, а вот на узком у мя динамический шейпинг с торрентами практически не работал. да и вообще динамический шейпинг входящего трафика это сомнительная штука.
                                      0
                                      А в ubuntu/debian разве нету "/etc/init.d/iptables save"? Зачем городить огород с кастомными скриптами если всё давно придумано за нас?
                                        0
                                        В Дебиане нету. Да и зачем? Логичный способ поднимать правила вместе с интерфейсом.
                                          0
                                          Чем он логичный? Тем, что из нормальной системы превращается в slackware?

                                          iptables-save неужели тоже нету? Не верю.

                                          Логично, когда правила фаервола грузятся при старте системы штатным загрузчиком (init-скриптом фаервола). Это логично, это в духе линукса. А самописанный стартовый скрипт — это способ из MS-DOS.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              Ну вот, есть логичный способ, без велосипедостроительства.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                        +1
                                        Ну все-же ifConfig.
                                          0
                                          Как показывает практика, с параметром ceil надо быть поосторожнее. Торренты зохавывают весь его. Кстати, на хабре была уже
                                          похожая статья, которая мне и помогла с шейпингом. Остальное уже совсем просто.
                                            0
                                            habrahabr.ru/blogs/linux/60095/

                                            ссылка на пост про htb
                                              0
                                              а какой смысл пускать все через 2 езернета? маскарадинг отлично работает и через 1 сетевую карту… будьте экономичнее) тем более хаб у Вас я так понял есть!
                                                0
                                                Имхо, все-таки проще поставить достаточно умную сетевую железку (модем или роутер), которая это умеет. Тоже, кстати, несколько месяцев назад собрал тихий комп под это дело, но потом внимательно осмотрелся в настройках модема и пошел по правильному пути. :)
                                                  +1
                                                  Если у вас модем работает в режиме роутера, зачем делать MASQUERADE?
                                                  Пользуйте SNAT, это быстрее и эффективнее.
                                                    0
                                                    Если внешний IP динамический, то лучше таки MASQUERADE
                                                      0
                                                      и что? маскарадить будет адсл-модем.
                                                        0
                                                        Я наивно полагал, что pppoe соединение поднимает сам шлюз.
                                                    +2
                                                    Статья из серии «Я познаю мир»
                                                      0
                                                      Очень давно нашел готовый шейпер от LARTC. Использую везде, где речь идет об ADSL. Возможно будет разумно переключить модем/роутер в режим бриджа дабы использовать все прелести данного шейпера. Смотрите: LARTC Wondershaper.
                                                        0
                                                        Настроил QoS на Tomato и никакой головной боли
                                                          0
                                                          Думаю статье очень бы не помешало простое текстовое описание результата где-нить после слов «Всё, шейпер включен.», а то постановка задачи «динамически делить канал на всех» как-то малоинформативна по-моему. Например, сам комп с поднятым шлюзом в дележке участвует? Мне показалось, что участвуют только компы, которым этот шлюз инет раздает или я что-то не допонял?
                                                            0
                                                            ДЛя более ли менее нормальной настройки шейпера посмотрите в сторону
                                                            IMQ и ESFQ (мсеено E)
                                                            одним HTB Вы ничего не сделаете путного.
                                                              0
                                                              Те кто разбираются, и так это знают, а те кто не разбираются, не поймут, и если тупо последуют инструкциям, могут напортачить. Я предлагаю объяснять подробно, что означает то или иное заклинание. Непонятности начинаются уже с /etc/dhcp3/dhcp.conf.
                                                                0
                                                                Немного не в тему, но все же, так как очень хочется, но непонятно что делать. Проконсультируйте, пожалуйста.

                                                                Есть компьютер с Ubuntu 9.04 jaunty, к нему подключен модем AnyDATA ADU-520A (модем ev-do компании Байкалвестком). Интернет по ev-do работает хорошо. Но очень хочется раздавать интернет на два других ноутбука — везде есть wi-fi и ethernet-порты. Из железок еще есть — switch за 500 рублей (acorp; неуправляемый; 5 портов ethernet; плюс три патч-корда) и ADSL2+ маршрутизатор TP-Link TD-W8910G (http://dns-shop.ru/irk/price_detail.php?i=100736).

                                                                Итого:
                                                                — компьютер с подключенным модемом AnyDATA ADU-520A (ev-do, беспроводный интернет) — Ubuntu jaunty
                                                                — другой ноутбук — Ubuntu jaunty
                                                                — и еще один ноутбук — Windows Vista

                                                                Нужно чтобы первый компьютер раздавал интернет на два других; хотя бы по ethernet; через wi-fi было бы совсем круто.

                                                                Подскажите, пожалуйста, в какую сторону смотреть, с чего начать. Есть ли где-нибудь понятные руководства как это можно сделать? Можно ли к кому-нибудь обратиться за консультацией?
                                                                  0
                                                                  народ помогите плиз
                                                                  какие статьи не читал — ни что не помогает =(
                                                                  правила HTB просты и все равно не робит никуя
                                                                  у мя схема такая
                                                                  eth0 смотрит в инет
                                                                  eth1 в локалку
                                                                  на eth1 висит сквид и раздает инет
                                                                  какие правила я бы не брал на просторах инета и даже по этой статье — с правкой небольшой в виде подсети (она у мя 192.168.0.0/24) НИЧЕГО не шейпится!
                                                                  люди качают через сквид и кто первый захватил канал тот и папа
                                                                  помогите плиз с правилами и пните уже волшебным пендалем
                                                                    0
                                                                    В соседней статье прочитал полезную мысли которая в этой теме не реализована: «Если нам нужно шейпировать трафик и натить на том же руотере, то вместо RULE нужно использовать MARK. Единственное придется маркировать пакеты.» habrahabr.ru/post/88624/

                                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                    Самое читаемое