Шлюз + шейпер для домашней сети на 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
P.S. 1. Если при запуске скрита вы получите ошибку вида
^M: плохой интерпретатор: No such file or directory
Откройте файл в mcedit и удалите лишние знаки в конце строки!
2. Для добавления скримта в атозагрузку, необходимо открыть файл /etc/rc.local и перед exit 0
вписать /etc/profile.d/masq.sh
источник: http://habrahabr.ru/post/73257/
{jcomments on}
|