Назад | Перейти на главную страницу

Ограничение пропускной способности linux для внешних подсетей

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

Изначально я смотрел на apache mod_bw, однако, скорее всего, к этому зеркалу будет FTP-доступ. Я видел несколько многообещающих вариантов использования tc, однако похоже, что он будет соответствовать шаблону, основанному на подсети. Но я хочу отрицать это - у меня есть список из нескольких (5 или 6) внутренних подсетей, которые не должны иметь ограничений, а все остальное должно проходить через формирователь трафика. Несколько усложняя ситуацию, мне также нужно сопоставить подсети v4 и v6.

Я экспериментировал с этот, но опять же, мне в основном нужен обратный этого, поэтому «не формируйте эти подсети; применяйте политику ко всему остальному». Возможно, 2 класса, один с ограничителем скорости, а другой - нет? Мне все еще неясно, как порядок обработки сочетается с 'tc' - обработка прекращается после обнаружения совпадения или будет продолжаться до конца? (например, действительно ли уловка в конце все, или просто то, что еще не найдено?)

Насколько мне известно, tc match нельзя использовать с ipv6. Вам придется использовать iptables с -j CLASSIFY.

При использовании iptables обработка продолжается после обнаружения совпадения. Однако с tc flowid перенаправляет пакет классу и останавливает обработку.

Насчет дерева, думаю, вам нужно:

  • корневой qdisc
  • класс со всей пропускной способностью (таким образом листовые классы могут заимствовать)
  • два класса, например, с гарантированной 20% (внешней) и 80% (внутренней) пропускной способностью и максимум 100%: у вас не может быть более 100% гарантированной
  • один лист qdisc (pfifo, fq, fq_codel) на класс

Хотя, я не знаю вашей архитектуры. Если вы используете NAT, вы должны быть точными (без диапазона) в правилах iptables. Если вы используете обратный прокси-сервер, вы не сможете различать внутренний и внешний трафик.

Если у вас есть обратный прокси, альтернативы:

  1. Форма на уровне 7 (с mod_bw и эквивалентом для ftp), потому что вы сможете посмотреть заголовок X-Forwarded-For
  2. Настройте формирователь на вашем пограничном маршрутизаторе / брандмауэре (тот, который имеет общедоступный IP-адрес), потому что вы сможете просматривать общедоступный IP-адрес (помните, что вы всегда работаете над ссылкой для загрузки)

В зависимости от ваших возможностей, лучшим вариантом будет второй, потому что вы сможете точно формировать, основываясь на пропускной способности WAN, а не на сетевом адаптере 1 или 10 Гб на вашем веб-сервере. Это ваш лучший вариант даже без обратного прокси.

Что касается выбора класса, вы должны использовать htb или hfsc для лучшего использования динамической пропускной способности и опцию «по умолчанию» в корневом qdisc.