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

Формирование трафика Linux с помощью TC и прокси

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

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

Если я помечаю пакеты с помощью iptables по мере того, как они покидают интерфейс локальной сети, это не имеет никакого значения для веб-трафика, потому что метки теряются, когда squid перехватывает и создает собственное подключение к сети на другом порту. Точно так же контроль входящего трафика не работает, потому что веб-трафик всегда предназначен для squid, поэтому я не могу сопоставить по IP-адресу.

До сих пор мне удалось на 90% успешно обойтись, добавив формирователь исходящего трафика во внутренний интерфейс, который ограничивает скорость загрузки для каждого локального компьютера в зависимости от их IP-адреса. Конечно, это не экономит скорость линии, а просто создает очередь, так что каждый компьютер видит только определенную скорость загрузки. Для загрузки я помечаю пакеты, когда они покидают локальную сеть, и использую формирователь на выходе внешнего интерфейса, чтобы формировать их, но это не будет работать с веб-трафиком от squid.

Кто-нибудь еще сталкивался с подобной проблемой или знает, как я могу сформировать загружаемый трафик, у которого есть порт назначения 80, когда его перехватывает squid?

Мне удалось найти обходной путь для этого, используя ограничитель 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.