У меня есть общедоступный HTTP-сервер под управлением FreeBSD.
Nginx позволяет мне ограничивать пропускную способность для каждого соединения, но я не хочу ограничивать каждый IP-адрес только одним соединением, поэтому мне нужно решение для ограничения каждого IP-адреса. Nginx не может сделать это для меня, и сторонние модули для этого больше не поддерживаются.
Поскольку nginx не является вариантом, я полагаю, что что-то на уровне ОС должно быть в состоянии справиться с этим, но все остальные вопросы и ответы, похоже, предполагают, что я знаю IP-адреса, с которых я хочу передавать данные. Поскольку мой сервер является общедоступным HTTP-сервером, я хочу формировать трафик не для определенного набора IP-адресов, а для каждого IP-адреса, сгруппированного по IP.
Есть ли способ, которым FreeBSD может ограничить пропускную способность для каждого IP-адреса для всех IP-адресов?
Кстати, моим решением для резервного копирования является Varnish, который, похоже, поддерживает этот сценарий, но будет дополнительным программным обеспечением для поддержки.
На самом деле есть. Это называется динамические очереди если нужна приоретизация, или динамические трубы вам нужно формирование, оба реализованы в ДУММИНЕТ. Их можно объединить, чтобы получить настоящую CBQ-конфигурацию.
Краткий пример динамических труб из человек 8 ipfw:
Более сложный пример - ограничение исходящего трафика в сети с помощью ограничений на хост, а не на сетевые ограничения:
ipfw add pipe 1 ip from 192.168.2.0/24 to any out ipfw add pipe 2 ip from any to 192.168.2.0/24 in ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s queue 20Kbytes ipfw pipe 2 config mask dst-ip 0x000000ff bw 200Kbit/s queue 20Kbytes
Я думаю, вы также можете включить HTTP / 2 в nginx, тем самым уменьшив количество подключений, используемых каждым клиентом с поддержкой HTTP / 2.