Настройка фаервола с помощью iptables за пять минут. Примеры использования Iptables

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

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

Сценарии сетевых подключений

Перед настройкой фаервола обязательно нужно иметь точное представление о том, какие сетевые соединения и как должны устанавливаться при работе системы, чтобы все сервисы могли нормально работать. Чем точнее у нас картина работы сетевых сервисов, как работающих на нашем сервере, так и на других серверах, тем более тонко можно настроить систему. Поэтому желательно всегда сначала описывать сценарии того, как всё должно работать, и только потом начинать настраивать фаервол. Сценарий можно написать в любом текстовом редакторе. Сначала описываем все внешние сервисы, с которыми работает сервер, а затем все сервисы, которые работают на сервере. Зачем это надо? Чтобы точно представлять сам процесс работы, без углубления в техническую часть. После написания максимально точного сценария можно приступать к настройке фаервола. Описание в сценарии должно выглядеть примерно так:

1) Все пользователи могут просматривать сайт. По умолчанию сайт на русском языке.
2) Если пользователи пришли с адресов <список-адресов-или-маска-подсети>, то им должен быть показан сайт на украинском. В нашем примере это будет, допустим, интернет-магазин с одним доменным именем, отображаемый на русском или украинском языке, и имеющий в продаже свой набор для России и Украины. У нас будет просто два сайта, один на русском, второй на украинском, и по адресу, с которого пришел клиент, будет определяться, на какой сайт он попадет. Пример взят из головы, на практике, конечно, такие вопросы решаются по другому. Можно также не разрешать просмотр сайта с китайских адресов из-за постоянного спама в комментариях на китайском.
3) Из офиса должна быть доступна почта, из других мест она не должна быть доступна.
4) Извне должна быть обеспечена возможность подключения к ВПН
5) Мы можем использовать только несколько DNS-серверов, которым мы доверяем. Все остальные сервера DNS должны быть недоступны
6) …..

И так далее. Думаю, достаточно для простого примера. Смысл в том, чтобы максимально точно определить картину сетевого взаимодествия. Любой сценарий имеет только одну цель — формализовать взаимодействие с пользователями и сервисами до составления описаний соединений, включающих порт, протокол, адрес источника, адрес назначения для каждого соединения.

Настройка iptables: Самая простая конфигурация

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

В первую очередь, необходимо очистить загруженные правила:

Iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD

INPUT, OUTPUT, FORWARD — это три основные цепочки, по которым будут идти пакеты, входящие, исходящие и проходящие с интерфейса на интерфейс.

После этого необходимо задать политику по умолчанию. Их всего две — ACCEPT и DROP, принимать пакеты или не принимать. Для боевого сервера всегда необходимо выбирать DROP, а затем открывать всё, что необходимо и не более того.

Для задания таких политик необходимо предварительно разрешить соединения по SSH, будем считать, что мы не меняли стандартный порт (что обычно следует на боевых серверах делать сразу после установки SSH-сервера).

Iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

И после этого уже можно приступать к изменению политик по умолчанию:

Iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP

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

Итак. В данный момент у нас открыт только порт SSH-сервера для входящих соединений, на все остальные порты соединения проходить не будут. Теперь надо добавить прием соединений на порты остальных сервисов, если они на вашем сервере запущены.

Iptables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

DNS (обычно достаточно разрешить UDP, но можно также добавить и TCP):

Iptables -t filter -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Но это еще не всё. Порты открыты, сервисы доступны извне, но почта не работает и доменные имена не резолвятся. Дело в том, что при запросе DNS-серверов запрос отправляется с произвольного свободного порта из числа непривелегированных, точно так же, как и соединение с другим почтовым сервером. И ответ эти сервисы отправляют на тот же самый порт. А этот порт, как вы понимаете, у нас закрыт. Мы могли бы открыть этот порт, но мы не знаем, с какого порта будет исходящее соединение. Поэтому мы можем сделать самое простое, что может быть,- разрешить соединения с определенных портов удаленного компьютера:

Iptables -t filter -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT

Iptables -t filter -A INPUT -p udp -m udp --sport 53 -j ACCEPT

Эти два правила разрешают входящие соединения с портов 25/tcp и 53/udp, поэтому, когда с этих портов приходят пакеты по соответствующему протоколу, они будут приняты. Если вы планируете обновлять систему, программное обеспечение или устанавливать пакеты, необходимые для работы, то вам придется разрешить соединения с 80 порта удаленных машин.

