У меня проблемы с тем, что, по моему мнению, должно быть довольно простой проблемой формирования трафика.
У меня есть сервер Ubuntu (16.04), который действует как маршрутизатор / нат. Я хочу разрешить большинству пользователей использовать Интернет со скоростью 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
раздел правильный)
Мне что-то здесь не хватает, или эти две команды нельзя использовать вместе вот так?
Любая помощь очень ценится.
Спасибо,
Одна мысль ... ваш набор содержит 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.