В моем 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