Вот теперь самая простая конфигурация iptables у нас готова.

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

Обработка источника соединения

Идем дальше. соединение по определенным портам нам необходимо не со всем Интернетом, а с определенными машинами, с определенными IP-адресами. Поэтому мы можем немного усложнить правила, добавив в них адрес источника пакетов.

Iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.

Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.

Правила для конкретного сетевого интерфейса или IP-адреса

На сервере может быть несколько сетевых интерфейсов. Обычно их как минимум два — внешний сетевой и так называемый loopback-интерфейс 127.0.0.1, доступ к которому извне невозможен, если отсутствует соответствующее перенаправление пакетов. У вас также может как минимум еще один IP-адрес, используемый совместно с алиасом сетевого интерфейса, или еще один физический сетевой интерфейс. И на каждом IP-адресе или сетевом интерфейсе могут работать определенные сервисы. Например, на одном веб-сервер Apache, а на втором сервер службы доменных имен bind9. И когда вы разрешаете соединения на определенный порт без указания этого сетевого интерфейса, вы открываете доступ к этому порту на всех интерфейсах. Поэтому есть два способа сузить область действия разрешения.

Первый способ — указать IP-адрес, для которого будет разрешен доступ.

Iptables -t filter -A INPUT -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

Этот пример показывает, как можно использовать адрес назначения в правиле iptables. При этом также можно использовать адрес источника:

Iptables -t filter -A INPUT -s 123.123.123.123 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

В данном пример мы уже ограничиваем доступ двумя адресами, что позволяет получить доступ по SSH к серверу по адресу 234.234.234.234 с адреса 123.123.123.123, с остальных адресов доступ вы получить не сможете.

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

Iptables -t filter -A INPUT -i eth0 -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Такой вариант разрешает доступ по SSH на сетевом интерфейсе eth0, на остальных сетевых интерфейсах доступ по SSH будет отсутствовать.

Всё, что мы только что рассмотрели — это только самое начало, в следующей части будет продолжение…

iptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4 и 2.6. Для использования утилиты iptables требуются привилегии суперпользователя (root).Иногда под словом iptables имеется в виду и сам межсетевой экран netfilter.

1. Что же такое межсетевой экран и зачем он нужен?

Межсетевой экран - комплекс аппаратных или программных средств, осуществляющий контроль и фильтрацию проходящих через него сетевых пакетов на различных уровнях модели OSI в соответствии с заданными правилами.

Основной задачей сетевого экрана является компьютерных сетей или отдельных узлов от несанкционированного доступа. Также сетевые экраны часто называют фильтрами, так как их основная задача - не пропускать (фильтровать) пакеты, не подходящие под критерии, определённые в конфигурации.

2. Принципы работы iptables

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

В Iptables используется три вида таблиц:

  1. Mangle - обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
  2. Nat - эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях.
  3. Filter - здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.

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

  1. INPUT - для входящих пакетов.
  2. FORWARD - для проходящих через данную машину к другой.
  3. OUTPUT - для исходящих.

Пакет, проходящий через эти цепочки, исходя из правила может быть пропущен (ACCEPT) или отброшен (DROP).

Программа Iptables позволяет редактировать правила через терминал путем ввода команд.

Немного о написании правил:

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

Iptables [-t имя-таблицы ] команда [шаблон] [-j действие ]

Опция -t задает таблицу . Если опция упущена, то по умолчанию предполагается использование таблицы filter. Если предполагается использование другой таблицы, то это требуется указать явно.

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

