Как работает iptables. Просмотр правил IPTables, добавление или удаление. Действия над пакетами

В этой статье мы рассмотрим порядок прохождения таблиц и цепочек в каждой таблице iptables. Информация будет полезна при составлении правил и даст понимание порядка прохождения пакета по всем таблицам и цепочкам iptables, особенно, когда в наборы правил будут включаться такие действия как DNAT, SNAT и TOS.

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

Таблица 1. Порядок прохождения FORWARD пакетов

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2
3 Mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 Nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети.
6 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
7 Mangle FORWARD Далее пакет попадает в цепочку FORWARD> таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
8 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке, к примеру, решается на какой интерфейс пойдет пакет.
9 Nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскировка (Masquerading).
10 Mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
11 Выходной сетевой интерфейс (например, eth1).
12 Кабель (пусть будет LAN).

Как вы можете видеть, пакет проходит несколько этапов, прежде чем он будет передан далее. На каждом из них пакет может быть остановлен, будь то цепочка iptables или что либо еще, но нас главным образом интересует iptables. Заметьте, что нет каких либо цепочек, специфичных для отдельных интерфейсов или чего либо подобного. Цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш firewall/роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту.

Таблица 2. Порядок движения INPUT пакетов

Шаг Таблица Цепочка Примечаниеt
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
3 Mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 Nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 Mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 Filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8 Локальный процесс/приложение

Пакеты OUTPUT имеют обратный порядок прохождения через таблицы. Порядок прохождения представлен в таблице 3.

Таблица 3. Порядок прохождения OUTPUT пакетов

Шаг Таблица Цепочка Примечание
1 Локальный процесс
2 Mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Фильтрация, выполняемая в этой цепочке, может иметь негативные последствия.
3 Nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
4 Filter OUTPUT Здесь фильтруется исходящий траффик.
5 Принятие решения о маршрутизации. Здесь решается — куда пойдет пакет дальше.
6 Nat POSTROUTING Здесь выполняется Source Network Address Translation (SNAT). Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP .
7 Mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

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

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

Обратите внимание также на тот факт, что пакеты, с адресом назначения на брандмауэр, могут претерпеть трансляцию сетевого адреса (DNAT) в цепочке PREROUTING таблицы nat и соответственно дальнейшая маршрутизация в первой точке будет выполняться в зависимости от произведенных изменений.

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

Общий синтаксис использования 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 на Linux является довольно простой.

Настройка iptables на Linux: Что такое iptables?

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

Iptables почти всегда поставляется с предустановленной версией на любом дистрибутиве Linux. Чтобы обновить / установить его, просто загрузите пакет iptables:

sudo apt-get install iptables

Есть GUI-альтернативы iptables, такие как Firestarter, но iptables не так уж и сложно, если вы выполните буквально несколько команд. Будьте предельно осторожными при настройке правил iptables, особенно если вы используете SSH’d на сервере, потому что одна неправильная команда может надолго заблокировать вас до тех пор, пока она не будет вручную зафиксирована на физической машине.

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

Кстати, ранее мы уже говорили о том, . Возможно это также вам будет интересно. Ссылку можно найти выше.

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

Типы цепей

В Iptables используются три разные цепи: ввод, пересылка и вывод.

Input — Эта цепочка используется для управления поведением входящих соединений. Например, если пользователь попытается установить SSH на ваш компьютер / сервер, iptables попытается сопоставить IP-адрес и порт с правилом в цепочке ввода.

Forward — эта цепочка используется для входящих соединений, которые фактически не доставляются локально. Думайте о роутере — данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора; Данные просто перенаправляются на целевую страницу. Если вы не выполняете какую-либо маршрутизацию, NAT или что-то еще в вашей системе, которая требует пересылки, вы даже не будете использовать эту цепочку.

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

Этот снимок экрана относится к серверу, который работает в течение нескольких недель и не имеет ограничений на входящие или исходящие подключения. Как вы можете видеть, цепочка ввода обработала 11 ГБ пакетов, а выходная цепочка обработала 17 ГБ. С другой стороны, прямой цепочке не нужно обрабатывать один пакет. Это связано с тем, что сервер не выполняет никаких пересылок или не используется в качестве сквозного устройства.

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

Предостережение

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

Поведение политики по умолчанию

Прежде чем приступить к настройке определенных правил, вы должны решить, что вы хотите, чтобы поведение этих трех цепей по умолчанию. Другими словами, что вы хотите, чтобы iptables делал, если соединение не соответствует каким-либо существующим правилам?

Чтобы узнать, какие цепочки политик настроены для работы с непревзойденным трафиком, запустите команду iptables -L.

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

