LINUX.ORG.RU
ФорумAdmin

Traffic control, ingress на IFB

 ,


0

2

Доброго времени суток!

Имеется вопрос, нужно «ограничить» входящий трафик на роутере, роутер это компьютер с установленной Ubuntu server 18.04.
Причина довольно банальна, за роутером есть сервер Тимспика и WEB сервер, периодически всякие «творческие» личности DDOS-ят, я понимаю что от таких атак простыми средствами не защитится, но мне захотелось кое-что проверить.
Допустим у меня канал 200мбит, одна из «творческих» личностей посылает на любой из прокинутых портов до любого сервера трафик в 100мбит, по скольку порт прокинут то трафик не оседает на самом роутере, а проходит до сервера и серверу «плохеет».
Если я за компом, то естественно я его заблокирую, а вот для случаев когда меня нет на месте и нужно ограничить поступление трафика к серверу.
ingress police - может ограничивать или весь канал или только IP и подсети, а мне хотелось чтобы любой пытающийся соединиться с серверами получал ограничение на передачу трафика к серверу, но не буду же я создавать кучу фильтров с кучей подсетей со всего интернета.
На этом же форуме я прочитал что советуют поднять виртуальный интерфейс IFB и перенаправить весь трафик на него и потом уже на этом интерфейсе работать как с обычным egress трафиком.

Вот что у меня получилось:

###########################################################################################################################################

tc qdisc del dev ifb0 root &> /dev/null
tc filter del dev ifb0 &> /dev/null
tc class del dev ifb0 &> /dev/null
tc qdisc del dev ppp0 ingress &> /dev/null
tc qdisc del dev ppp0 handle ffff: ingress &> /dev/null

modprobe ifb numifbs=1
ip link set dev ifb0 up

tc qdisc add dev ifb0 root handle 1: htb default 30

tc class add dev ifb0 parent 1: classid 1:1 htb rate 200mbit burst 256k

tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 10mbit ceil 100mbit burst 128k prio 1
tc class add dev ifb0 parent 1:10 classid 1:110 htb rate 800kbit ceil 1200kbit burst 10k prio 1

tc class add dev ifb0 parent 1:10 classid 1:120 htb rate 2mbit ceil 4mbit burst 20k prio 2

tc class add dev ifb0 parent 1:1 classid 1:30 htb rate 100mbit ceil 200mbit burst 256k prio 3

tc qdisc add dev ifb0 parent 1:110 handle 110: sfq perturb 10
tc qdisc add dev ifb0 parent 1:120 handle 120: sfq perturb 10
tc qdisc add dev ifb0 parent 1:30 handle 20: sfq perturb 10

tc filter add dev ifb0 pref 1 parent 110: protocol ip handle 2 flow hash keys src divisor 1024
tc filter add dev ifb0 pref 1 parent 120: protocol ip handle 2 flow hash keys src divisor 1024
tc filter add dev ifb0 pref 1 parent 20: protocol ip handle 2 flow hash keys src divisor 1024

tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ip protocol 0x11 0xff match ip dport 9988 0xffff match ip dst xx.xx.xx.xx/32 flowid 1:110
tc filter add dev ifb0 parent 1: protocol ip prio 2 u32 match ip protocol 0x6 0xff match ip dport 30033 0xffff match ip dst xx.xx.xx.xx/32 flowid 1:120
tc filter add dev ifb0 parent 1: protocol ip prio 2 u32 match ip protocol 0x6 0xff match ip dport 80 0xffff match ip dst xx.xx.xx.xx/32 flowid 1:120
tc filter add dev ifb0 parent 1: protocol ip prio 3 u32 match ip src 0.0.0.0/0 flowid 1:1

tc qdisc add dev ppp0 ingress handle ffff:
tc filter add dev ppp0 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0 ###########################################################################################################################################

Вроде бы даже работает, но некоторые пользователи говорят что не могут зайти на ТС сервер когда эти правила включены, потому хотел бы чтобы знающие люди поглядели и указали мне на возможные ошибки.
p.s. Даже при практически не загруженном сервере я вижу что у меня постоянно увеличиваются overlimits на корневом классе, на остальных (dropped, overlimits и requeues) нулёвые, хотя счётчики пакетов меняются, это нормально или нет.
qdisc htb 1: dev ifb0 root refcnt 2 r2q 10 default 48 direct_packets_stat 0 ver 3.17 direct_qlen 1000 Sent 66261555 bytes 685628 pkt (dropped 0, overlimits 741 requeues 0)


