Всех приветствую! Разговор пойдет о консольной утилите 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 уже много лет назад, но она хоть немного структурирует знания, полученные из мана. На этом у меня все, спасибо за внимание!