Список команд:

  • -A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -R имя-цепочки номер правило (заменить;
    ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
  • -D имя-цепочки правило (удалить правило по текстуальному совпадению)
  • -C имя-цепочки пакет (тестировать прохождение пакета;
    исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами)
  • -L [имя-цепочки ] (показать список правил; дополнительные ключи:
    • -v (вывести дополнительную информацию, в частности, счётчики)
    • --exact (показывать счётчики без округления до KB, MB и т.д.)
    • --numeric (показывать адреса и номера портов в виде чисел)
    • --line-numbers (выводить номера правил)
  • -F имя-цепочки (удалить все правила из цепочки)
  • -Z имя-цепочки (обнулить счетчики)
  • -N имя-цепочки (создать цепочку)
  • -X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
  • -P имя-цепочки действие (изменить действие по умолчанию: ACCEPT,
    DROP, QUEUE, RETURN)
  • -E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)

Раздел шаблон задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет.Здесь можно указать самые разные критерии - IP-адрес источника пакета или сети, сетевой интерфейс. IP-адрес места назначения, порт, протокол и т.д. Остальные параметры для фильтации можно посмотреть в справке по утилите iptables(man iptables)

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

Список некоторых действий:

  • ACCEPT - пропустить пакет; просмотр таблицы завершается
  • DROP - выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
  • REJECT - выбросить, известив отправителя (--reject-with тип-извещения )

3. Порядок следования сетевого пакета, предназначенного локальному процессу/приложению:

Для локального приложения

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

Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD.

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

От локальных процессов

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

Порядок движения транзитных пакетов

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

Есть три различных варианта прохождения пакетов.

1. Из вне на локальную службу (сервер) этого компьютера (INPUT).

2. От локальной службы (сервера) этого компьютера во вне (OUTPUT).

3. Прохождение мимо, шлюзование, мимо этого сетевого интерфейса этого компьютера (FORWARD).

4. Несколько примеров настройки:

пример скрипта:

#задаем переменные для обозначения внешнего и внутреннего сетевого интерфейса

LOCAL_IF="eth0"
INET_IF="eth0:g"

#=======================
# Удалить все правила из цепочки.
#=======================
iptables -F
iptables -X

#=======================
# Устанавливаем политику по умолчанию.
#=======================

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT

#=======================
# Создаем правила для всех интерфейсов.
#=======================

# http - открываем 80 порт
iptables -A INPUT -i ALL -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ALL -p icmp -j ACCEPT

#=======================
# Создаем правила для внутреннего интерфейса.
#=======================

# ssh - открываем 22

iptables -A INPUT -p tcp -i $LOCAL_IF -m tcp --dport 22 -j ACCEPT

осталось запустить скрипт

примеры отдельных цепочек:

Разрешаем все на внутренних интерфейсах (lo, eth0, eth1 - внутренние интрефейсы)
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ip --dport 80 -j ACCEPT

Открываем протокол
iptables -A INPUT -p gre -j ACCEPT

5. Ссылки на документацию по настройке iptables

http://www.posix.ru/network/iptables/ -статья Дмитрия Кулакова "Настройка межсетевого экрана Iptables"

http://www.opennet.ru/docs/RUS/iptables/ - статья Оскара Андерсона в переводе Андрея Киселева "Руководство по iptables"

http://system-administrators.info/?p=396 - статья "netfilter и iptables в Linux: принципы работы, настройка"

http://www.iptables.ru/ - пошаговое конфигурирование iptables. технической поддержки


Оставьте свой комментарий!

Итак, сегодня мы будем разбираться что же это за зверь такой этот IPTables и как с ним бороться, победить и обуздать? :)

IPTables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (фаервола или брандмауэра) NETFilter для ядер Linux, начиная с версии 2.4. Для использования утилиты IPTables требуются привилегии суперпользователя (root).

Иногда под словом IPTables имеется в виду и сам межсетевой экран NETFilter. С его помощью можно достаточно гибко управлять (в данном случае - обработкой пакетов, поступающих к нам или же исходящих от нас).

Например, можно запретить одному компьютеру доступ в Интернет, другому разрешить доступ только к сайтам, третьему "пробросить" (назначить) заранее определенный порт, а "подозрительные" пакеты отправлять назад отправителю (пусть сам себя ломает). Можно подменять «на лету» служебную информацию IP пакетов (отправитель, получатель, TTL , пр.) и многое другое, чего сразу и не придумаешь.

Что, для начала, следует знать о файрволах, - они предназначены для защиты, поэтому нужно крепко запомнить, что последним правилом (policy ) должно быть «запрещать остальное». Второе, но все же, не менее важное - всегда осторожно редактируйте правила или Telnet.

Случаи когда производилась настройка правил по удаленке, а после применения правил невнимательный админ оказывался "отрезан" от сервера не единичны! И хорошо, если сервер в двух шагах, а что если он где-то в тридевятом царстве?


Принцип работы брандмауэра

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

Порядок следования пакета приведен в таблице ниже:

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

Как Вы можете видеть, пакет проходит несколько этапов, прежде чем будет передан далее. На каждом из этапов пакет может быть остановлен, будь то цепочка iptables или что-либо еще, но нас главным образом интересует iptables.

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


Правила iptables

Приведу пример части моего конфига роутера: vlan332 - это интерфейс через который я получаю доступ к Интернету, vlan333 - доступ в локальную сеть провайдера, а 172.30.2.5 - мой компьютер.

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE

