Фильтрация и packet flow в UNIX: iptables, ipset, ipfw, nftables, bpfilter, firewalld, conntrack, BPF, packetfilter

Фильтрация на базе DPDK
packet flow (pipeline)

Тут только packet flow, подробнее в отдельном разделе.

Netfilter-packet-flow.svg

         еще одна вариация

iface input -> xdp -> qdisc (ingress) -> brouting -> prerouting -> conntrack -> prerouting -> forward -> postrouting -> qdisc (egress) -> iface output

  • CloudFlare:
XDP -> qdisc -> IPTABLES -> SOCKET -> APPLICATION

XDP

Самый быстрый фильтр, быстрее может быть потенциально только на базе самой NIC и DPDK. XDP используют cloudflare для защиты от DoS/DDoS и это о многом говорит.

numbers-xdp-1

XDP причем более гибкий в сравнении с iptables – там ты можешь написать свою app.

performance
They wrote a filter that filters all UDP traffic (or some UDP traffic? unclear). They tried implementing the rule in iptables and compared it to their custom XDP approach.

iptables: 4.5 million packets/second (у cloudflare хуже результат выше)
XDP: 9.7 million packets/second

performance definitely isn’t the only benefit over iptables though – it’s definitely really important that with XDP you can write arbitrary code.

 

firewalld (firewall-cmd)

Является надстройкой над Iptables. Примеры применения firewall-cmd описаны в статьях по деплою ftp/tftp на базе CentOS7.

 

nftables

Разработчики Netfilter официально объявили инструментарий iptables устаревшим.

nftables является проектом по замене фреймворков iptables, ip6tables, arptables[en], ebtables в межсетевом экране Netfilter.

И nftables и bpfilter  умеют транслировать команды (часть nftables и как понимаю все bpfiler) традиционного синтаксиса iptables в “свои”.

Как я понял nftables в сравнении с iptables:
1) + быстрее за счет уменьшения строк кода + сам код меньше памяти занимает. Это достигается за счет использования ассоциированных масивов (хешей/картежей) в nftables можно создавать правила (например SNAT, DNAT с разных IP на разные IP), аналогичные Iptables, только имеющие значительно меньше строк.

2) + может обновляться без пересборки ядра

3) + использование netlink вместо системных вызовов (огромный ряд плюсов напр. netlink позволяет поддерживать синхронность, ядро может отдавать данные в приложение без опроса)

4) – ipt_netflow нет

 

EBTABLES

В них можно использовать bridge правила – broute/brouting. Схемы выше.

(e)BPF

BPF filters are widely used by the Linux kernel, TCP dump and others. Basically any tcpdump filtering tutorial can be used to define a filter for TRex.

Some simple examples using BPF:
All ARP or ICMP packets:
'arp or icmp'
All UDP packets with destination port 53:
'udp and dst 53'
All packets VLAN tagged 200 and TCP SYN:
'vlan 200 and tcp[tcpflags] == tcp-syn'
Hardware BPF

BPF в целом очень перспективное направление – оно позволяет сделать фильтрацию по байт коду еще до Kernel без всяких kernel bypass (как в случае DPDK) еще на уровне NIC. Но пока не полноценное – сложные фильтры пока не реализуемы, для загрузки BPF кода на NIC нужна поддержка NIC такого действия.

 

bpfilter

Является проектом, который должен заменить всех тех же что и nftables, только и сам nftables))))))))

И nftables и bpfilter  умеют транслировать команды (часть nftables и как понимаю все bpfiler) традиционного синтаксиса iptables в “свои”.

 

EBPF

eBPF (Extended Berkeley Packet Filter)

eBPF очень активно используют CloudFlare для работы с трафиком.

The talk ended up being mostly about BPF. It seems, no matter the question - BPF is the answer.

 

Сессии

Сессии на порту

netstat -na | grep ":33231"
ss | grep ":33231"

Количество сессий

netstat -pant | wc -l
Conntrack

Conntrack netfilter – модуль для отслеживания/управления соединениями. Используется при NAT и “улучшенной” пакетной фильтрации.

Пример настроек conntrack для высокопроизводительных серверов с NAT и для минимизации влияния DOS в статье DOS.

