Формирование трафика с помощью iptables, ipset и tc (--match-set и --set-mark)

У меня возникли некоторые проблемы с тем, что, по моему мнению, должно быть довольно простой проблемой формирования трафика.

У меня есть сервер Ubuntu (16.04), который действует как маршрутизатор / nat. Я хочу разрешить большинству пользователей использовать Интернет со скоростью 2 Мбит / с, а некоторые устройства - до 512 Кбит / с.

У меня есть список дросселированных устройств в ipset, я пытаюсь --mark-set пакеты, которые приходят с этих устройств, чтобы tc может предназначаться для них с формированием трафика.

Моя текущая настройка:

tc qdisc del root dev $LAN
tc qdisc add dev $LAN root handle 1: htb default 20
tc class add dev $LAN parent 1: classid 1:1 htb rate 6mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:10 htb rate 5mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:20 htb rate 2mbit ceil 2mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:30 htb rate 512kbit ceil 512kbit burst 15k
tc qdisc add dev $LAN parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $LAN parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $LAN parent 1:30 handle 30: sfq perturb 10
tc filter add dev $LAN protocol ip parent 1: prio 1 handle 6 fw flowid 1:30


$IPS create throttled hash:mac -exist
$IPS add throttled 00:11:22:33:44:55 -exist
$IPT -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6

Это не удручает меня до 512 кбит / с (при условии, что мой MAC-адрес - тот, который предоставлен), оно возвращается к значениям по умолчанию 2 Мбит / с

Если я удалю --match-set часть, это правильно дросселирует все устройства до 512 кбит / с (что заставляет меня думать, tc раздел правильный)

Тем не менее, если я DROP пакеты, которые соответствуют этому набору, он корректно отбрасывает пакеты (что заставляет меня думать, что iptables раздел правильный)

Я что-то здесь упускаю или эти две команды нельзя использовать вместе, как это?

Любая помощь с благодарностью.

Спасибо,

2 ответа

Одна мысль... ваш набор содержит MAC-адреса, но я подозреваю, что правило PREROUTING пытается сопоставить IP-адреса src или dst, а не MAC-адреса.

Надеемся, что через год вы выяснили свою проблему, однако в интересах тех, кто за ней последует, ниже приводится объяснение хотя бы одной из ваших проблем.

На основе ipset пример, который вы предоставили, ваш iptables правила недействительны. Тип набора hash:mac хранит только одно поле. Однако ваш оператор iptables тестирует набор так, как будто он содержит пары данных (т. Е. Два поля, такие как mac,IP или mac,net). Таким образом, вы сопоставляете записи в наборе, используя исходный MAC-адрес пакета и неопределенное поле назначения из пакета:

ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6

Однако из-за используемого типа набора вы можете сравнивать только одно поле. Следующий оператор iptables показывает правильный метод для соответствия исходному MAC-адресу, содержащемуся в наборе:

ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src -j MARK --set-mark 6

Чтобы проиллюстрировать, рассмотрим, если у вас был набор с типом hash:net,port,net на брандмауэре. Набор будет хранить тройки (две сети и один порт).

Давайте предположим, что брандмауэр имеет следующие записи ipset и правила iptables:

# creates set
ipset create throttled hash:net,port,net
ipset add services 192.168.0.0/16,tcp:80,192.168.1.80/32
ipset add services 192.168.0.0/16,tcp:443,192.168.1.80/32

# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD

# allows traffic to web server
iptables -A FORWARD -m set --match-set services src,dst,dst -j ACCEPT

# allows traffic from web server
iptables -A FORWARD -m set --match-set services dst,src,src -j ACCEPT

# drop all other traffic
iptables -P DROP

Вышеуказанные правила функционально эквивалентны:

# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD

# allows traffic to web server
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 80  -d 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 443 -d 192.168.1.80/32 -j ACCEPT

# allows traffic from web server
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 80  -s 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 443 -s 192.168.1.80/32 -j ACCEPT

# drop all other traffic
iptables -P DROP

Хотя два вышеупомянутых метода являются функционально эквивалентными, метод ipset будет работать лучше с большим количеством записей благодаря использованию поиска в хэш-таблицах по сравнению с линейными оценками правил iptables.

При использовании множеств тип набора определяет, сколько совпадающих полей используется. Оператор iptables указывает, используются ли поля источника или назначения пакетов для соответствия каждому полю набора.

Ниже приведены несколько сопоставлений для иллюстрации:

 ipset type        | iptables match-set | Packet fields
 ------------------+--------------------+---------------------------------
 hash:net,port,net | src,dst,dst        | src IP address, dst port, dst IP address
 hash:net,port,net | dst,src,src        | dst IP address, src port, src IP address
 hash:ip,port,ip   | src,dst,dst        | src IP address, dst port, dst IP address
 hash:ip,port,ip   | dst,src,src        | dst IP address, src port, src ip address
 hash:mac          | src                | src mac address
 hash:mac          | dst                | dst mac address
 hash:ip,mac       | src,src            | src IP address, src mac address
 hash:ip,mac       | dst,dst            | dst IP address, dst mac address
 hash:ip,mac       | dst,src            | dst IP address, src mac address

У вас могут возникнуть дополнительные проблемы при взаимодействии с TC/iptables, однако это должно как минимум решить вашу проблему с ipset/iptables.

Другие вопросы по тегам