Молодогвардейцев 454015 Россия, Челябинская область, город Челябинск 89085842764
MindHalls logo

Iptables — настройка Firewall для Linux

Всех приветствую! Разговор пойдет о консольной утилите iptables для Linux систем, которую смело можно обозвать полноценным сетевым экраном. Разобраться в ней «с наскока» не так просто, как хотелось бы, страница с маном кажется просто огромной простыней лишнего текста, не понятно для кого написанной. Конечно, это только мое мнение, именно поэтому я и решил написать эту шпаргалку по iptables, чтобы в следующий раз идти уже по проторенной дорожке.

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

Firewall Iptables

Как гласит викиучебник, iptables является оболочкой над netfilter, которая повсеместно принята за стандарт. Часто под iptables понимают сам межсетевой экран netfilter, и мы не станем исключением. Хотя вообще весь набор программ — межсетевой экран + утилита для управления им так и называется: netfilter/iptables.

Сетевой экран умеет блокировать, пропускать, перенаправлять пакеты, следуя определенными, очень гибким настраиваемым правилам. В том числе: фильтрация по протоколу передачи, по адресу источника, по адресу назначения, по номеру порта.

Колдовать можно как угодно, но сейчас я приведу основные конструкции, на примере которых можно гибко настроить межсетевой экран для своего Linux`а.

Основные команды Iptables

Вообще вся работа с iptables должна выполняться исключительно от рута. В примерах я буду писать чистые команды, например, без sudo для Ubuntu, но имеем ввиду, что консоль открыта от имени рута.

Самая важная команда: посмотреть текущую таблицу правил iptables

iptables -L -n -v

Ключ -L в прямом смысле слова означает List(список).
Ключ -n говорит о том, что нужно выводить значения в цифровом виде(не localhost, а 127.0.0.1).
Ключ -v выводит дополнительные данные, увеличивает информативность таблицы.

Добавление записи

iptables -A {INPUT|OUTPUT} -p {protocol} --dport {номер порта} -J {действие}

Первый ключ -A говорит нам о том, что мы добавляем правило в таблицу INPUT(входящие) или OUTPUT(исходящие).
Ключ -p позволяет указать протокол передачи, возможные значения: tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh.
Ключ —dport (два минуса) позволяет задать номер порта.
Самый главный ключ -j означает действие, которое нужно совершить с пакетом, попавшим под все остальные условия: ACCEPT(принять), DROP(отбросить), LOG(записать данные в лог).

Удаление записи

iptables -D {INPUT|OUTPUT} -p {protocol} --dport {номер порта} -J {действие}

Удалить запись с текущими параметрами из таблицы INPUT или OUTPUT.

Некоторые примеры настройки iptables

Разрешить icmp пакеты из всех сетей кроме хоста 10.41.171.175.

iptables -A INPUT -p icmp -s 10.41.171.175 -j DROP
iptables -A INPUT -p icmp -j ACCEPT

Разрешить доступ на 22 порт по протоколу tcp с хоста 10.41.171.175.

iptables -A INPUT -p tcp --dport 22 -s 10.41.171.175 -j ACCEPT

Разрешить доступ из всей подсети 10.41.0.0/16, на 80 порт по tcp.

iptables -A INPUT -p tcp --dport 80 -s 10.41.0.0/16 -j ACCEPT

Разрешить входящий udp трафик на порты 1000-20000

iptables -A IPNPUT -p udp --dport 1000:20000 -j ACCEPT

Запросы на 22 порт с любого хоста, кроме 10.41.171.175 должны обрабатываться.

iptables -A INPUT -p tcp --dport 22 ! -s 10.41.171.175 -j DROP

Логировать все пакеты, которые будут отброшены.

iptables -A INPUT -j LOG
iptables -A INPUT -j DROP

Заключение

Строго говоря, моя маленькая шпаргалка не привносит новизны, все это описано в man iptables уже много лет назад, но она хоть немного структурирует знания, полученные из мана. На этом у меня все, спасибо за внимание!