Больше времени, чем нет, вы хотите, чтобы ваша система принимала соединения по умолчанию. Если вы ранее не изменили правила цепочки политик, этот параметр должен быть уже настроен. В любом случае, вот команда принять соединения по умолчанию:

iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT

По умолчанию в правиле принятия, вы можете использовать iptables для отказа от определенных IP-адресов или номеров портов, продолжая принимать все остальные соединения. Мы дойдем до этих команд через минуту.

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

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

Ответы на подключение

При настройке политик цепочки по умолчанию вы можете приступить к добавлению правил в iptables, чтобы знать, что делать, когда он встречает соединение с определенным IP-адресом или портом. В этом руководстве мы рассмотрим три наиболее распространенных и часто используемых «ответа».

Accept — разрешить соединение.

Drop — Отбросьте соединение, действуйте так, как будто этого никогда не было. Это лучше всего, если вы не хотите, чтобы источник понял, что ваша система существует.

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

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

Разрешение подключения:

Удаление соединения:

Отклонение соединения:

Сетевая маска или характеристика, чтобы указать диапазон IP-адресов.

Настройка iptables на Linux: Методы подключений

Если говорить на тему «Настройка iptables на Linux» то нужно рассказать и про методы подключений.

Разрешение или блокировка определенных подключений
С помощью настроенных политик вы можете настроить iptables для разрешения или блокировки определенных адресов, диапазонов адресов и портов. В этих примерах мы установим подключения к DROP, но вы можете переключить их на ACCEPT или REJECT, в зависимости от ваших потребностей и того, как вы настроили свои цепочки политик.

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

Соединения с одного IP-адреса

В этом примере показано, как заблокировать все подключения с IP-адреса 10.10.10.10 ..

iptables -A INPUT -s 10.10.10.10 -j DROP

Соединения из диапазона IP-адресов

В этом примере показано, как заблокировать все IP-адреса в сетевом диапазоне 10.10.10.0/24. Для указания диапазона IP-адресов можно использовать сетевую маску или стандартную косую черту.

iptables -A INPUT -s 10.10.10.0/24 -j DROP

iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

Соединения с определенным портом

В этом примере показано, как заблокировать SSH-соединения с 10.10.10.10.

iptables -A INPUT -p tcp —dport ssh -s 10.10.10.10 -j DROP

Вы можете заменить «ssh» на любой протокол или номер порта. Часть кода -p tcp сообщает iptables, какое соединение использует протокол. Если вы блокировали протокол, который использует UDP, а не TCP, тогда вместо этого потребуется -p udp.

В этом примере показано, как блокировать соединения SSH с любого IP-адреса.

iptables -A INPUT -p tcp —dport ssh -j DROP

Состояния подключения

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

Вот тут-то и появляются состояния соединения, которые дают вам возможность разрешить двухстороннюю связь, но только позволять устанавливать односторонние соединения. Взгляните на этот пример, где SSH-соединения FROM 10.10.10.10 разрешены, но SSH-соединения TO 10.10.10.10 — нет. Однако системе разрешено отправлять обратную информацию по SSH, пока сеанс уже установлен, что делает возможной связь SSH между этими двумя хостами.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT

Сохранение изменений

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

sudo /sbin/iptables-save

Red Hat / CentOS:

/sbin/service iptables save

/etc/init.d/iptables save

Другие команды

Список текущих настроенных правил iptables:

Добавление опции -v даст вам информацию о пакетах и ​​байтах, а добавление -n будет содержать все числовые значения. Другими словами, имена хостов, протоколы и сети перечислены как номера.

Чтобы очистить все настроенные в данный момент правила, вы можете выполнить команду flush.

Перевод из отличного английского ресурса HowToGeek .

Если у вас остались какие-то вопросы по теме «Настройка iptables на Linux для чайников», то можете писать их в форму комментариев на нашем сайте.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter .

сталь, норка, говядина, бумага 28 сентября 2010 в 19:47

Основы iptables на примере Debian глазами младенца

О чем же пойдёт речь

Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.

Как это выглядит

Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.

Поехали, потихонечку...

И так что же мы имеем:
  • сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
  • имеющийся по умолчанию в Debian Lenny firewall - netfilter/iptables
  • локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT - он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.

Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.

транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру - $ echo 1 > /proc/sys/net/ipv4/ip_forward , но данная настройка слетит после перезагрузки, так что лучше поправить конфиг - $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.
настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась .
И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F

Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT - разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть - eth0, а в интернет - eth1, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» - о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP

тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам...
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети - я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто - надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) - сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.

Итого

Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.

Теги: iptables, netfilter, NAT