Формирование трафика Linux с помощью TC и Proxy
У меня есть окно Linux, используемое в качестве маршрутизатора. Он имеет 2x интерфейса, один из которых подключается к Интернету (использует NAT), а другой - к локальной сети, обслуживающей несколько компьютеров.
Я хотел бы использовать 'tc', чтобы иметь возможность формировать трафик, выходящий в Интернет с локальных компьютеров (загрузка), и контролировать трафик, поступающий (загрузка) для каждого компьютера на основе его IP-адреса. Обычно я добавляю выходной формирователь и входной ограничитель к внешнему интерфейсу, проблема в том, что у меня есть прокси-сервер squid, сидящий на сервере, к которому локальные компьютеры подключаются для доступа в Интернет.
Если я помечаю пакеты с помощью iptables, когда они покидают интерфейс локальной сети, это не имеет значения для веб-трафика, потому что метки теряются, когда squid перехватывает и создает свое собственное соединение с сетью на другом порту. Аналогично, контроль входящего трафика не работает, потому что веб-трафик всегда предназначен для squid, поэтому я не могу сопоставить его по IP-адресу.
До сих пор мне удалось на 90% успешно обойти, добавив выходной формирователь во внутренний интерфейс, который ограничивает скорость загрузки для каждого локального компьютера в зависимости от их IP. Конечно, это не экономит скорость линии, а просто создает очередь, так что каждый компьютер видит только определенную скорость загрузки. Для загрузки я отмечаю пакеты, когда они покидают локальную сеть, и использую формирователь на выходе внешнего интерфейса, чтобы формировать их, но это не будет работать с веб-трафиком из squid.
Кто-нибудь еще сталкивался с подобной проблемой или знает, как я мог бы сформировать трафик загрузки, который имеет целевой порт 80, когда squid перехватывает его?
2 ответа
Мне удалось создать обходной путь для этого, используя ограничитель Ingress на внутреннем интерфейсе, который сбрасывает лишние пакеты с локальных компьютеров на Squid. Я мог только заставить это работать с переменным размером буфера все же. Странный.
Вы должны снова пометить ваши пакеты внутри Squid с помощью TOS с помощью tcp_outgoing_tos. Это единственный способ сопоставить IP до и после Squid.
acl tosX src x.x.x.1 x.x.x.2 x.x.x.3
tcp_outgoing_tos 0x20 toxX
Тогда вы должны использовать фильтр TOS в TC.