Назад | Перейти на главную страницу

Задержка пакетов с помощью libnetfilter_queue

В моем Raspberry Pi, настроенном как точка доступа, я установил следующие правила:

sudo iptables -I FORWARD -p tcp --sport 25 -j NFQUEUE --queue-num 0
sudo iptables -I FORWARD -p tcp --sport 80 -j NFQUEUE --queue-num 1
sudo iptables -I FORWARD -p udp --sport 5060 -j NFQUEUE --queue-num 2
sudo iptables -I FORWARD -p tcp --sport 5060 -j NFQUEUE --queue-num 2

Моя цель - пересылать пакеты, приходящие с порта 5060, до пакетов с порта 80 и намного раньше пакетов с порта 25 (грубая реализация качества обслуживания, когда я пытаюсь дать наивысший приоритет «пакетам Skype» (с 5060), средний приоритет для «пакетов HTTP» (порт 80) и низкий приоритет для «пакетов SMTP» (порт 25)).

я использую libnetfilter_queue библиотека: как я могу использовать nfq_set_verdict задержать пакет с низким приоритетом?

NF_QUEUE вводит пакет в другую очередь (номер целевой очереди находится в старших 16 битах вердикта), но не продолжать итерации

NF_REPEAT повторяет тот же цикл еще раз

Может быть, я чего-то не понимаю о двух вышеупомянутых флагах: как я могу использовать их, чтобы задержать пакет с низким приоритетом?

Вам не нужно делать NF_DROP вердикт по входящему пакету и повторно отправить его через необработанный сокет. Вы можете держать пакет в своей очереди и вынести вердикт позже (скажем, после некоторой задержки).

Я написал простой формирователь трафика в пользовательском пространстве Linux с помощью этой техники: https://github.com/vmxdev/damper/

Использование только NFQUEUE для задержки пакетов упрощает iptables правила. Вам не нужно думать, из какого интерфейса повторно вставлять пакеты и как он будет взаимодействовать с conntrack.

Получил ответ: я этого не знал nfq_set_verdict может быть вызван только один раз для каждого пакета, поэтому после выполнения NF_DROP вердикт по каждому пакету (после его копирования в мое пользовательское приложение) я не могу позвонить снова nfq_set_verdict с участием NF_ACCEPT. Поэтому откройте raw сокет для отправки пакетов в очереди.

https://stackoverflow.com/questions/31368816/sending-queued-packets-with-nfqueue