Connection tracking keeps a record of what packets have passed through your machine, in order to figure out how they are related into connections. This is required to do Masquerading or other kinds of Network Address Translation. It can also be used to enhance packet filtering (see `Connection state match support' below).

Usage

# conntrack –E # смотрим онлайн

# conntrack -L # аналог cat /proc/net/ip_conntrack
conntrack v1.2.1 (conntrack-tools): 999889 flow entries have been shown.
 999889 14998333 158996207

# conntrack -F
conntrack v1.2.1 (conntrack-tools): connection tracking table has been emptied.

# /proc/sys/net/ipv4/netfilter/ip_conntrack_max # макс. количество соединений

 

IPSET

Используется для блокировки спама/DoS/DDoS в связке с iptables. Еще примеры. Пример блокировки пула (китайские IP).

# apt install ipset

# ipset create countryblock nethash
# ipset add countryblock 1.0.1.0/24
# ipset add countryblock 1.0.2.0/23
# ipset add countryblock 1.0.8.0/21
# ipset add countryblock 1.1.0.0/24
# ipset add countryblock 1.1.2.0/23

# iptables -A INPUT -m set --match-set countryblock src -j DROP

 

IPtables

Разработчики Netfilter официально объявили инструментарий iptables устаревшим. См. Nftables/bpfilter. Схемы обработки выше.

IPtables часто работает в связке с fail2ban. Fail2ban автоматически добавляет правила в iptables: после нескольких некорректных авторизаций (bruteforce), после обнаруженной атаки по порогу (syn flood) или других атак (можно самому паттерны создавать). Причем при массовой атаке в iptables может оказаться до нескольких тысяч-десятков тысяч адресов одновременно. На событие добавления блокировки может служить триггером – отправить email/sms/etc. 

 

Команды

Простейшая установка и настройка.

iptables –list или –L – смотрим правила iptables. Для просмотра нужны права админа.

~$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination 

$ iptables --list
iptables v1.4.20: can't initialize iptables table `filter': Permission denied (you must be root)

iptables -nvL – смотрим правила по категориям, используя -nat так же смотрим правила prerouting/postrouting.

# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

iptables … –line-numbers – нумеруем правила

iptables -L -vn --line-numbers | grep <ip or comment>

iptables … -tee – c помощью IPTABLES можно зеркалировать трафик который идет к хосту, перенаправляя копию пакета к другому хосту используя опцию tee.

There is an experimental target (ROUTE) which offers an option (--tee) that behaves like the good old linux “tee” command.  It copies a packet to a target ip address and then goes on with the normal behaviour (routing it to it’s normal target.)
This will send a copy of all packets to the monitor pc with the ip 192.168.1.254.
iptables -A PREROUTING -t mangle -j ROUTE --gw 192.168.1.254 --tee
iptables -A POSTROUTING -t mangle -j ROUTE --gw 192.168.1.254 --tee

 

USAGE

Удалить все правила.

iptables -F

Разрешить весь входящий трафик

sudo iptables -I INPUT -j ACCEPT
sudo iptables -D INPUT 1

Разрешить весь исходящий трафик

sudo iptables -I OUTPUT -j ACCEPT
sudo iptables -D OUTPUT 1

Добавляем входящие правило N 93 c разрешением для определенного TCP порта, определенного хоста.

sudo iptables -I INPUT 93 -s 66.133.109.36 -p tcp -m tcp --dport 80 -m comment --comment "HTTP for let's encrypt certbot" -j ACCEPT

Запретить трафик еще на уровне prerouting (смотри выше в схемах).

iptables -t raw -I PREROUTING -m iprange --src-range 1.2.3.0-1.2.3.250 -j DROP

Запретить трафик на порт 80.

iptables -A INPUT -p tcp --dport 80 -j DROP

Запретить трафик на порт 80 с reject и tcp reset или icmp host uncreachable.

iptables -A INPUT -p tcp --dport 80 -j REJECT
iptables -A INPUT -p tcp --dport 80 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --dport 80 -j REJECT --reject-with icmp-host-unreachable

Удаляем входящие правило N 93

sudo iptables -D INPUT 93

Смотрим трафик (gentoo)

sudo tail -f /var/log/kern.log | grep TCP

 

IPTABLES + SSHD

На примере CentOS 7 ограничиваем доступ к SSH серверу. Не забываем на всякий случай сделать аналогичные настройки в самом демоне ssh – реализуем концепцию defense in depth (даже если по какой-то причине “рухнет” iptables, будет продолжать работать защита на базе application).

/etc/ssh/sshd_config
AllowUsers <username>@<ip>

Прописываем конкретный хост для доступа по SSH порту

sudo iptables -I IN_public_allow 5 -s <IP> -p tcp -m tcp --dport <ssh port> -m comment --comment "SSH from <LOCATION>" -j ACCEPT

Удаляем стандартный доступ со всех хостов

sudo iptables -D IN_public_allow 1

 

pfctl

pfctl используется для управления BSD (FreeBSD, OpenBSD) packet filter.

 

IPFW

IPFW – считается очень хорошим файрволом на FreeBSD – быстрым, удобным, с большим количеством функционала. У мелких провайдеров зачастую используются FreeBSD тачки с BRAS-функционалом (политика разрешения + шейпер) на базе IPFW – например, по IP пользователя узнаем его тариф из базы, на его основе назначаем bandwidth в ACL для трафика с этого IP.

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

Один пример (разрешаем конкретные типы ICMP):

${FwCMD} add allow icmp from any to any icmptypes 0,8,11

Еще пример с bash-логикой (режем bandiwdth по ночам чтобы не качали непонятно кто, непонятно что):

Также, необходимо заметить, что сам файл файрволла, по сути является shell-скриптом,  - со всеми вытекающими плюсами - типа регулировка траффика день/ночь, в последнем примере..chour=`date '+%H'`
if [ ${chour} -lt 8 ]; then
    ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn}
    ${FwCMD} pipe 1 config bw 33600 bit/s
fi
if [ ${chour} -ge 22 ]; then
    ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn}
    ${FwCMD} pipe 1 config bw 33600 bit/s
fi

 

Leave a Reply