13

Предпосылка:

Сельское местоположение, не так много вариантов для высокоскоростного подключения к Интернету. Самым быстрым на сегодняшний день является спутниковый Интернет, но он дорогой (как оборудование, так и месячная стоимость, и имеет недостатки по времени ожидания), поэтому многие домохозяйства хотели бы поделиться им.

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

Эта проблема:

То, как обычно работает TCP, означает, что каждое TCP-соединение будет более или менее получать 1/n доступной пропускной способности, где n - количество соединений. Таким образом, если одно домохозяйство / пользователь создает много подключений, они получат большую долю общего подключения. Это не особенно справедливо - с насыщенной связью каждое домохозяйство должно получить равную долю. С другой стороны, когда никто больше не использует соединение, должно быть возможно использовать всю полосу пропускания.

Например, скажем, есть 4 домохозяйства, использующие соединение со скоростью 12 Мбит / с. Если один из них загружает / передает / что-то еще, он должен иметь возможность использовать полные 12 Мбит / с (или достаточно близко). Если 2 домохозяйства используют соединение, они должны получать 6 Мбит / с каждое, независимо от того, загружает ли одно домохозяйство 1 файл, а другое 11. (без какого-либо управления пропускной способностью каждый файл будет загружаться со скоростью примерно 1 Мбит / с в этом случае) 3 домохозяйства. получить 4Mbit / s каждый и так далее.

Что я разработал до сих пор:

Лучшее место для реализации подобной политики (для нисходящего потока) - на другом конце узкого канала, т. Е. У провайдера. Очевидно, что в этом случае это невозможно, поэтому было бы хорошо иметь возможность как-то приблизиться к нему. Но как? Существуют ли готовые маршрутизаторы, которые поддерживают что-то подобное? Могу ли я настроить Linux или BSD box для этого? Это не должно быть пуленепробиваемым - неправильно работающий TCP-сервер или агрессивный UDP-сервис могут предположительно обойти все, что я могу сделать на моем конце - но это должно работать для общего случая большей части трафика, состоящего из большого количества RFC-совместимых TCP соединения.

Чтобы было ясно, я не говорю о приоритезации определенных приложений, а скорее о совокупном трафике к / от определенных устройств Ethernet или диапазонов IP-адресов. Предоставление некоторому трафику более высокого приоритета, чем другому трафику, кажется хорошо поддерживаемым, но ситуация менее ясна при попытке равномерно распределить пропускную способность для классов трафика.

В Интернете много плохо написанной / бездумно отрыгнутой / иным образом неинформированной информации о формировании трафика. Документация по аппаратному обеспечению маршрутизатора ужасно неопределенная, поэтому я, кажется, бегаю кругами.

Насколько я понимаю, способ заставить TCP вести себя таким образом - по сути моделировать немного более узкий канал, чем он есть на самом деле, и искусственно отбрасывать пакеты, чтобы заставить его отступить. Поэтому я думаю, что было бы довольно просто дать всем ровно 3 Мбит / с в приведенном выше примере, искусственно отбрасывая любые дополнительные пакеты. Это на самом деле не использует соединение эффективно, так как большую часть времени есть запасная емкость.

Есть ли способ сделать то, что я спрашиваю? Я поступаю неправильно? Я (или, скорее, домохозяйства в вопросах) желаю потратить деньги на это - будь то стандартный маршрутизатор / устройство по умеренной цене или универсальный пакет для запуска дистрибутива Linux или BSD.

3 ответа3

4

Если бы я должен был что-то построить для решения этой проблемы, я бы настроил это:

Здесь мы собираемся взять ваш пример 4 компьютеров с одной ссылкой. Сеть будет иметь такую форму:

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

Допустим, вы используете статическую IP-адресацию в LAN2:

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

Сначала я написал бы небольшой скрипт, чтобы определить, какие клиенты работают, проверяя их и записывая результат где-нибудь. "Это оставлено в качестве упражнения для читателя". Рассчитайте общее количество подключенных хостов (1-4).

Обязательно разберитесь со случаем отсутствия хостов онлайн.

Разделите общую полосу пропускания, но количество подключенных хостов. (12 МБ для 1, 6 МБ для 2, 4 МБ для 3, 3 МБ для 4)

Затем используйте tc с алгоритмом HTB, чтобы ограничить пропускную способность каждого адреса на устройстве на стороне WAN. Сначала создайте корневой класс:

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

Затем добавьте класс для каждого "клиента" (здесь, например, 3 клиента)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(приведенный выше скрипт полностью не проверен и НЕ печатает без ошибок)

Теперь вам все еще нужно правильно написать скрипт, который будет запускаться каждую минуту, и обновлять блоки / фильтры каждый раз, когда новый хост поднимается или опускается.

Я надеюсь, что это укажет вам правильное направление, удачи.

Альтернативное решение

Установите локальное программное обеспечение QoS на всех хостах, чтобы ограничить их пропускную способность. Я персонально использую NetLimiter (не бесплатно)

2

OpenWRT, кажется, поддерживает это, хотя я никогда не использовал это непосредственно. Вы можете взглянуть на страницу управления сетевым трафиком на их веб-сайте, и особенно на второй пример: простое простое разделение полосы пропускания (иначе говоря, формирование трафика) с HTB. Это включает в себя простые вызовы qdisc, так что любой Linux-бокс может это сделать.

0

Настройка, описанная в https://superuser.com/a/1210164/257859, делает именно это:

[...] очереди распределяют этот ограниченный BW равномерно между всеми клиентами LAN (точнее, IP-адресами LAN).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .