Узнать данные об обращении к хосту iptables. Основные понятия iptables в Linux. итак что там с любимым squid

Введение и история

Netfilter - межсетевой экран (он же, брандмауэр, он же файерволл, он же firewall...) встроен в ядро Linux с версии 2.4. Netfilter управляется утилитой iptables (Для IPv6 - ip6tables). До netfilter/iptables был Ipchains , который входил в состав ядер Linux 2.2. До ipchains в Linux был так называемый ipfw (IPV4 firewal) , перенесенный из BSD. Утилита управления - ipfwadm. Проект netfilter/iptables был основан в 1998. Автором является Расти Расселл (он же руководил и прошлыми разработками). В 1999 г. образовалась команда Netfilter Core Team (сокращено coreteam). Разработанный межсетевой экран получил официальное название netfilter. В августе 2003 руководителем coreteam стал Харальд Вельте (Harald Welte).

Проекты ipchains и ipfwadm изменяли работу стека протоколов ядра Linux, поскольку до появления netfilter в архитектуре ядра не существовало возможностей для подключения дополнительных модулей управления пакетами. iptables сохранил основную идею ipfwadm - список правил, состоящих из критериев и действия, которое выполняется если пакет соответствует критериям. В ipchains была представлена новая концепция - возможность создавать новые цепочки правил и переход пакетов между цепочками, а в iptables концепция была расширена до четырёх таблиц (в современных netfilter - более четырех), разграничивающих цепочки правил по задачам: фильтрация, NAT, и модификация пакетов . Также iptables расширил возможности Linux в области определения состояний, позволяя создавать межсетевые экраны работающие на сеансовом уровне.

Архитектура Netfilter/iptables

Предварительные требования ()

Как уже говорилось выше, для работы Netfilter необходимо ядро версии 2.6 (ну или хотя бы 2.3.15). Кроме того, при необходимо наличие настроек CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (таблица filter), CONFIG_IP_NF_NAT (таблица nat), CONFIG_BRIDGE_NETFILTER, а также многочисленные дополнительные модули: CONFIG_IP_NF_CONNTRACK (отслеживание соединений), CONFIG_IP_NF_FTP (вспомогательный модуль для отслеживания FTP соединений), CONFIG_IP_NF_MATCH_* (дополнительные типы шаблонов соответствия пакетов: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (дополнительные действия в правилах: REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINS для совместимости с ipchains, CONFIG_BRIDGE_NF_EBTABLES и CONFIG_BRIDGE_EBT_* для работы в режиме моста, прочие CONFIG_IP_NF_* и CONFIG_IP6_NF_*. Полезно также указать CONFIG_PACKET.

Как видно, таблица nat и mangle может модифицировать получателя или отправителя сетевого пакета. Именно поэтому сетевой пакет несколько раз сверяется с таблицей маршрутизации.

Механизм определения состояний (conntrack)

Выше в тексте несколько раз указывалось понятие "определение состояний", оно заслуживает отдельной темы для обсуждения, но тем не менее я кратко затрону данный вопрос в текущем посте. В общем, механизм определения состояний (он же state machine, он же conn ection track ing, он же conntrack ) является частью пакетного фильтра и позволяет определить определить к какому соединению/сеансу принадлежит пакет. Conntrack анализирует состояние всех пакетов, кроме тех, которые помечены как NOTRACK в таблице raw . На основе этого состояния определяется принадлежит пакет новому соединению (состояние NEW ), уже установленному соединению (состояние ESTABLISHED ), дополнительному к уже существующему (RELATED ), либо к "другому " (неопределяемому) соединению (состояние INVALID ). Состояние пакета определяется на основе анализа заголовков передаваемого TCP-пакета. Модуль conntrack позволяет реализовать межсетевой экран сеансового уровня (пятого ). Для управления данным механизмом используется утилита conntrack, а так же параметр утилиты iptables: -m conntrack или -m state (устарел). Состояния текущих соединений conntrack хранит в ядре. Их можно просмотреть в файле /proc/net/nf_conntrack (или /proc/net/ip_conntrack) .

Чтобы мысли не превратились в кашу, думаю данной краткой информации для понимания дальнейшего материала будет достаточно.

Управление правилами сетевой фильтрации Netfilter (использование команды iptables)

Утилита iptables является интерфейсом для управления сетевым экраном netfilter . Данная команда позволяет редактировать правила таблиц, таблицы и цепочки. Как я уже говорил - каждое правило представляет собой запись/строку, содержащую в себе отбора сетевых пакетов и над пакетами, которые соответствуют заданному правилу. Команда iptables требует для своей работы прав root.

В общем случае формат команды следующий:

Iptables [-t ]

Все параметры в квадратных скобках - необязательны . По умолчанию используется таблица filter , если же необходимо указать другую таблицу, то следует использовать ключ -t с указанием имени . После имени таблицы указывается , определяющая действие (например : вставить правило, или добавить правило в конец цепочки, или удалить правило). задает параметры отбора. указывает, какое действие должно быть выполнено при условии совпадения критериев отбора в правиле (например : передать пакет в другую цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке...).

Ниже приведены команды и параметры утилиты iptables:

Параметр Описание Пример
Команды
--append (-A) Добавить в указанную цепочку и указанную таблицу заданное правило в КОНЕЦ списка. iptables -A FORWARD критерии -j действие
--delete (-D) Удаляет заданное номером(ами) или правилом(ами) правило(а). Первый пример удаляет все правила с номерами 10,12 во всех цепочках, в таблицах filter, второй пример удаляет заданное правило из таблицы mangle в цепочке PREROUTING. iptables -D 10,12
iptables -t mangle -D PREROUTING критерии -j действие
--rename-chain (-E) Изменить имя цепочки. iptables -E OLD_CHAIN NEW_CHAIN
--flush (-F) Очистка всех правил текущей таблицы. Ко всем пакетам, которые относятся к уже установленным соединениям, применяем терминальное действие ACCEPT - пропустить iptables -F
--insert (-I) Вставляет заданное правило в место, заданное номером. iptables -I FORWARD 5 критерии -j действие
--list (сокр. -L) Просмотр существующих правил (без явного указания таблицы - отображается таблица filter всех цепочек). iptables -L
--policy (-P) Устанавливает стандартную политику для заданной цепочки. iptables -t mangle -P PREROUTING DROP
--replace (-R) Заменяет заданное номером правило на заданное в критериях. iptables -R POSROUTING 7 | критерии -j действие
--delete-chain (-X) Удалить ВСЕ созданные вручную цепочки (оставить только стандартные INPUT, OUTPUT, FORWARD, PREROUTING и POSTROUTING). iptables -X
--zero (-Z) Обнуляет счетчики переданных данных в цепочке. iptables -Z INPUT
Параметры
--numeric (-n) Не резолвит адреса и протоколы при выводе.
--line-numbers Указывать номера правил при выводе (может использоваться совместно с -L). iptables -L --line-numbers
--help (-h) куда же без нее
-t таблица Задает название таблицы, над которой необходимо совершить действие. В примере сбрасывается таблица nat во всех цепочках. iptables -t nat -F
--verbose (-v) Детальный вывод. iptables -L -v

Критерии (параметры) отбора сетевых пакетов команды iptables

Критерии отбора сетевых пакетов негласно делятся на несколько групп: Общие критерии, Неявные критерии, Явные критерии. допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. (я бы из назвал необщие ), те критерии, которые подгружаются неявно и становятся доступны, например при указании общего критерия --protocol tcp|udp|icmp . Перед использованием , необходимо подключить дополнительное расширение (это своеобразные плагины для netfilter). Дополнительные расширения подгружаются с помощью параметра -m или --match . Так, например, если мы собираемся использовать критерии state , то мы должны явно указать это в строке правила: -m state левее используемого критерия. Отличие между явными и неявными необщими критериями заключается в том, что явные нужно подгружать явно, а неявные подгружаются автоматически.

Во всех критериях можно использовать знак! перед значением критерия. Это будет означать, что под данное правило подпадают все пакеты, которые не соответствуют данному параметру . Например : критерий --protocol ! tcp будет обозначать, что все пакеты, которые не являются TCP-протоколом подходят под действие правила. Однако последние версии iptables (в частности, 1.4.3.2 и выше), уже не поддерживают этот синтаксис и требуют использования не --protocol ! tcp , а ! --protocol tcp , выдавая следующую ошибку:

Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).

Ниже в виде таблицы приведены часто используемые параметры отбора пакетов:

Параметр Описание Пример
Общие параметры
--protocol
(сокр. -p)
Определяет протокол . Опции tcp, udp, icmp, all или любой другой протокол определенный в /etc/protocols iptables -A INPUT -p tcp
--source
(-s, --src)
IP адрес источника пакета. Может быть определен несколькими путями:
  • Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
  • Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0

Настойчиво не рекомендуется использовать доменные имена, для разрешения (резольва) которых требуются DNS-запросы, так как на этапе конфигурирования netfilter DNS может работать некорректно. Также, заметим, имена резольвятся всего один раз - при добавлении правила в цепочку. Впоследствии соответствующий этому имени IP-адрес может измениться, но на уже записанные правила это никак не повлияет (в них останется старый адрес). Если указать доменное имя, которое резольвится в несколько IP-адресов, то для каждого адреса будет добавлено отдельное правило.

iptables -A INPUT -s 10.10.10.3
--destination
(-d)
IP адрес назначения пакета. Может быть определен несколькими путями (см. --source). iptables -A INPUT --destination 192.168.1.0/24
--in-interface
(-i)
Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами. Применяется в цепочках INPUT, FORWARD и PREROUTING. Возможно использование знака "+", тогда подразумевается использование всех интерфейсов, начинающихся на имя+ (например eth+ - все интерфейсы eth). iptables -t nat -A PREROUTING --in-interface eth0
--out-interface
(-o)
Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами. Применяется в цепочках OUTPUT, FORWARD и POSTROUTING. Возможно использование знака "+". iptables -t nat -A POSTROUTING --in-interface eth1
Неявные (необщие) параметры
-p proto -h вывод справки по неявным параметрам протокола proto. iptables -p icmp -h
--source-port
(--sport)
Порт источник, возможно только для протоколов --protocol tcp, или --protocol udp iptables -A INPUT --protocol tcp --source-port 25
--destination-port
(--dport)
Порт назначения, возможно только для протоколов --protocol tcp, или --protemocol udp iptables -A INPUT --protocol udp --destination-port 67
Явные параметры
-m state --state (устарел)
он же
-m conntrack --ctstate

Состояние соединения. Доступные опции:

  • NEW (Все пакеты устанавливающие новое соединение)
  • ESTABLISHED (Все пакеты, принадлежащие установленному соединению)
  • RELATED (Пакеты, не принадлежащие установленному соединению, но связанные с ним. Например - FTP в активном режиме использует разные соединения для передачи данных. Эти соединения связаны.)
  • INVALID (Пакеты, которые не могут быть по тем или иным причинам идентифицированы. Например, ICMP ошибки не принадлежащие существующим соединениям)
  • и др. (более подробно в документации)
iptables -A INPUT -m state --state NEW,ESTABLISHEDiptables -A INPUT -m conntrack --ctstate NEW,ESTABLISHED
-m mac --mac-source Задает MAC адрес сетевого узла, передавшего пакет. MAC адрес должен указываться в форме XX:XX:XX:XX:XX:XX. -m mac --mac-source 00:00:00:00:00:0

Действия над пакетами

Данный заголовок правильнее будет перефразировать в "Действия над пакетами, которые совпали с критериями отбора ". Итак, для совершения какого-либо действия над пакетами , необходимо задать ключ -j (--jump) и указать, какое конкретно действие совершить.

Действия над пакетами могут принимать следующие значения:

  • ACCEPT - пакет покидает данную цепочку и передается в следующую (дословно - ПРИНЯТЬ).
  • DROP - отбросить удовлетворяющий условию пакет, при этом пакет не передается в другие таблицы/цепочки.
  • REJECT - отбросить пакет, отправив отправителю ICMP-сообщение, при этом пакет не передается в другие таблицы/цепочки.
  • RETURN - возвратить пакет в предыдущую цепочку и продолжить ее прохождение начиная со следующего правила.
  • SNAT источника в пакете. Может использоваться только в цепочках POSTROUTING и OUTPUT в таблицах nat.
  • DNAT - применить трансляцию адреса назначения в пакете. Может использоваться в цепочке PREROUTING в таблице nat. (в исключительных случаях - в цепочке OUTPUT)
  • LOG - протоколировать пакет (отправляется демону ) и обработать остальными правилами.
  • MASQUERADE - используется вместо SNAT при наличии соединения с динамическим IP (допускается указывать только в цепочке POSTROUTING таблицы nat).
  • MARK - используется для установки меток на пакеты, передается для обработки дальнейшим правилам.
  • и др.

Кроме указанных действий, существуют и другие, с которыми можно ознакомиться в документации (возможно, в скором времени я дополню статью в ходе освоения темы). У некоторых действий есть дополнительные параметры.

В таблице ниже приведены примеры и описания дополнительных параметров:

Параметр Описание Пример
DNAT (Destination Network Address Translation)
--to-destination указывает, какой IP адрес должен быть подставлен в качестве адреса места назначения. В примере во всех пакетах протокола tcp, пришедших на адрес 1.2.3.4, данный адрес будет заменен на 4.3.2.1. iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 4.3.2.1
LOG
--log-level Используется для задания уровня журналирования (). В примере установлен максимальный уровень логирования для всех tcp пакетов в таблице filter цепочки FORWARD. iptables -A FORWARD -p tcp -j LOG --log-level debug
--log-prefix Задает текст (префикс), которым будут предваряться все сообщения iptables . (очень удобно для дальнейшего ) Префикс может содержать до 29 символов, включая и пробелы. В примере отправляются в syslog все tcp пакеты в таблице filter цепочки INPUT с префиксом INRUT-filter. iptables -A INPUT -p tcp -j LOG --log-prefix "INRUT-filter"
--log-ip-options Позволяет заносить в различные сведения из заголовка IP пакета. iptables -A FORWARD -p tcp -j LOG --log-ip-options
и др...

На этом закончим теорию о сетевом фильтре netfilter/iptables. В следующей статье я приведу практические примеры для усвоения данной теории.

Резюме

В данной статье мы рассмотрели очень кратко основные понятия сетевого фильтра в Linux. Итак, подсистема netfilter/iptables является частью ядра Linux и используется для организации различных схем фильтрации и манипуляции с сетевыми пакетами. При этом, каждый пакет проходит от сетевого интерфейса, в который он прибыл и далее по определенному маршруту цепочек, в зависимости от того, предназначен он локальной системе или "нелокальной". Каждая цепочка состоит из набора таблиц, содержащих последовательный набор правил. Каждое правило состоит из определенного критерия/критериев отбора сетевого пакета и какого-то действия с пакетом, соответствующего данным критериям. В соответствии с заданными правилами над пакетом может быть совершено какое-либо действие (Например, передача следующей/другой цепочке, сброс пакета, модификация содержимого или заголовков и др.). Каждая цепочка и каждая таблица имеет свое назначение, функциональность и место в пути следования пакета. Например для фильтрации пакетов используется таблица filter, которая содержится в трех стандартных цепочках и может содержаться в цепочках, заданных пользователем. Завершается путь пакета либо в выходящем сетевом интерфейсе, либо доставкой локальному процессу/приложению.

Литература

Довольно много интересной информации на русском содержится тут:

  • http://www.opennet.ru/docs/RUS/iptables/
  • http://ru.wikibooks.org/wiki/Iptables

Более глубоко материал доступен на буржуйском вот тут:

  • http://www.frozentux.net/documents/ipsysctl-tutorial/
  • http://www.netfilter.org/documentation/index.html

С Уважением, Mc.Sim!

Небольшой первоначальный скрипт (правила, iptables faq) для десктопа или простого сервера. В данном случае примеры по работе с портами того или иного ПО, запущенного на вашем компьютере. На любом компьютере необходимо соблюдать меры безопасности. Миф о том, что Linux более защищен — не верен, все зависит от корявости рук администратора. Есть и хорошо защищенные Windows-системы, как и открытые практически любому Linux-системы. Поэтому стоит все-таки немного подумать и о сетевой защите компьютера. Ниже добавлены некоторые правила для iptables, которые могут вначале пригодиться.

Специально заменил $IPT на /sbin/iptables, если кому-то понадобится только одно правило, чтобы не менять что-либо — просто скопировал и выполнил. Естественно, здесь пока мало правил, нет различных VPN и т.д., если есть желание — добавьте.

Эти строки можно скопировать целиком в какой-либо скрипт и просто его выполнить. Для обычных случаев этого вполне хватит. Если какое-либо приложение не может выйти в сеть, специально добавлено логирование. Просто открывайте tail -f /var/log/syslog (или ваше, если отличное от Ubuntu) и смотрите! Если есть вопросы — добавьте их в обсуждение, будем вместе решать.

PS Кроме этих правил, подумайте о том, что стоит взять из статьи Оптимизация TCP.

Как удалить в Iptables правило

Posted by Алексей Убоженко

Я несколько раз сталкивался с тем, что даже неглупые в общем-то люди делают совершенно непростительные ошибки. Например, открывают всему интернету порт, на котором крутится база данных.

Блог о системном администрировании. Статьи о Linux, Windows, СХД NetApp и виртуализации.

Часто так бывает у начинающих DevOps, которые всю жизнь писали код, а теперь в их обязанности входит еще и настройка серверов. В сети есть хорошие туториалы по базовой настройке фаервола в Linux и других *nix, но часто это простыни на множество экранов. Так что, надеюсь, этот более лаконичный туториал кому-нибудь пригодится.

Важно! Очень легко по ошибке так зафаерволить машину, что вы на нее больше не зайдете. Особенно это касается облачных хостингов. Например, если в AWS вы закроете все порты с 1024 по 65536, у машины после ребута почему-то оказываются закрыты вообще все порты. Если вы хоститесь в облаках, настраивайте лучше фаервол через предоставляемый хостингом веб-интерфейс.

Небольшое замечание по терминологии. Фаервол, встроенный в ядро Linux, называется Netfilter, а iptables — утилита для управления этим фаерволом. Многие ошибочно полагают, что фаервол называется iptables. Это не так. Говоря что-нибудь наподобие «я фильтрую пакеты с помощью iptables», вы показываете окружающим свою безграмотность.

Вообще, какие примерно задачи можно решать с помощью Netfilter:

  • Разрешать/запрещать входящий трафик на определенные порты по определенным протоколам (IPv4/IPv6, TCP/UDP) с указанных адресов (IP, MAC) или подсетей;
  • Все то же самое в отношении исходящего трафика;
  • Можно, например, полностью игнорировать все ICMP пакеты;
  • Настройка NAT, см пост про установку и настройку OpenVPN;
  • Слышал, что настоящие гуру умеют настраивать защиту от DDoS и брутфорса, ограничивать доступ в сеть конкретным приложениям, пользователям или группам, и делать другие чумовые вещи;

Отмечу, что утилита iptables мне лично первое время казалась исключительно неудобной по сравнению с ipfw во FreeBSD. К счастью, поработав с ней какое-то время, все это множество флагов вроде -A, -D, -j и прочих становятся привычны, так что, наберитесь терпения. Рассмотрим основные команды.

Показать все правила:

Вы можете заметить, что в Netfilter есть какие-то «цепочки» (chains) — как минимум INPUT, OUTPUT и FORWARD.

У меня лично на машине есть еще и цепочка DOCKER. На первое время можно думать о первых двух, как обо всем входящем и исходящем трафике соответственно, а об остальных временно забыть. Велика вероятность, что они вообще никогда вам не понадобятся.

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

Изменить политику (поведение по умолчанию) цепочки:

iptables -P INPUT DROP
iptables -P INPUT ACCEPT

Запретить доступ с хоста/подсети:

iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/16-j DROP

Также можно использовать доменные имена:

iptables -A INPUT -s example.ru -j DROP

Запрет исходящих соединений:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

В правилах можно использовать отрицания:

iptables -A INPUT !-s 123.45.67.89 -j DROP

Удаление правила по его номеру в цепочке:

iptables -D INPUT 1

Удаление правила на основе того, что оно делает:

iptables -D INPUT -s 123.45.67.89 -j DROP

Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола из /etc/protocols. Флаг —sport указывает порт, с которого был прислан пакет, а —dport указывает порт назначения:

iptables -A INPUT -p tcp —sport80-j ACCEPT
iptables -A INPUT -p tcp —dport80-j ACCEPT

Вставка (insert) правила в начало цепочки:

iptables -I INPUT …

Или можно указать конкретную позицию:

iptables-save >/etc/iptables.rules

Восстановить правила:

iptables-restore

Теперь рассмотрим несколько практических примеров. Так, например, выглядит эмуляция нетсплита в тесте, проверяющем поведение приложения, в котором используется Akka Cluster:

run(node1, s"iptables -A INPUT -s $node2 -j DROP")
run(node1, s"iptables -A INPUT -s $node3 -j DROP")
run(node1, s"iptables -A OUTPUT -d $node2 -j DROP")
run(node1, s"iptables -A OUTPUT -d $node3 -j DROP")

Восстановление происходит точно так же, только флаг -A заменяется на флаг -D.

Другой пример. Требуется выяснить, какие порты прослушиваются на машине, и закрыть лишние. Заходим на машину и говорим:

Пример вывода:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Prog name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3210/nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1789/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 797/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 990/postgres

Nginx и SSHd смотрят в интернет, это нормально. PostgreSQL слушает только локальный интерфейс, поэтому с ним тоже проблем нет. А вот epmd торчит наружу (можно проверить telnet’ом с другой машины), и это никуда не годится. Можно закрыть только порт 4369. Как это сделать, было показано выше. Или можно пойти еще дальше и запретить все соединения извне на порт 81 и старше:

iptables -A INPUT -m multiport \
-p tcp —dports81:65535!-s 127.0.0.0/8-j DROP

Здесь используется расширение multiport, позволяющее указывать диапазоны портов.

Проверяем, что все работает. Если ОК, сохраняем правила:

iptables-save >/etc/iptables.rules

Чтобы правила подхватывались при загрузке системы, создаем новый файл /etc/network/if-pre-up.d/iptables:

iptables-restore exit0

… и говорим:

chmod +x /etc/network/if-pre-up.d/iptables

Проверено, что этот способ работает в Ubuntu 14.04 LTS.

В Debian тоже должно работать. Описание альтернативного способа восстановления правил фаервола при старте системы вы найдете в уже упомянутой заметке про OpenVPN.

Дополнительные материалы для тех, кто хочет знать больше о Netfilter:

А как вы настраиваете фаерволы на своих серверах?

Метки: Linux, Безопасность, Сети.

Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.

Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.

Принцип настройки

Общий синтаксис использования iptables:

iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>

<таблица>

Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

<команда>

Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

<цепочка>

В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

[номер]

Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

<условие>

Условие описывает критерии отработки того или иного правила.

<действие>

Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.

Ключи iptables и примеры их использования

Для работы с таблицами (iptables -t)

Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

Ключ Описание и примеры
-A Добавление правила в конец списка:
iptables -A INPUT -s 192.168.0.15 -j DROP
запретить входящие с 192.168.0.15.
-D Удаление правила:
iptables -D INPUT 10
удалить правило в цепочке INPUT с номером 10.
-I Вставка правила в определенную часть списка:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
вставить правило 5-м по списку.
-R Замена правила.
iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
заменить наше 5-е правило с запрещающего на разрешающее.
-F Сброс правил в цепочке.
iptables -F INPUT
-Z Обнуление статистики.
iptables -Z INPUT
-N Создание цепочки.
iptables -N CHAINNEW
-X Удаление цепочки.
iptables -X CHAINNEW
-P Определение правила по умолчанию.
iptables -P INPUT DROP
-E Переименовывание цепочки.
iptables -E CHAINNEW CHAINOLD

Условия

Данные ключи определяют условия правила.

Ключ Описание и примеры
-p Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
iptables -A INPUT -p tcp -j ACCEPT
разрешить все входящие tcp-соединения.
-s Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
запретить входящие с узла 192.168.0.50
-d Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
запретить исходящие на узел 192.168.0.50
-i Сетевой адаптер, через который приходят пакеты (INPUT).
iptables -A INPUT -i eth2 -j DROP
запретить входящие для Ethernet-интерфейса eth2.
-o Сетевой адаптер, с которого уходят пакеты (OUTPUT).
iptables -A OUTPUT -o eth3 -j ACCEPT
разрешить исходящие с Ethernet-интерфейса eth3.
—dport Порт назначения.
iptables -A INPUT -p tcp —dport 80 -j ACCEPT
разрешить входящие на порт 80.
—sport Порт источника.
iptables -A INPUT -p tcp —sport 1023 -j DROP
запретить входящие с порта 1023.

Перечисленные ключи также поддерживают конструкцию с использованием знака ! .

Настройка netfilter с помощью iptables

Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.

Действия

Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j .

Таблица Действие Описание
filter ACCEPT Разрешает пакет.
DROP Запрещает пакет.
REJECT Запрещает с отправкой сообщения источнику.
nat MASQUERADE Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
SNAT Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены.
DNAT Подмена адреса для входящих пакетов.
REDIRECT Перенаправляет запрос на другой порт той же самой системы.
mangle TOS Видоизменение поля TOS (приоритезация трафика).
DSCP Изменение DSCP (тоже приоритезация трафика).
TTL Изменение TTL (время жизни пакета).
HL Аналогично TTL, но для IPv6.
MARK Маркировка пакета. Используется для последующей фильтрации или шейпинга.
CONNMARK Маркировка соединения.
TCPMSS Изменение значения MTU.

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

iptables -L —line-numbers

Для каждой таблицы смотреть правила нужно отдельно:

iptables -t nat -L —line-numbers

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

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.

Способ 2. Чисткой правил:

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

Работа с правилами

Добавить правило в конец списка:

iptables -A INPUT -p tcp —dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ACCEPT

Добавить диапазон портов:

iptables -A INPUT -p tcp —dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 —dport 53 -i eth1 -j ACCEPT

Проброс портов (port forwarding)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —to-destination 192.168.1.15:2222

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 —sport 2222 -j SNAT —to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 2222 — внутренний порт.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 22 -j DNAT —to-destination 192.168.1.15:2222

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 внутренний IP-адрес, на который переводим все запросы; 2222 — внутренний порт.

Стартовая настройка

Разрешаем SSH:

iptables -A INPUT -p tcp —dport 22 -j ACCEPT

Ставим политику запрета на входящие и разрешаем все исходящие:

iptables -P OUTPUT ACCEPT

Создаем правило для нормальной работы apt-get:

iptables -A INPUT -p tcp —sport 80 -m state —state ESTABLISHED -j ACCEPT

Разрешаем ICMP (для выполнения команды ping):

iptables -A INPUT -p icmp -j ACCEPT

Сохранение правил (permanent)

По умолчанию, все правила перестают работать после перезапуска сети или компьютера. Для сохранения правил после перезагрузки есть несколько способов настройки.

Способ 1. iptables-save

Сохраняем правила в файл:

iptables-save > /etc/iptables.rules

Открываем настройки сети:

vi /etc/network/interfaces

и добавляем строку:

pre-up iptables-restore < /etc/iptables.rules

Способ 2. iptables-persistent

Ставим пакет iptables-persistent:

apt install iptables-persistent

Для сохранения правил вводим команду:

service iptables-persistent save

Способ 3. service iptables

Работает в старых версиях Linux:

Способ 4. iptables.init

Работает в CentOS:

/usr/libexec/iptables/iptables.init save

Ubuntu и CentOS

В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables.

Необходимо его установить или пользоваться более новыми утилитами.

В CentOS

В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.

Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:

yum install iptables-services

Отключаем firewalld:

systemctl stop firewalld

systemctl disable firewalld

Разрешаем и запускаем iptables:

systemctl enable iptables

В Ubuntu

Для управления брандмауэром теперь используется ufw.

Для работы с iptables, устанавливаем следующий пакет:

apt-get install iptables-persistent

Отключаем ufw:

# Сети# Безопасность# UNIX# Ubuntu# Linux

Была ли полезна вам эта инструкция?

ЗА «ОГНЕННОЙ СТЕНОЙ»:
ФАЙРВОЛЛ (БРАНДМАУЭР) И ШЛЮЗ В ИНТЕРНЕТ
В DEBIAN GNU/LINUX 4.0 ETCH

Практическое руководство по организации безопасного доступа в интернет
с отдельного компьютера и из локальной сети в Debian GNU/Linux 4.0 Etch
Немного теории

Каждый выход в интернет не только дает возможность подключаться к различным серверам и сайтам, но и создает потенциальную опасность проникновения на наш компьютер извне. Не стоит пренебрегать этой опасностью, поскольку в настоящее время большинство попыток несанкционированного доступа к компьютерам пользователей из интернета является частью хорошо организованного криминального бизнеса. После успешного взлома вашей системы принадлежащий вам компьютер попытаются использовать или для рассылки спама, или для организации DoS атак на другие компьютеры, или для каких-либо иных неблаговидных целей. Пренебрежение этой опасностью в лучшем случае увеличит ваши расходы на трафик и замедлит быстродействие компьютера, в худшем — может невольно вовлечь вас в преступные действия кибергруппировок.

Ситуация усугубляется оттого, что в некоторых (пока еще) широко распространненных операционных системах по умолчанию остаются открытыми многие порты, что позволяет подключаться злоумышленнику из интернета к пользователю незаметно для последнего.

Для предотвращения несанкционированного подключения извне и для фильтрации входящего / исходящего трафика в операционной системе должна быть использована специальная программа — файрволл (англ. firewall), известная также под названиями брандмауэр и межсетевой экран . Ниже описана простая настройка файрволла в свободной операционной системе Debian GNU/Linux 4.0 .

Особенно актуальным становится использование файрволла в случае, если у вас имеется не один компьютер, а домашняя или офисная сеть , компьютеры которой выходят в интернет.

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

Возникает соблазн (подогреваемый безграмотными рекомендациями, как, например, в инструкции к моему ADSL-модему) подключить модем к напрямую коммутатору, а затем к коммутатору подключать все компьютеры локальной сети. В таком случае модем через коммутатор динамически выдает локальные IP-адреса, но получается, что каждый компьютер остается один на один с интернетом! Ни модем, ни коммутатор не могут стать преградой недоброжелателя. Злоумышленник может просканировать все компьютеры организованной таким образом локальной сети.

Логичным и безопасным решением является создание барьера между модемом и локальной сетью — в виде отдельного компьютера с настроенной на нем «огненной стеной» (файрволлом). У этого компьютера два интерфейса — одним он «смотрит» в интернет (т.е. физически подключен к модему), другим обращен в локальную сеть (и физически подключен к коммутатору, к которому также подключены остальные компьютеры). Поскольку наш компьютер с файрволлом является теперь узловой точкой для выхода других компьютеров в интернет, он именуется еще и шлюзом (англ. gateway).

При такой организации локальной сети вероятность взлома значительно снижается — злоумышленник «видит» из интернета только шлюз, а на шлюзе установлен файрволл, и взломать его нелегко.

Настройка iptables на Linux для чайников

Компьютеры локальной сети могут работать в интернете и оставаться в относительной безопасности.

Настройка файрволла с помощью конфигуратора arno-iptables-firewall

Для организации файрволла в GNU/Linux используется программа iptables , которая, как правило, сразу инсталлируется при установке большинства дистрибутивов. В Debian GNU/Linux проверить это можно, запустив с правами администратора aptitude . При необходимости — устанавливаем iptables .

Однако ручное конфигурирование iptables является нетривиальной задачей и под силу только специалистам в области системного администрирования. Поэтому для настройки правил, по которым будет действовать файрволл, лучше воспользоваться специальным конфигуратором . В Debian GNU/Linux это — программа arno-iptables-firewall . Будучи запущенной, она задает ряд вопросов, на основании которых генерирует правила для функционирования файрволла iptables .

Набираем в консоли с правами суперпользователя:

#aptitude install arno-iptables-firewall

В начале инсталляции программа спросит, действительно ли мы желаем с ее помощью настроить файрволл iptables :

Вначале надо указать внешний интерфейс — «смотрящий» в интернет, т.е. подключенный к модему. Настройки интерфейсов определяются в конфигурационном файле /etc/network/interfaces . Он может иметь, например, такой вид:

# Это интерфейс lo — указывает на саму нашу машину. auto lo iface lo inet loopback address 127.0.0.1 netmask 255.0.0.0 # Это интерфейс eth0, который подключен к интернету (ADSL-модему) # Его особенностью является то, что IP-адрес ему назначается провайдером динамически, # поэтому выставлена опция dhcp auto eth0 iface eth0 inet dhcp # Это интерфейс, который обращен в локальную сеть # Адрес локальной сети будет 192.168.2.0/24 # В целях безопасности в локальной сети шлюз имеет статический IP-адрес — 192.168.2.1, # поэтому выставлена опция static # Маска сети — 255.255.255.0 # Широковещательный адрес сети в таком случае будет 192.168.2.255 auto eth1 iface eth1 inet static address 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255

Итак, заглянув в настройки /etc/network/interfaces , указываем конфигуратору файрволла, что у нас внешним является интерфейс eth0 :

На вопрос, выдается ли нам от провайдера IP-адрес динамически (с помощью протокола DHCP), отвечаем утвердительно:

Cледует вопрос, какие службы будут предоставлены с нашего компьютера внешним пользователям интернета. У нас — никакие! Мы не занимаемся профессиональным веб-хостингом и не предполагаем раздачу информации вовне. Оставляем строку пустой.

Затем идет вопрос, будем ли мы предоставлять какие-либо службы по протоколу UDP. Тоже нет — и тоже оставляем стрку пустой!

Нужно ли, чтобы нас пинговали из внешнего мира (т.е. проверяли, имеется ли связь с компьютером, на котором установлен файрволл)? В нашем случае это вполне допустимо:

На этом настройка для отдельного компьютера, не являющегося шлюзом локальной сети, будет закончена. Если же мы предполагаем использовать компьютер как шлюз, нужно ответить еще на несколько вопросов. Указываем интерфейс, которым шлюз обращен в локальную сеть — в нашем случае это eth1 , как явствует из /etc/network/interfaces (в противном случае, для «одинокого» компьютера, оставляем это поле незаполненным):

На вопрос позволить ли NAT-трансляцию, т.е. переадресацию траффика из интернета через шлюз в локальную сеть и обратно, отвечаем «да» — это является одной из основных наших задач в данном случае:

Тогда встает вопрос: а какой сегмент локальной сети может быть допущен через переадресацию к внешним сетям? У нас право доступа в интернет имеют все компьютеры локальной сети; опять указываем значение 192.168.2.0/24

Наконец, подтверждаем свое желание запустить iptables без дополнительной проверки с нашей стороны автоматически сформированных конфигуратором правил для файрволла:

После этого, если все прошло успешно, выдается сообщение, подобное приведенному ниже. Оно будет появляться теперь при каждой загрузке компьютера-шлюза и информировать об успешном запуске файрволла:

Arno’s Iptables Firewall Script v1.8.8c ——————————————————————————- Sanity checks passed…OK Detected IPTABLES module…

Loading additional IPTABLES modules: All IPTABLES modules loaded! Configuring /proc/…. settings: Enabling anti-spoof with rp_filter Enabling SYN-flood protection via SYN-cookies Disabling the logging of martians Disabling the acception of ICMP-redirect messages Setting the max. amount of simultaneous connections to 16384 Enabling protection against source routed packets Setting default conntrack timeouts Enabling reduction of the DoS’ing ability Setting Default TTL=64 Disabling ECN (Explicit Congestion Notification) Enabling support for dynamic IP’s Flushing route table /proc/ setup done… Flushing rules in the filter table Setting default (secure) policies Using loglevel «info» for syslogd Setting up firewall rules: ——————————————————————————- Accepting packets from the local loopback device Enabling setting the maximum packet size via MSS Enabling mangling TOS Logging of stealth scans (nmap probes etc.) enabled Logging of packets with bad TCP-flags enabled Logging of INVALID packets disabled Logging of fragmented packets enabled Logging of access from reserved addresses enabled Setting up anti-spoof rules Reading custom IPTABLES rules from /etc/arno-iptables-firewall/custom-rules Loading (user) plugins Setting up INPUT policy for the external net (INET): Enabling support for a DHCP assigned IP on external interface(s): eth0 Logging of explicitly blocked hosts enabled Logging of denied local output connections enabled Packets will NOT be checked for private source addresses Allowing the whole world to send ICMP-requests(ping) Logging of dropped ICMP-request(ping) packets enabled Logging of dropped other ICMP packets enabled Logging of possible stealth scans enabled Logging of (other) connection attempts to PRIVILEGED TCP ports enabled Logging of (other) connection attempts to PRIVILEGED UDP ports enabled Logging of (other) connection attempts to UNPRIVILEGED TCP ports enabled Logging of (other) connection attempts to UNPRIVILEGED UDP ports enabled Logging of other IP protocols (non TCP/UDP/ICMP) connection attempts enabled Logging of ICMP flooding enabled Applying INET policy to external (INET) interface: eth0 (without an external subnet specified) Setting up INPUT policy for internal (LAN) interface(s): eth1 Allowing ICMP-requests(ping) Allowing all (other) protocols Setting up FORWARD policy for internal (LAN) interface(s): eth1 Logging of denied LAN->INET FORWARD connections enabled Setting up LAN->INET policy: Allowing ICMP-requests(ping) Allowing all (other) protocols Enabling masquerading(NAT) via external interface(s): eth0 Adding (internal) host(s): 192.168.2.0/24 Security is ENFORCED for external interface(s) in the FORWARD chain Jan 16 23:53:12 All firewall rules applied.

Примечание 1. В большинстве случаев успешный запуск файрволла происходит уже после первого общения с конфигуратором. Если что-то не заработало, настоятельно рекомендуется повторить конфигурацию, запустив вновь конфигуратор с правами суперпользователя:

# dpkg-reconfigure arno-iptables-firewall

Это позволит устранить случайную ошибку, которая могла возникнуть при ответах на вопросы конфигуратора при первом опыте общения с ним. В случае, если и это не помогло, можно попробовать вручную подправить конфигурационный файл программы arno-iptables-firewall , а именно: /etc/arno-iptables-firewall/firewall.conf . Полезным может оказаться посещение домашнего сайта создателя этой программы по адресу: http://rocky.eld.leidenuniv.nl/ . Там содержится весьма содержательное руководство по работе с программой, интересный FAQ и, кроме того, имеется информация о новых версиях программы.

Примечание 2. Не нужно забывать, что ни один файрволл не может дать 100% гарантии безопасности работы компьютера в интернете. Однако пренебрегать защитой файрволла нельзя. Надо сделать, все, от нас зависящее, чтобы затем уповать на милость Божию. «Если Господь не сохранит город, напрасно бодрствует страж» (Пс. 126:1).

Источник статьи

Я написал сообщение в блоге об основных правилах Iptables для рабочего пользователя давно, и вам, вероятно, следует прочитать его и связанную с ним статью о брандмауэре Stateful .

Но pre kernel 2.6.39 (который включает в себя и вы можете использовать его для whitelisting IP, если у вас больше, чем 10 для белого списка (где 10 произвольно)).

Настройка iptables для чайников

Первое состояние ручки, которое мы знаем, мы хотим принять или удалить, и интерфейсы.

Если вы просто хотите разрешить только IP, без состояния

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

Принцип настройки

Общий синтаксис использования iptables:

iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>

<таблица>

Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

<команда>

Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

<цепочка>

В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

[номер]

Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

<условие>

Условие описывает критерии отработки того или иного правила.

<действие>

Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.

Ключи iptables и примеры их использования

Для работы с таблицами (iptables -t)

Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

Ключ Описание и примеры
-A Добавление правила в конец списка:
iptables -A INPUT -s 192.168.0.15 -j DROP
запретить входящие с 192.168.0.15.
-D Удаление правила:
iptables -D INPUT 10
удалить правило в цепочке INPUT с номером 10.
-I Вставка правила в определенную часть списка:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
вставить правило 5-м по списку.
-R Замена правила.
iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
заменить наше 5-е правило с запрещающего на разрешающее.
-F Сброс правил в цепочке.
iptables -F INPUT
-Z Обнуление статистики.
iptables -Z INPUT
-N Создание цепочки.
iptables -N CHAINNEW
-X Удаление цепочки.
iptables -X CHAINNEW
-P Определение правила по умолчанию.
iptables -P INPUT DROP
-E Переименовывание цепочки.
iptables -E CHAINNEW CHAINOLD

Условия

Данные ключи определяют условия правила.

Ключ Описание и примеры
-p Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
iptables -A INPUT -p tcp -j ACCEPT
разрешить все входящие tcp-соединения.
-s Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
запретить входящие с узла 192.168.0.50
-d Адрес назначения. Принцип использования аналогичен предыдущему ключу -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
запретить исходящие на узел 192.168.0.50
-i Сетевой адаптер, через который приходят пакеты (INPUT).
iptables -A INPUT -i eth2 -j DROP
запретить входящие для Ethernet-интерфейса eth2.
-o Сетевой адаптер, с которого уходят пакеты (OUTPUT).
iptables -A OUTPUT -o eth3 -j ACCEPT
разрешить исходящие с Ethernet-интерфейса eth3.
--dport Порт назначения.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
разрешить входящие на порт 80.
--sport Порт источника.
iptables -A INPUT -p tcp --sport 1023 -j DROP
запретить входящие с порта 1023.

Перечисленные ключи также поддерживают конструкцию с использованием знака ! . Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.

Действия

Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j .

Таблица Действие Описание
filter ACCEPT Разрешает пакет.
DROP Запрещает пакет.
REJECT Запрещает с отправкой сообщения источнику.
nat MASQUERADE Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
SNAT Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены.
DNAT Подмена адреса для входящих пакетов.
REDIRECT Перенаправляет запрос на другой порт той же самой системы.
mangle TOS Видоизменение поля TOS (приоритезация трафика).
DSCP Изменение DSCP (тоже приоритезация трафика).
TTL Изменение TTL (время жизни пакета).
HL Аналогично TTL, но для IPv6.
MARK Маркировка пакета. Используется для последующей фильтрации или шейпинга.
CONNMARK Маркировка соединения.
TCPMSS Изменение значения MTU .

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

iptables -L --line-numbers

Для каждой таблицы смотреть правила нужно отдельно:

iptables -t nat -L --line-numbers

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

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.

Способ 2. Чисткой правил:

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

service iptables stop

Работа с правилами

Добавить правило в конец списка:

iptables -A INPUT -p tcp --dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ACCEPT

Добавить диапазон портов:

iptables -A INPUT -p tcp --dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ACCEPT

Заблокировать определенный IP-адрес для подключения по 25 порту:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP

Проброс портов (port forwarding)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 2222 -j SNAT --to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы; 2222 — внутренний порт.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Я несколько раз сталкивался с тем, что даже неглупые в общем-то люди делают совершенно непростительные ошибки. Например, открывают всему интернету порт, на котором крутится база данных. Часто так бывает у начинающих DevOps, которые всю жизнь писали код, а теперь в их обязанности входит еще и настройка серверов. В сети есть хорошие туториалы по базовой настройке фаервола в Linux и других *nix, но часто это простыни на множество экранов. Так что, надеюсь, этот более лаконичный туториал кому-нибудь пригодится.

Важно! Очень легко по ошибке так зафаерволить машину, что вы на нее больше не зайдете. Особенно это касается облачных хостингов. Например, если в AWS вы закроете все порты с 1024 по 65536, у машины после ребута почему-то оказываются закрыты вообще все порты. Если вы хоститесь в облаках, настраивайте лучше фаервол через предоставляемый хостингом веб-интерфейс.

Небольшое замечание по терминологии. Фаервол, встроенный в ядро Linux, называется Netfilter, а iptables — утилита для управления этим фаерволом. Многие ошибочно полагают, что фаервол называется iptables. Это не так. Говоря что-нибудь наподобие «я фильтрую пакеты с помощью iptables», вы показываете окружающим свою безграмотность.

Вообще, какие примерно задачи можно решать с помощью Netfilter:

  • Разрешать/запрещать входящий трафик на определенные порты по определенным протоколам (IPv4/IPv6, TCP/UDP) с указанных адресов (IP, MAC) или подсетей;
  • Все то же самое в отношении исходящего трафика;
  • Можно, например, полностью игнорировать все ICMP пакеты;
  • Настройка NAT, см статью про роутер на базе Raspberry Pi ;
  • Слышал, что настоящие гуру умеют настраивать защиту от DDoS и брутфорса, ограничивать доступ в сеть конкретным приложениям, пользователям или группам, и делать другие чумовые вещи;

Отмечу, что утилита iptables мне лично первое время казалась исключительно неудобной по сравнению с ipfw во FreeBSD . К счастью, поработав с ней какое-то время, все это множество флагов вроде -A, -D, -j и прочих становятся привычны, так что, наберитесь терпения. Рассмотрим основные команды.

Показать все правила:

iptables -L -n

Вы можете заметить, что в Netfilter есть какие-то «цепочки» (chains) — как минимум INPUT, OUTPUT и FORWARD. У меня лично на машине есть еще и цепочка DOCKER. На первое время можно думать о первых двух, как обо всем входящем и исходящем трафике соответственно, а об остальных временно забыть. Велика вероятность, что они вообще никогда вам не понадобятся.

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

iptables -F

Изменить политику (поведение по умолчанию) цепочки:

iptables -P INPUT DROP
iptables -P INPUT ACCEPT

Запретить доступ с хоста/подсети:

iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/ 16 -j DROP

Также можно использовать доменные имена:

iptables -A INPUT -s example.ru -j DROP

Запрет исходящих соединений:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

В правилах можно использовать отрицания:

iptables -A INPUT ! -s 123.45.67.89 -j DROP

Удаление правила по его номеру в цепочке:

iptables -D INPUT 1

Удаление правила на основе того, что оно делает:

iptables -D INPUT -s 123.45.67.89 -j DROP

Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола из /etc/protocols. Флаг - -sport указывает порт, с которого был прислан пакет, а - -dport указывает порт назначения:

iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Вставка (insert) правила в начало цепочки:

iptables -I INPUT ...

Или можно указать конкретную позицию:

iptables -I INPUT 3 ...

iptables-save > / etc/ iptables.rules

Восстановить правила:

iptables-restore < / etc/ iptables.rules

Теперь рассмотрим несколько практических примеров. Так, например, выглядит эмуляция нетсплита в тесте, проверяющем поведение приложения, в котором используется Akka Cluster :

run(node1, s"iptables -A INPUT -s $node2 -j DROP" )
run(node1, s"iptables -A INPUT -s $node3 -j DROP" )
run(node1, s"iptables -A OUTPUT -d $node2 -j DROP" )
run(node1, s"iptables -A OUTPUT -d $node3 -j DROP" )

Восстановление происходит точно так же, только флаг -A заменяется на флаг -D.

Другой пример. Требуется выяснить, какие порты прослушиваются на машине, и закрыть лишние. Заходим на машину и говорим:

netstat -tuwpln

Пример вывода:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Prog name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3210/nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1789/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 797/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 990/postgres

Nginx и SSHd смотрят в интернет, это нормально. PostgreSQL слушает только локальный интерфейс, поэтому с ним тоже проблем нет. А вот epmd торчит наружу (можно проверить telnet’ом с другой машины), и это никуда не годится. Можно закрыть только порт 4369. Как это сделать, было показано выше. Или можно пойти еще дальше и запретить все соединения извне на порт 81 и старше.

IPTables — утилита, с помощью которой происходит управление межсетевым экраном в Linux. Это мощный и удобный инструмент для и нежелательных соединений. Весь процесс заключён в правилах iptables, которые можно редактировать и просматривать. Более подробная информация представлена в статье.

История создания

До IPTables в системе Linux использовался файрвол IPFW, позаимствованный из BSD. Затем, с версии ядра 2.4 Linux, она стала поставляться с межсетевым экраном Netfilter и утилитой IPTables для управления им. В методике её работы были сохранены все аспекты и немного расширены функционально.

Строение и устройство IPTables

Поступая в межсетевой экран, пакет проходит несколько проверок. Это может быть контрольная сумма или любой другой анализ на уровне ядра. Затем наступает черёд пройти через цепочку PREROUTING. Далее проверяется в соответствии с которой происходит переадресация на следующую цепочку. Если адрес у пакета отсутствует, как, например, в TCP, то происходит направление в цепочку FORWARD. В тех случаях, когда имеется конкретный адрес, следует цепочка INPUT, а затем уже тем демонам или сервисам, для которых он предназначен. Ответ от них также должен пройти несколько цепочек, например OUTPUT. Последним звеном в этом процессе является цепочка POSTROUTING.

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

Таблицы в свою очередь содержат несколько правил. По сути, правило — это некое условие, которому должен соответствовать проверяемый пакет. В зависимости от исхода, над пакетом выполняется определённое действие.

Таким образом, проходя все этапы сети, пакет последовательно посещает все цепочки и в каждой проверяется на соответствие условию определённого правила. Если таблица не сформирована пользователем, то выполняется действие по умолчанию, в основном, это ACCEPT, позволяющий продолжить движение дальше или же DROP, останавливающий пакет.

Предустановленные цепочки бывают следующих категорий:

  • PREROUTING . Первоначальная обработка всех приходящих пакетов.
  • INPUT . Сюда попадают те пакеты, которые направлены непосредственно в локальный компьютер.
  • FORWARD . Применяется для «транзитных пакетов», которые следуют таблице маршрутизации.
  • OUTPUT . Используется для исходящих пакетов.
  • POSTROUTING . Последний этап в прохождении исходящим пакетом всех цепочек.

Помимо встроенных цепочек, пользователи могут создавать или же удалять свои собственные.

Просмотр правил IPTables и управление ими

Как уже было сказано ранее, все цепочки содержат определённые условия для пакетов. Для просмотра правил IPTables и управления ими и используется утилита IPTables. Каждое отдельное правило представляет собой строку с набором условий для пакетов, а также действия над ними, в зависимости от исхода.

Формат команды выглядит таким образом: iptables [-t название обрабатываемой таблицы] вызываемая команда [критерии] [выполняемое действие].

Все, что заключено в может быть опущено. Если это параметр с указанием таблицы, то будет использоваться filter. Для применения какого-то определённого имени нужно добавить ключ -t. Вызываемая команда позволяет вызвать необходимое действие, например, добавить правило IPTables или удалить его. В «критериях» указываются параметры, по которым будет происходить отбор. И в «действии» применяется действие, которое нужно выполнить, если условие соблюдено.

Команды для создания и просмотра правил IPTables

  • Append (-A). При использовании команды указывается цепочка и таблица, в которые нужно добавить необходимое правило. Ценность команды в том, что делает она это в конце всего списка.
  • Delete (-D). Как можно понять из названия, производит удаление правила. В качестве параметров можно указать как полное наименование, так и присвоенные им номера.
  • Rename-chain (-E). Меняет название цепочки. В команде указывается старое, затем новое имя.
  • Flush (-F). Очистка абсолютно всех правил определённой таблицы.
  • Insert (-I). Данная команда вставляет в указанное номером место, нужное правило.
  • List (- L). Просмотр правил Iptables. Если не указана таблица, то будет использована filter по умолчанию.
  • Policy (-P). Используется политика по умолчанию для указанной цепочки.
  • Replace (-R). Меняет правило под указанным номером, на необходимое.
  • Delete-chain (-X). Эта команда производит удаление всех созданных цепочек. Останутся только предустановленные.
  • Zero (-Z). Сбросит счётчики переданных данных в указанной цепочке.

Немного о параметрах отбора пакетов

Их можно условно разделить на три разновидности:

  • Общие критерии . Их можно указывать для любых правил. Они не требуют подключения особых расширений и модулей, а также не зависят от того, какой протокол будет задействован.
  • Не общие критерии. Они становятся доступны при использовании общих критериев.
  • Явные. Для того, чтобы воспользоваться данным типом, нужно подключать специальные плагины для netfilter. К тому же в команде необходимо применить ключ -m.

Стоит немного рассказать о часто встречающихся параметрах, применяемых при анализе пакетов:

  • Protocol (-p). Указывает на протокол.
  • Source (-s). Данный параметр определяет IP адрес источника, с которого пришёл пакет. Его можно указать несколькими способами. Конкретный хост, адрес или же целую подсеть.
  • Destination (-d). Адрес назначения пакета. Также, как и предыдущий, может быть описан несколькими способами.
  • In-interface (-i). Указывает входящий интерфейс пакета. В основном используется для NAT или на системах с несколькими интерфейсами.
  • Out-interface (-o). Исходящий интерфейс.

Несколько примеров

Для того, чтобы выполнить просмотр правил IPTables nat? нужно воспользоваться командой - «iptables -L -t nat». Узнать общий статус файрвола - «iptables -L -n -v». К тому же данная команда позволяет посмотреть правила IPTables, имеющиеся во всей системе. Вставить правило в определённое место таблицы, например, между первой и второй строкой - «iptables -I INPUT 2 -s 202.54.1.2 -j DROP». Затем просмотреть, добавилось ли оно - «iptables -L INPUT -n --line-numbers».

Чтобы заблокировать определённый адрес, например, 12.12.12.12 - «iptables -A INPUT -s 12.12.12.12 -j DROP».

Справка по iptables - «man iptables». Если нужна информация по конкретной команде - «iptables -j DROP -h».

В заключение

Использовать команды IPTables нужно с осторожностью, так как неправильная настройка (по незнанию) может привести к сбоям в сети или полном выходе её из строя. Поэтому стоит подробно изучить мануалы и инструкции перед конфигурацией. В умелых же руках IPTables можно превратить в надёжного защитника сетевых соединений. Системные администраторы активно используют утилиту для создания подключений, изолированных от несанкционированного доступа.




Top