Сначала «щупают» с разных адресов, собирается коллекция откуда можно стукнуть, а потом со всей этой «коллекции» разом - звездык и наши в дамках. Ну и как такое шейпить по адресам/подсетям? Вычислять любопытных и запрещать «навеки». Личное мнение такое. То, что вы делаете - это хорошо для ограниченного круга заведомо лояльных пользователей, но не для беспредела тырнета в целом.

anonymous
()

у ifb есть родовая травма - трафик через него нельзя контролировать с помощью iptables/ipset/conntrack

И для решения этой проблемы был создан IMQ, но у него другая родовая травма - его нет и не будет в официальном ядре.

А с другой стороны - сервис можно запустить в отдельном netns и форвардить туда с использованием iptables/ipset/conntrack/dpi/tc

Зачем шейпить ботов? Их дропать нужно.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Простите, но я не понял, то есть вы хотите сказать что трафик из IFB не попадает в iptables/ipset/conntrack или то что по какой то причине он перестаёт нормально отслеживаться.

Просто судя по схеме которую я видел в инете при переадресации трафика IFB интерфейс ставиться между тем интерфейсом с которого он получает трафик и iptables, то есть с «egress IFB» трафик идёт дальше своим обычным маршрутом, как с родного интерфейса.
Ткните меня носом туда где можно почитать об проблеме которую вы упомянули...!
И даже если вы правы, то чем по вашему я могу заменить IFB или как иначе сделать то что мне нужно...?

Uranus
() автор топика

Надо ceil и burst подгонять друг к другу, давно было не помню подрости. Попробуй плавно уменьшать burst и он же вроде не в килобайтах а пакетах, мб вообще 256 вместо 256k надо писать.

Yur4eg ★★
()
Ответ на: комментарий от Uranus

Трафик проходящий через IFB не попадает в iptables как трафик проходящий через устройство ifb, но его видно tcpdump-ом

После выхода из ifb (если его не дропнули) трафик попадает в iptables/conntrack, но обнаружить прохождение через ifb очень непросто.

До сих пор нет реальной схемы прохождения трафика через сетевой стек. Если кто-нибудь найдет актуальную схему, то свисните погромче!

tc filter работает до iptables/raw

ifb удобно использовать если правила шейпига простые ( т.е. укладываются в понятия iproute2/filter ). Динамических правил там не предусматривалось.

Если шейпить нужно выборочно, то либо можно воспользоваться IMQ (там можно шейпить в mangle/prerouting и в mangle postrouting).

vel ★★★★★
()
Ответ на: комментарий от Yur4eg

А что это как то влияет на то что у меня народ не может зайти на сервер.
Я в большинстве примеров видел задание burst именно в килобайтах, TC и принимает его в килобайтах, кроме того в описании сказано что это типа буфера и уменьшать его наоборот не надо, будет больше мол ничего страшного только памяти будем больше тратить...

Uranus
() автор топика
Ответ на: комментарий от vel

Ага, нашёл то о чём вы говорили, почитал, ндя..., обидно, но не понятно тогда почему у меня всё же часть народа умудряется зайти на сервер если IFB нормально не работает?

Кстати глупый вопрос, вот есть интерфейс, любой, например тот же самый PPP, у него есть вход и выход.
Вопрос будет в том, для трафика с интернета и для трафика с самого роутера точка входа одна и та же или же для трафика с интернета это вход, а для трафика с роутера выход.
Точка входа будет одна и та же или же для трафика идущего с разных сторон разная.

инет---->вход<<<интерфейс PPP>>>выход---->роутер
роутер---->вход<<<интерфейс PPP>>>выход---->инет

Из этого вопроса вытекает следующий, раз у интерфейса есть вход и выход, почему нельзя шейпить входящий интернет трафик на выходе PPP интерфейса, без всяких IFB ?

Uranus
() автор топика
Ответ на: комментарий от Uranus

ifb/imq нужно применять либо в случае когда обработка трафика осуществляется самим хостом-роутером (т.е. попадает в iptables/input), либо когда трафик форвардится через разные интерфейсы.

в твоей схеме необходимости в ifb/imq нет.

vel ★★★★★
()
Ответ на: комментарий от vel

Хорошо, если вы так считаете, но тогда как мне узнать сколько трафика в секунду мне закидывают на проброшенный порт с определённого IP и как его дропнуть если он превышает лимит, что-то не пойму как это без шейпера сделать?!

Uranus
() автор топика
Ответ на: комментарий от vel

Спасибо за информацию, я попробую, если что будет непонятно напишу.

Uranus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.