Iptables просмотр правил nat. Примеры использования Iptables. Соединения из диапазона IP-адресов


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

Порядок следования пакета

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination 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 для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту!

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

Таблица 3-2. Для локального приложения

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
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)

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

Таблица Mangle

Эта таблица предназначена, главным образом для внесения изменений в заголовки пакетов (mangle - искажать, изменять. прим. перев.). Т.е. в этой таблице вы можете устанавливать биты TOS (Type Of Service) и т.д. Еще раз напоминаю вам, что в этой таблице не следует производить любого рода фильтрацию, маскировку или преобразование адресов (DNAT, SNAT, MASQUERADE ).
В этой таблице допускается выполнять только нижеперечисленные действия:
  • MARK

    Действие TOS выполняет установку битов поля Type of Service в пакете. Это поле используется для назначения сетевой политики обслуживания пакета, т.е. задает желаемый вариант маршрутизации.
    Действие TTL используется для установки значения поля TTL (Time To Live) пакета. Мы можем присваивать определенное значение этому полю, чтобы скрыть наш брандмауэр от чересчур любопытных провайдеров (Internet Service Providers).
    Действие MARK устанавливает специальную метку на пакет, которая затем может быть проверена другими правилами в iptables или другими программами, например iproute2. С помощью "меток" можно управлять маршрутизацией пакетов, ограничивать траффик и т.п.

    Таблица Nat

    Эта таблица используется для выполнения преобразований сетевых адресов NAT (Network Address Translation). Как уже упоминалось ранее, только первый пакет из потока проходит через цепочки этой таблицы, трансляция адресов или маскировка применяются ко всем последующим пакетам в потоке автоматически. Для этой таблицы характерны действия:
  • MASQUERADE

    Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.

    SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия можно скрыть структуру локальной сети, а заодно и разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT, автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.

    Маскировка (MASQUERADE) применяется в тех же целях, что и SNAT, но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия - производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP, SLIP или DHCP.

    Таблица Filter

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

    Как строить правила

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

    Команды

    Команда -A , --append
    iptables -A INPUT ...
    Добавляет новое правило в конец заданной цепочки.
    Команда -D , --delete
    iptables -D INPUT --dport 80 -j DROP , iptables -D INPUT 1
    Удаление правила из цепочки. Команда имеет два формата записи, первый - когда задается критерий сравнения с опцией -D (см. первый пример), второй - порядковый номер правила. Если задается критерий сравнения, то удаляется правило, которое имеет в себе этот критерий, если задается номер правила, то будет удалено правило с заданным номером. Счет правил в цепочках начинается с 1.
    Команда -R , --replace
    iptables -R INPUT 1 -s 192.168.0.1 -j DROP
    Эта команда заменяет одно правило другим. В основном она используется во время отладки новых правил.
    Команда -I , --insert
    iptables -I INPUT 1 --dport 80 -j ACCEPT
    Вставляет новое правило в цепочку. Число, следующее за именем цепочки указывает номер правила, перед которым нужно вставить новое правило, другими словами число задает номер для вставляемого правила. В примере выше, указывается, что данное правило должно быть 1-м в цепочке INPUT .
    Команда -L , --list
    iptables -L INPUT
    Вывод списка правил в заданной цепочке, в данном примере предполагается вывод правил из цепочки INPUT . Если имя цепочки не указывается, то выводится список правил для всех цепочек. Формат вывода зависит от наличия дополнительных ключей в команде, например -n , -v , и пр.
    Команда -F , --flush
    iptables -F INPUT
    Сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках. (если не указана таблица ключом -t (--table) , то очистка цепочек производится только в таблице filter)
    Команда -Z , --zero
    iptables -Z INPUT
    Обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки. При использовании ключа -v совместно с командой -L , на вывод будут поданы и состояния счетчиков пакетов, попавших под действие каждого правила. Допускается совместное использование команд -L и -Z . В этом случае будет выдан сначала список правил со счетчиками, а затем произойдет обнуление счетчиков.
    Команда -N , --new-chain
    iptables -N allowed
    Создается новая цепочка с заданным именем в заданной таблице В выше приведенном примере создается новая цепочка с именем allowed . Имя цепочки должно быть уникальным и не должно совпадать с зарезервированными именами цепочек и действий (такими как DROP , REJECT и т.п.)
    Команда -X , --delete-chain
    iptables -X allowed
    Удаление заданной цепочки из заданной таблицы. Удаляемая цепочка не должна иметь правил и не должно быть ссылок из других цепочек на удаляемую цепочку. Если имя цепочки не указано, то будут удалены все цепочки заданной таблице кроме встроенных.
    Команда -P , --policy
    iptables -P INPUT DROP
    Задает политику по-умолчанию для заданной цепочки. Политика по-умолчанию определяет действие, применяемое к пакетам не попавшим под действие ни одного из правил в цепочке. В качестве политики по умолчанию допускается использовать DROP и ACCEPT .
    Команда -E , --rename-chain
    iptables -E allowed disallowed
    Команда -E выполняет переименование пользовательской цепочки. В примере цепочка allowed будет переименована в цепочку disallowed . Эти переименования не изменяют порядок работы, а носят только косметический характер.

    Команда должна быть указана всегда. Список доступных команд можно просмотреть с помощью команды iptables -h (iptables --help ). Некоторые команды могут использоваться совместно с дополнительными ключами. Ниже приводится список дополнительных ключей и описывается результат их действия. При этом заметьте, что здесь не приводится дополнительных ключей, которые используются при построении критериев (matches) или действий (targets). Эти опции мы будем обсуждать далее.

    Таблица 6-3. Дополнительные ключи

    Ключ -v , --verbose
    Используется c: --list , --append , --insert , --delete , --replace
    Используется для повышения информативности вывода и, как правило, используется совместно с командой --list . Для того, чтобы заставить команду --list выводить полное число (без употребления множителей) требуется применять ключ -x , который описан ниже. Если ключ -v , --verbose используется с командами --append , --insert , --delete или --replace , то будет выведен подробный отчет о произведенной операции.
    Ключ -x , --exact
    Используется c: --list
    Для всех чисел в выходных данных выводятся их точные значения без округления и без использования множителей K, M, G.
    Ключ -n , --numeric
    Используется c: --list
    Заставляет iptables выводить IP-адреса и номера портов в числовом виде предотвращая попытки преобразовать их в символические имена.
    Ключ --line-numbers
    Используется c: --list
    Ключ --line-numbers включает режим вывода номеров строк при отображении списка правил командой --list . Номер строки соответствует позиции правила в цепочке.
    Ключ -c , --set-counters
    Используется c: --insert , --append , --replace
    Этот ключ используется для установки начального значения счетчиков пакетов и байт в заданное значение при создании нового правила. Например, ключ --set-counters 20 4000 установит счетчик пакетов = 20, а счетчик байт в 4000.
    Ключ --modprobe
    Используется c: Все
    Ключ --modprobe определяет команду загрузки модуля ядра. Данный ключ может использоваться в случае, когда модули ядра находится вне пути поиска (search path)

    Критерии

    Здесь мы подробнее остановимся на критериях выделения пакетов.
    Общие критерии могут использоваться в любых правилах;
    TCP критерии TCP пакетам.
    UDP критерии которые применяются только к UDP пакетам.
    ICMP критерии для работы с ICMP пакетами.

    Общие критерии

    Их допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. К этой группе я умышленно отнес критерий --protocol несмотря на то, что он используется в некоторых специфичных от протокола расширениях. Например, мы решили использовать TCP критерий , тогда нам необходимо будет использовать и критерий --protocol которому в качестве дополнительного ключа передается название протокола -- TCP. Однако критерий --protocol сам по себе является критерием, который используется для указания типа протокола.

    Таблица 6-4. Общие критерии

    Критерий -p , --protocol
    iptables -A INPUT -p tcp
    Этот критерий используется для указания типа протокола. Примерами протоколов могут быть TCP , UDP и ICMP . Прежде всего, в качестве имени протокола в данный критерий можно передавать один из трех вышеупомянутых протоколов, а также ключевое слово ALL. В качестве протокола допускается передавать число - номер протокола, так например, протоколу ICMP соответствует число 1, TCP -- 6 и UDP -- 17. Соответствия между номерами протоколов и их именами вы можете посмотреть в файле /etc/protocols , который уже упоминался. Если данному критерию передается числовое значение 0, то это эквивалентно использованию спецификатора ALL, который подразумевается по умолчанию, когда критерий --protocol не используется. Для логической инверсии критерия, перед именем протокола (списком протоколов) используется символ ! , например --protocol ! tcp подразумевает пакеты протоколов, UDP и ICMP .
    Критерий -s , --src , --source
    iptables -A INPUT -s 192.168.1.1
    IP-адрес(а) источника пакета. Адрес источника может указываться так, как показано в примере, тогда подразумевается единственный IP-адрес. А можно указать адрес в виде address/mask, например как 192.168.0.0/255.255.255.0 , или более современным способом 192.168.0.0/24 , т.е. фактически определяя диапазон адресов Как и ранее, символ!, установленный перед адресом, означает логическое отрицание, т.е. --source ! 192.168.0.0/24 означает любой адрес кроме адресов 192.168.0.x .
    Критерий -d , --dst , --destination
    iptables -A INPUT -d 192.168.1.1
    IP-адрес(а) получателя. Имеет синтаксис схожий с критерием --source , за исключением того, что подразумевает адрес места назначения. Точно так же может определять как единственный IP-адрес, так и диапазон адресов. Символ! используется для логической инверсии критерия.
    Критерий -i , --in-interface
    iptables -A INPUT -i eth0
    Интерфейс, с которого был получен пакет. Использование этого критерия допускается только в цепочках INPUT , FORWARD и PREROUTING , в любых других случаях будет вызывать сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -i + + -i PPP+ обозначает любой PPP интерфейс, а запись -i ! eth+ -- любой интерфейс, кроме любого eth.
    Критерий -o , --out-interface
    iptables -A FORWARD -o eth0
    Задает имя выходного интерфейса. Этот критерий допускается использовать только в цепочках OUTPUT , FORWARD и POSTROUTING , в противном случае будет генерироваться сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -o + . Как и прежде, символ! инвертирует результат совпадения. Если имя интерфейса завершается символом + , то критерий задает все интерфейсы, начинающиеся с заданной строки, например -o eth+ обозначает любой eth интерфейс, а запись -o ! eth+ - любой интерфейс, кроме любого eth.
    Критерий -f , --fragment
    iptables -A INPUT -f
    Правило распространяется на все фрагменты фрагментированного пакета, кроме первого, сделано это потому, что нет возможности определить исходящий/входящий порт для фрагмента пакета, а для ICMP-пакетов определить их тип. С помощью фрагментированных пакетов могут производиться атаки на ваш брандмауэр, так как фрагменты пакетов могут не отлавливаться другими правилами. Как и раньше, допускается использования символа! для инверсии результата сравнения. только в данном случае символ! должен предшествовать критерию -f , например ! -f . Инверсия критерия трактуется как "все первые фрагменты фрагментированных пакетов и/или нефрагментированные пакеты, но не вторые и последующие фрагменты фрагментированных пакетов".

    Неявные критерии

    В этом разделе мы рассмотрим неявные критерии , точнее, те критерии, которые подгружаются неявно и становятся доступны, например при указании критерия --protocol tcp . На сегодняшний день существует три автоматически подгружаемых расширения, это TCP критерии , UDP критерии и ICMP критерии (при построении своих правил я столкнулся с необходимостью явного указания ключа -m tcp , т.е. о неявности здесь говорить не приходится, поэтому будьте внимательнее при построении своих правил, если что-то не идет -- пробуйте явно указывать необходимое расширение. прим. перев .) . Загрузка этих расширений может производиться и явным образом с помощью ключа -m, -match, например -m tcp.

    TCP критерии

    Этот набор критериев зависит от типа протокола и работает только с TCP пакетами. Чтобы использовать их, вам потребуется в правилах указывать тип протокола --protocol tcp . Важно: критерий --protocol tcp обязательно должен стоять перед специфичным критерием. Эти расширения загружаются автоматически как для tcp протокола, так и для udp и icmp протоколов. (О неявной загрузке расширений я уже упоминал выше прим. перев. ) .

    Таблица 6-5. TCP критерии

    Критерий --sport , --source-port
    iptables -A INPUT -p tcp --sport 22
    Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле /etc/services. При указании номеров портов правила отрабатывают несколько быстрее. однако это менее удобно при разборе листингов скриптов. Номера портов могут задаваться в виде интервала из минимального и максимального номеров, например --source-port 22:80 . Если опускается минимальный порт, т.е. --source-port:80 , то в качестве начала диапазона принимается число 0. Если опускается максимальный порт, т.е. --source-port 22: , то в качестве конца диапазона принимается число 65535. Как и раньше, символ ! используется для инверсии. Так критерий --source-port ! 22 , или --source-port ! 22:80 .
    Критерий --dport , --destination-port
    iptables -A INPUT -p tcp --dport 22
    Порт или диапазон портов, на который адресован пакет. Аргументы задаются в том же формате, что и для --source-port .
    Критерий --tcp-flags
    iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
    Определяет маску и флаги tcp-пакета. Пакет считается удовлетворяющим критерию, если из перечисленных флагов в первом списке в единичное состояние установлены флаги из второго списка. Так для вышеуказанного примера под критерий подпадают пакеты у которых флаг SYN установлен, а флаги FIN и ACK сброшены. В качестве аргументов критерия могут выступать флаги SYN, ACK, FIN, RST, URG, PSH , а так же зарезервированные идентификаторы ALL и NONE . ALL -- значит ВСЕ флаги и NONE - НИ ОДИН флаг. Так, критерий --tcp-flags ALL NONE означает -- "все флаги в пакете должны быть сброшены" . Как и ранее, символ ! означает инверсию критерия Важно: имена флагов в каждом списке должны разделяться запятыми, пробелы служат для разделения списков.
    Критерий --syn
    iptables -p tcp --syn
    Критерий --syn является по сути реликтом, перекочевавшим из ipchains. Критерию соответствуют пакеты с установленным флагом SYN и сброшенными флагами ACK и FIN . Этот критерий аналогичен критерию --tcp-flags SYN,ACK,FIN SYN . Такие пакеты используются для открытия соединения TCP . Заблокировав такие пакеты, вы надежно заблокируете все входящие запросы на соединение, однако этот критерий не способен заблокировать исходящие запросы на соединение. Как и ранее, допускается инвертирование критерия символом ! . Так критерий ! --syn означает -- "все пакеты, не являющиеся запросом на соединение" , т.е. все пакеты с установленными флагами FIN или ACK .
    Критерий --tcp-option
    iptables -p tcp --tcp-option 16
    Удовлетворяющим условию данного критерия будет будет считаться пакет, TCP параметр которого равен заданному числу. TCP Option - это часть заголовка пакета. Она состоит из 3 различных полей. Первое 8-ми битовое поле содержит информацию об опциях, используемых в данном соединении. Второе 8-ми битовое поле содержит длину поля опций. Если следовать стандартам до конца, то следовало бы реализовать обработку всех возможных вариантов, однако, вместо этого мы можем проверить первое поле и в случае, если там указана неподдерживаемая нашим брандмауэром опция, то просто перешагнуть через третье поле (длина которого содержится во втором поле). Пакет, который не будет иметь полного TCP заголовка, будет сброшен автоматически при попытке изучения его TCP параметра. Как и ранее, допускается использование флага инверсии условия ! .

    UDP критерии

    Эти расширения подгружаются автоматически при указании типа протокола --protocol udp . Важно отметить, что пакеты UDP не ориентированы на установленное соединение, и поэтому не имеют различных флагов которые дают возможность судить о предназначении датаграмм. Получение UDP пакетов не требует какого либо подтверждения со стороны получателя. Если они потеряны, то они просто потеряны (не вызывая передачу ICMP сообщения об ошибке). Это предполагает наличие значительно меньшего числа дополнительных критериев, в отличие от TCP пакетов. Важно: Хороший брандмауэр должен работать с пакетами любого типа, UDP или ICMP , которые считаются не ориентированными на соединение, так же хорошо как и с TCP пакетами. Об этом мы поговорим позднее, в следующих главах.

    Таблица 6-6. UDP критерии

    ICMP критерии

    Этот протокол используется, как правило, для передачи сообщений об ошибках и для управления соединением. Он не является подчиненным IP протоколу, но тесно с ним взаимодействует, поскольку помогает обрабатывать ошибочные ситуации. Заголовки ICMP пакетов очень похожи на IP заголовки, но имеют и отличия. Главное свойство этого протокола заключается в типе заголовка, который содержит информацию о том, что это за пакет. Например, когда мы пытаемся соединиться с недоступным хостом, то мы получим в ответ сообщение ICMP host unreachable . Полный список типов ICMP сообщений, вы можете посмотреть в приложении Типы ICMP . Существует только один специфичный критерий для ICMP пакетов. Это расширение загружается автоматически, когда мы указываем критерий --protocol icmp . Заметьте, что для проверки ICMP пакетов могут употребляться и общие критерии, поскольку известны и адрес источника и адрес назначения и пр.

    Таблица 6-7. ICMP критерии


    Продолжение: Действия и переходы
  • Введение и история

    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!

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

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

    Настройка netfilter/iptables для рабочей станции

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

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

    Netfilter:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

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

    Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -P FORWARD DROP

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

    Netfilter:~# ping -c2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted --- localhost ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1004ms

    На самом деле это полностью не функционирующая сеть и это не очень хорошо, т.к. некоторые демоны используют для обмена между собой петлевой интерфейс, который после проделанных действий более не функционирует. Это может нарушить работу подобных сервисов. Поэтому в первую очередь в обязательно разрешим передачу пакетов через входящий петлевой интерфейс и исходящий петлевой интерфейс в таблицах INPUT (для возможности получения отправленных пакетов) и OUTPUT (для возможности отправки пакетов) соответственно. Итак, обязательно выполняем:

    Netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT

    После этого пинг на локалхост заработает:

    Netfilter:~# ping -c1 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0.116 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 116ms rtt min/avg/max/mdev = 0.116/0.116/0.116/0.116 ms

    Если подходить к настройке файервола не шибко фанатично, то можно разрешить работу протокола ICMP:

    Netfilter:~# iptables -A INPUT -p icmp -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

    Более безопасно будет указать следующую аналогичную команду iptables:

    Netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

    Данная команда разрешит типы ICMP пакета эхо-запрос и эхо-ответ, что повысит безопасность.

    Зная, что наш комп не заражен (ведь это так?) и он устанавливает только безопасные исходящие соединения. А так же, зная, что безопасные соединения - это соединения из т.н. эфимерного диапазона портов , который задается ядром в файле /proc/sys/net/ipv4/ip_local_port_range, можно разрешить исходящие соединения с этих безопасных портов:

    Netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT

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

    Netfilter:~# iptables -A OUTPUT -j ACCEPT netfilter:~# # или просто задать политику по умолчанию ACCEPT для цепочки OUTPUT netfilter:~# iptables -P OUTPUT ACCEPT

    Далее, зная что в netfilter сетевые соединения имеют 4 состояния (NEW, ESTABLISHED, RELATED и INVALID ) и новые исходящие соединения с локального компьютера (с состоянием NEW) у нас разрешены в прошлых двух командах iptables, что уже установленные соединения и дополнительные имеют состояния ESTABLISHED и RELATED, соответственно, а так же зная, что к локальной системе приходят через , можно разрешить попадание на наш компьютер только тех TCP- и UDP-пакетов, которые были запрошены локальными приложениями:

    Netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

    Это собственно, все! Если на десктопе все же работает какая-то сетевая служба, то необходимо добавить соответствующие правила для входящих соединений и для исходящих. Например, для работы ssh-сервера , который принимает и отправляет запросы на 22 TCP-порту, необходимо добавить следующие iptables-правила :

    Netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j ACCEPT netfilter:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j ACCEPT

    Т.е. для любого сервиса нужно добавить по одному правилу в цепочки INPUT и OUTPUT, разрешающему соответственно прием и отправку пакетов с использованием этого порта для конкретного сетевого интерфейса (если интерфейс не указывать, то будет разрешено принимать/отправлять пакеты по любому интерфейсу).

    Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.

    Давайте теперь рассмотрим наш Linux в качестве шлюза для локальной сети во внешнюю сеть Internet . Предположим, что интерфейс eth0 подключен к интернету и имеет IP 198.166.0.200, а интерфейс eth1 подключен к локальной сети и имеет IP 10.0.0.1. По умолчанию, в ядре Linux пересылка пакетов через цепочку FORWARD (пакетов, не предназначенных локальной системе) отключена. Чтобы включить данную функцию, необходимо задать значение 1 в файле :

    Netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward

    Чтобы форвардинг пакетов сохранился после перезагрузки, необходимо в файле /etc/sysctl.conf раскомментировать (или просто добавить) строку net.ipv4.ip_forward=1 .

    Итак, у нас есть внешний адрес (198.166.0.200), в локальной сети имеется некоторое количество гипотетических клиентов, которые имеют и посылают запросы во внешнюю сеть. Если эти клиенты будут отправлять во внешнюю сеть запросы через шлюз "как есть", без преобразования, то удаленный сервер не сможет на них ответить, т.к. обратным адресом будет получатель из "локальной сети". Для того, чтобы эта схема корректно работала, необходимо подменять адрес отправителя, на внешний адрес шлюза Linux. Это достигается за счет (маскарадинг) в , в .

    Netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 10.0.0.1/24 -j ACCEPT netfilter:~# iptables -P FORWARD DROP netfilter:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    Итак, по порядку сверху-вниз мы разрешаем уже установленные соединения в цепочке FORWARD , таблице filter , далее мы разрешаем устанавливать новые соединения в цепочке FORWARD , таблице filter , которые пришли с интерфейса eth1 и из сети 10.0.0.1/24. Все остальные пакеты, которые проходят через цепочку FORWARD - отбрасывать. Далее, выполняем маскирование (подмену адреса отправителя пакета в заголовках) всех пакетов, исходящих с интерфейса eth0.

    Примечание. Есть некая общая рекомендация: использовать правило -j MASQUERADE для интерфейсов с динамически получаемым IP (например, по DHCP от провайдера). При статическом IP, -j MASQUERADE можно заменить на аналогичное -j SNAT -to-source IP_интерфейса_eth0. Кроме того, SNAT умеет "помнить" об установленных соединениях при кратковременной недоступности интерфейса. Сравнение MASQUERADE и SNAT в таблице:

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

    Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

    В результате, если один из хостов локальной сети, например 10.0.0.2, попытается связаться с одним из интернет-хостов, например, 93.158.134.3 (ya.ru), при , их исходный адрес будет подменяться на внешний адрес шлюза в цепочке POSTROUTING таблице nat, то есть исходящий IP 10.0.0.2 будет заменен на 198.166.0.200. С точки зрения удаленного хоста (ya.ru), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 198.166.0.200. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 10.0.0.2, после чего пакеты будут передаваться настоящему получателю в локальной сети. Для такого обратного преобразования никаких дополнительных правил указывать не нужно - это будет делать все та же операция MASQUERADE , которая помнит какой хост из локальной сети отправил запрос и какому хосту необходимо вернуть пришедший ответ.

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

    Netfilter:~# iptables -F ИМЯ_ЦЕПОЧКИ

    Предоставление доступа к сервисам на шлюзе

    Предположим, что на нашем шлюзе запущен некий сервис, который должен отвечать на запросы поступающие из сети интернет. Допустим он работает на некотором TCP порту nn. Чтобы предоставить доступ к данной службе, необходимо модифицировать таблицу filter в цепочке INPUT (для возможности получения сетевых пакетов, адресованных локальному сервису) и таблицу filter в цепочке OUTPUT (для разрешения ответов на пришедшие запросы).

    Итак, мы имеем , который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

    Netfilter:~# iptables -A INPUT -p TCP --dport nn -j ACCEPT netfilter:~# iptables -A OUTPUT -p TCP --sport nn -j ACCEPT

    Данные правила разрешают входящие соединения по протоколу tcp на порт nn и исходящие соединения по протоколу tcp с порта nn. Кроме этого, можно добавить дополнительные ограничивающие параметры, например разрешить входящие соединения только с внешнего интерфейса eth0 (ключ -i eth0 ) и т.п.

    Предоставление доступа к сервисам в локальной сети

    Предположим, что в нашей локальной сети имеется какой-то хост с IP X.Y.Z.1, который должен отвечать на сетевые запросы из внешней сети на TCP-порту xxx. Для того чтобы при обращении удаленного клиента ко внешнему IP на порт xxx происходил корректный ответ сервиса из локальной сети, необходимо направить запросы, приходящие на внешний IP порт xxx на соответствующий хост в локальной сети. Это достигается модификацией адреса получателя в пакете, приходящем на указанный порт. Это действие называется DNAT и применяется в цепочке PREROUTING в таблице nat. А так же разрешить прохождение данный пакетов в цепочке FORWARD в таблице filter.

    Опять же, пойдем по пути . Итак, мы имеем , который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

    Netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1 netfilter:~# iptables -A FORWARD -i eth0 -p tcp -d X.Y.Z.1 --dport xxx -j ACCEPT

    Сохранение введенных правил при перезагрузке

    Все введенные в консоли правила - после перезагрузки ОС будут сброшены в первоначальное состояние (читай - удалены). Для того чтобы сохранить все введенные команды iptables , существует несколько путей. Например, один из них - задать все правила брандмауэра в файле инициализации . Но у данного способа есть существенный недостаток: весь промежуток времени с запуска сетевой подсистемы, до запуска последней службы и далее скрипта rc.local из SystemV операционная система будет не защищена. Представьте ситуацию, например, если какая-нибудь служба (например NFS) стартует последней и при ее запуске произойдет какой-либо сбой и до запуска скрипта rc.local. Соответственно, rc.local так и не запуститься, а наша система превращается в одну большую дыру.

    Поэтому самой лучшей идеей будет инициализировать правила netfilter/iptables при загрузке . Для этого в Debian есть отличный инструмент - каталог /etc/network/if-up.d/ , в который можно поместить скрипты, которые будут запускаться при старте сети. А так же есть команды iptables-save и iptables-restore , которые сохраняют создают дамп правил netfilter из ядра на и восстанавливают в ядро правила со соответственно.

    Итак, алгоритм сохранения iptables примерно следующий :

    • Настраиваем сетевой экран под свои нужны с помощью
    • создаем дамп созданный правил с помощью команды iptables-save > /etc/iptables.rules
    • создаем скрипт импорта созданного дампа при старте сети (в каталоге /etc/network/if-up.d/) и не забываем его сделать исполняемым:
    # cat /etc/network/if-up.d/firewall #!/bin/bash /sbin/iptables-restore < /etc/iptables.rules exit 0 # chmod +x /etc/network/if-up.d/firewall

    Дамп правил, полученный командой iptables-save имеет текстовый формат, соответственно пригоден для редактирования. Синтаксис вывода команды iptables-save следующий :

    # Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *filter:INPUT ACCEPT :FORWARD ACCEPT ....... # комментарий -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT ........... -A FORWARD -j REJECT COMMIT # Completed on Sat Dec 24 22:35:13 2011 # Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *raw ...... COMMIT

    Строки, начинающиеся на # - комментарии, строки на * - это название таблиц, между названием таблицы и словом COMMIT содержатся параметры, передаваемые команде iptables. Параметр COMMIT - указывает на завершение параметров для вышеназванной таблицы. Строки, начинающиеся на двоеточие задают цепочки, в которых содержится данная таблица в формате:

    :цепочка политика [пакеты:байты]

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

    В RedHat функции хранения команд iptables выполняемых при старте и останове сети выполняет файл /etc/sysconfig/iptables . А управление данным файлом лежит на демоне iptables.

    Как еще один вариант сохранения правил, можно рассмотреть использование параметра up в файле /etc/network/interfaces с аргументом в виде файла, хранящего команды iptables, задающие необходимые правила.

    Итог

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

    С Уважением, 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, без состояния

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