#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#Open port
iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP
iptables -A INPUT -p udp --dport 53 -j ACCEPT #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #WEB server

#Все остальное входящее "дропать" (удалять)
iptables -A INPUT -i vlan332 -j DROP

Что все это значит? Прежде всего, для удобства чтения я поделил конфиг на «секции» комментариями, т.е. в одной секции правила для NAT, в другой - проброс портов (PAT), в третей - разрешаем порты сервера и т.д.

Рассмотрим первое и второе правило (они отличаются только сетевыми интерфейсами):

iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE

Исходя из него, мы добавляем в таблицу nat (-t nat) новое правило для цепочки postrouting (-A POSTROUTING), которое будет последним на момент выполнения команды в цепочке (т.е. - в конец). Правило будет применяться на исходящем интерфейсе vlan332 (-o vlan332) и будет передаваться в MASQUERADE (-j MASQUERADE) те NAT.

Говоря человеческим языком, - все что будет выходить с интерфейса vlan332 должно скрываться за NAT"ом. Это значит, что при выходе с нашего маршрутизатора адресом отправителя будет указан наш сервер, а не конечный компьютер пользователя, с которого был отправлен запрос. Когда придет ответ на запрос, будет проведена обратная процедура и пакет будет передан изначальному отправителю. Для чего это нужно будет подробно расписано в статье про NAT.

Перейдем к следующей группе правил, а именно секции помеченной как "torrent". В этой секции указаны правила для проброса портов (PAT - Port Adress Translation), т.е. для того чтобы со стороны Интернета можно было подключится к порту на компьютере за нашим роутером. Без этого не смогут правильно работать многие приложения, например файлообменные сети torrent, DC++ и некоторые приложения, требующие входящих подключений из сети Интернет. Разберем правило на примере проброса (назначения) портов для Torrent клиента

iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

Как и в предыдущем правиле, мы указываем таблицу и цепочку (-A PREROUTING -t nat), указываем допустимый тип протокола. В текущем правиле TCP (-p tcp) (в другом правиле UDP, хотя их можно указать и в одном правиле, у меня это, к сожалению, не получилось даже с официальной литературой и решения пока не нашел).

Порт назначения 9000 (--dport 9000), входящий интерфейс vlan332. Действием DNAT (-j DNAT) мы указываем, что нужно подменить адрес получателя на 172.30.2.5 (--to 172.30.2.5) т.е. - наш компьютер. Получается: все входящие соединения по протоколу TCP на порт 9000 перенаправлять на IP 172.30.2.5.

iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP

Указываем цепочку INPUT, протокол TCP, порт под номером 53 (используется для работы служб DNS) и действие - разрешить . Вы можете заметить, что для DNS запросов используется UDP и это будет правильно. Для передачи же информации о зонах (доменах) используется TCP и так как мой сервер является первичным для нескольких зон, я разрешил доступ через TCP.

Последним правилом, как я говорил выше, должен быть запрет всего остального, что не попало под фильтры. Я написал iptables -A INPUT -i vlan332 -j DROP т.е. все входящие пакеты на интерфейс vlan332 удалять.

Так как у этого файрвола нет постоянного конфига, то при перезагрузке правила нужно вводить вручную. Это не беда, так как есть shell скрипты (аналог bat и cmd файлов в Windows) и при выполнении они будут запускать команды, в них прописанные.

Для этого создадим файлик в каталоге etc с именем firewall.sh командой nano /etс/firewall.sh т.е. откроем его сразу в редакторе. Впишем туда все необходимые нам правила и сохраним его нажав Ctrl+X.

