Как альтернатива использованию u32 модуля netfilter, который, поскольку Вы нашли, в значительной степени не документирован, Вы могли использовать nfnetlink_queue
подсистема netfilter. Идея состоит в том, что Вы отправляете пакеты посредством процесса пространства пользователя (скорее всего, демон), который исследует пакеты, ОТМЕЧАЕТ их, как он считает целесообразным и затем возвращает их netfilter для последующей обработки.
Механика этого относительно проста. iptables
QUEUE
и NFQUEUE
цели помещают выбранные пакеты на очередь, и процесс пространства пользователя берет пакеты оттуда через nfnetlink_queue
API (документация здесь). Когда каждый пакет возвращается к netfilter от пространства пользователя, МАРК, установленный процессом, может привыкнуть к прямым пакетам посредством последующей обработки (скажем, iptables
или tc
).
Протест: Я на самом деле никогда не реализовывал решение с помощью модуля очереди netlink, таким образом, у меня нет собственного опыта относительно его потенциальной устойчивости, безопасности или производительности. Очевидно, демон пространства пользователя, через которого потоки сетевых пакетов должны были бы быть разработаны с изрядным количеством ухода.
Проект Mongo DB рекомендует установить
kern.threads.max_threads_per_proc=32000
kern.maxfilesperproc=64000
в /etc/sysctl.conf
. Вы можете запустить /etc/rc.d/sysctl restart
, чтобы новые настройки вступили в силу немедленно, или перезагрузитесь (независимо от того, что плавает ваша лодка)