Правила почти те же самые, но с pipe tablearg вместо netgraph tablearg:
ipfw pipe 100 config bw 1000Kbyte/s
ipfw pipe 101 config bw 2000Kbyte/s
...
ipfw table 1 add 192.168.2.1 100
ipfw table 1 add 192.168.2.2 100
ipfw table 1 add 192.168.2.3 100
ipfw table 1 add 192.168.2.4 101
ipfw table 1 add 192.168.2.5 101
...
ipfw add pipe tablearg ip from table(1) to any out via $ext_if
Для входящего трафика нужен еще один набор пайпов, аналогичная таблица и одно правило для классификации. Правда на практике я это дело не обкатывал, т.к. достаточно и динамических пайпов с одним юзером на канал. Минусом этого решения по сравнению с динамическими правилами является то, что пайпы для каждого клиента надо создавать явным образом. Но все равно, правила с tablearg в ipfw получаются намного проще, чем километровые правила для tc в Linux.
А если еще одному клиенту нужно зарезать или еще один тариф создать - это еще pipe создавать ?Вот от этого и уходили.
Сделали один раз два правила и забыли. Далее все автоматом при выборе тарифа из биллинга.