Вот некоторые правила рабочего конфига, которые могут Вам пригодиться в повседневном использовании. Первая строка (#!/bin/sh) обязательна, так как она указывает чем нужно интерпретировать эти инструкции.

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

# Удалить все существующие правила всех таблиц и цепочек
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Разрешить любой трафик
iptables -A INPUT -i lo -j ACCEPT#Петля (loopback)
iptables -A INPUT -i eth0 -j ACCEPT#Внутренний интерфейс в локалку
iptables -A INPUT -i eth2 -j ACCEPT#Внутренний интерфейс в локалку 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE#Включить NAT в сторону Интернета
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE#Включить NAT в сторону провайдера (сеть провайдера)

#PORT FORWARDING
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5#Проброс портов на IP
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#VPN соединения, разрешение подключения через PPP и тп.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT

#Открываем порты сервера
iptables -A INPUT -p tcp --dport 23 -j ACCEPT #Разрешить доступ через SSH

#Все остальное входящее удалять ("дропать" - отбрасывать)
iptables -A INPUT -i vlan332 -j DROP

# Включение форвардинга, без этого не будет происходить маршрутизация пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

После этого делаем файл исполняемым, т.е.:
chmod +x /etс/firewall.sh (eXecute).

Чтобы данный файл отрабатывал автоматически при загрузке, пропишем путь к нему в файле «автозагрузки». Открываем nano /etс/rc.local и дописываем перед exit 0 строку /etс/firewall.sh Если необходимо использовать VLAN (виртуальные интерфейсы и сети), то нужно эту строку прописать в файле /etс/network/interfaces в виде up sh /etс/firewall.sh к интерфейсу vlan, например:

# VLAN to INET
auto vlan332
iface vlan332 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.252
# gateway xxx.xxx.xxx.xxx
vlan_raw_device eth1
up sh /etс/firewall.sh

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

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

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

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 можно превратить в надёжного защитника сетевых соединений. Системные администраторы активно используют утилиту для создания подключений, изолированных от несанкционированного доступа.

В Linux встроен брандмауэр называемый Netfilter. По данным официального сайта проекта:

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

Брандмауэр в Linux управляется программой iptables, которая имеет функции фильтрации IPv4, ip6tables фильтрует IPv6. Данное руководство рассказывает как научится пользоваться Netfilter (iptables) в CentOS / RHEL / Fedora / Redhat Enterprise Linux. В этой статье можно найти основные примеры настройки iptables в Linux для защиты от вторжений.

Примеры использования Iptables

  • Большинство из действий, перечисленных в этой статье пишутся с предположением, что они будут выполнены от root пользователя из bash или любой другой современной оболочке. Не вводите команды на удаленной системе, так как можете отключить себе доступ.
  • Для демонстрационных целей я использовал ubuntu 10.04, но команды должны работать с любым современным дистрибутивом.
Отображение состояния вашего брандмауэра
Введите следующую команду от root:
# iptables -L -n -v
Примерный ответ:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Такой ответ означает, что брандмауэр не активен.
А, например, такой покажет, что брандмауэр в Linux активен:

Chain INPUT (policy ACCEPT 1810K packets, 126M bytes) pkts bytes target prot opt in out source destination 7418K 1070M ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194 881 52520 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222 flags:0x17/0x02 state NEW Chain FORWARD (policy ACCEPT 5628K packets, 482M bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- eth0 tun0 0.0.0.0/0 0.0.0.0/0 tcp dpt:1111 state NEW,RELATED,ESTABLISHED 599K 539M ACCEPT udp -- eth0 * 0.0.0.0/0 10.1.1.6 udp dpt:1112 state NEW,RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT 4959K packets, 880M bytes) pkts bytes target prot opt in out source destination
Ключи в примере означают:

  • L : Вывести список правил.
  • v : Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. Счетчики пакетов и байтов, также будут показаны в списке, с "K" суффиксом, "М" или "G" в зависимости от необходимого множителя.
  • n : Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод.
Для просмотра правил с номером строки добавьте ключ --line-numbers, например:
# iptables -n -L -v --line-numbers
Для просмотра INPUT или OUTPUT правил, наберите:
# iptables -L INPUT -n -v # iptables -L OUTPUT -n -v --line-numbers
Остановка, перезапуск, запуск брандмауэра
Если у Вас CentOS / RHEL / Fedora Linux, вводите:
# service iptables stop # service iptables start # service iptables restart
Чтобы отчистить правила iptables его собственными средствами введите:
# iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT
Ключи в примере означают:
  • F : Удаление всех правил (flushing).
  • X : Удаление цепочки
  • t <таблица>: Выбрать таблицу и удалить правила.
  • P : Установить политику по умолчанию (например DROP, REJECT или ACCEPT).
Удаление правил брандмауэра
Для отображения номера строки наряду с другой информацией по существующим правилам, введите:
# iptables -L OUTPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers | less # iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8
Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. Например, удаление линии номер 4, введите:
# iptables -D INPUT 4
Или найти источник IP 202.54.1.1 и удалить из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
Ключ в примере означает:
  • D : удалить одно или несколько правил из указанной цепочки
Добавление правил брандмауэра
Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. Сначала узнать номер строки:
# iptables -L INPUT -n --line-numbers
Вывод например:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Чтобы вставить правило между 1 и 2, введите:
# iptables -I INPUT 2 -s 8.8.8.8 -j DROP
Для просмотра обновленных правил, введите:
# iptables -L INPUT -n --line-numbers
Вывод например:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 8.8.8.8 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Сохранение правил брандмауэра
Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables save
В других дистрибутивах
iptables-save > /root/my.active.firewall.rules
или
iptables-save
Восстановление правил брандмауэра
Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите:
# iptables-restore < /root/my.active.firewall.rules
Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables restart
Установка политик брандмауэра по умолчанию
Блокировать весь трафик:
# iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP # iptables -L -v -n
Блокировать только входящий трафик:
# iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT
Блокировка сетевых адресов локальной сети на внешнем интерфейсе
IP-спуфинг - атака заключающаяся в использовании в IP-пакетах, отправляемых жертве, в качестве обратного адреса IP-адрес хоста, которому она доверяет. Пакеты с немаршрутизируемыми адресами источника должны быть отвергнуты, используя следующий синтаксис:
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)
  • 10.0.0.0/8 -j (A)
  • 172.16.0.0/12 (B)
  • 192.168.0.0/16 ©
  • 224.0.0.0/4 (MULTICAST D)
  • 240.0.0.0/5 (E)
  • 127.0.0.0/8 (LOOPBACK)
