Фильтрация в UNIX: iptables, ipfw, nftables, bpfilter, firewalld, conntrack

Фильтрация на базе DPDK
firewalld

Является надстройкой над Iptables

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 нет

 

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"
Conntrack

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

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.
IPtables

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

Схема

Схема обработки пакетов в Iptables.

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 … –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

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

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

Удаляем входящие правило 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

 

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