Блокировка IP-адресов
Чтобы заблокировать IP адрес 1.2.3.4, введите:
# iptables -A INPUT -s 1.2.3.4 -j DROP
Блокировка входящие запросов на порт
Чтобы заблокировать все запросы на порт 80, введите:
# iptables -A INPUT -p tcp --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
Блокировка исходящего IP-адреса
Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как сайт, введите:
host -t a сайт
Ответ будет:
сайт has address 95.211.41.31
Запишите свой ​​IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31:
# iptables -A OUTPUT -d 95.211.41.31 -j DROP
Можно использовать маски:
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
Вы также можете использовать доменное имя, введите:
# iptables -A OUTPUT -p tcp -d www..ru -j DROP
Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется.
Логирование и блокирование пакетов
Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
По умолчанию все логируется в файл /var/log/messages .

Комментарий от :

Так лучше не делать, в особенности для явно левого трафика. LOG можно вставлять только строго с -m limit, иначе любая DoS-атака будет во много раз эффективнее: фактически косвенным образом злоумышленник получает прямой путь интенсивного воздействия непосредственно на файловую систему сервера.
Как делать правильнее, написано ниже
Логирование и блокирование пакетов с ограниченным количеством записей журнала
Параметр -m может ограничить количество записей в журнале созданных в единицу времени. Это используется для предотвращения флуда в файле журнала. Чтобы записывать не более 7 записей в 5 минут, введите:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Блокирование или разрешение трафика от Mac-адреса
Используйте следующий синтаксис:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP ## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ## # iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT
Запретить или разрешить ICMP запросы для ping
Введите следующую команду, чтобы заблокировать ICMP запросы:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Ping ответ также может быть ограничен определенными сетями или хостами:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Следующий пример принимает только ограниченный тип ICMP запросов:
### ** assumed that default INPUT policy set to DROP ** ############# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT ## ** all our server to respond to pings ** ## iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Открытие диапазона IP-адресов
Используйте следующий синтаксис, чтобы открыть диапазон IP-адресов:
## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 192.168.1.200 ## iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## nat example ## iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25
Закрытие или открытие общих портов
Ниже приведен синтаксис для открытия и закрытия портов общих портов TCP и UDP:
Replace ACCEPT with DROP to block port: ## open port ssh tcp port 22 ## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT ## open cups (printing service) udp/tcp port 631 for LAN users ## iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT ## allow time sync via NTP for lan users (open udp port 123) ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT ## open tcp port 25 (smtp) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT # open dns server ports for all ## iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT ## open http/https (Apache) server port to all ## iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT ## open tcp port 110 (pop3) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT ## open tcp port 143 (imap) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT ## open access to Samba file server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT ## open access to proxy server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT ## open access to mysql server for lan users only ## iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
Ограничить число одновременных подключений к серверу для каждого клиента по IP
Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. Для ограничения не больше 3 SSH соединений на хост, введите:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
Установить HTTP запросов до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Параметры в примере,
  • --connlimit-above 3: Соответствует ли количество существующих соединений выше 3.
  • --connlimit-mask 24: Группировать хосты по