1131 0

Настройка iptables

Iptables — утилита командной строки, является интерфейсом управления работой межсетевого экрана (брандмауэра) Netfilter. Из коробки стоит только в Debian, в CentOS и Ubuntu нужно устанавливать. Правила Iptables, по умолчанию, после перезагрузки не сохраняются. Утилита Iptables — для IPv4, утилита ip6tables — для IPv6 но он пока ещё не получил столь широкого распространения, поэтому не стоит над ним заморачиваться.

Структура iptables

Общие понятия

Таблицы содержат несколько цепочек.
Цепочки могут быть базовыми или пользовательскими (созданы пользователями). Цепочки могут содержать множество правил.
Правила определены для пакетов.
Нельзя просто так взять и отключить iptables, остановив службу или даже удалив iptables. Подсистема работает на уровне ядра и не зависит от того, что у вас установлено. Поэтому если сделаете что-то не так, то нужно очищать правила.
iptables состоит из таблиц, таблицы из цепочек, цепочки из правил.
iptables = Tables > Chains > Rules
iptables = Таблицы > Цепочки > Правила

Встроенные таблицы iptables

Таблица — совокупность базовых и пользовательских цепочек. Ниже описано – какая таблица, какие базовые цепочки содержит.

Таблица Filter — основная таблица, используется для фильтрации трафика. Таблица по умолчанию.
Содержит цепочки:
INPUT
OUTPUT
FORWARD

Таблица NAT — используется для трансляции(преобразования) сетевых адресов. Обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора и давать с него интернет в локальную сеть.
Содержит цепочки:
PREROUTING
POSTROUTING
OUTPUT

Таблица Mangle — предназначена для внесения изменений(модификации) заголовков пакетов. Редко необходима.
Содержит цепочки:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING

Таблица Raw — предназначена для исключений конфигурации. Используется редко.
Содержит цепочки:
PREROUTING
OUTPUT

Цепочки

Цепочки бывают двух типов – пользовательские цепочки и базовые цепочки.
Пользовательских цепочек может быть сколько угодно и называться они могут как угодно, также для них принято использовать нижний регистр.
Базовая цепочка создаётся по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием – действия по умолчанию:
Разрешить всё что не запрещено(policy ACCEPT)
Запретить всё что не разрешено(policy DROP)

Существует 5 типов базовых(стандартных) цепочек, встроенных в систему:
PREROUTING — Для работы с пакетами, перед маршрутизацией. Преобразование пакета происходит сразу после поступления пакета в систему, до маршрутизации. Может преобразовать IP-адрес назначения пакетов в то, что соответствует маршрутизации на локальном сервере. Используется для DNAT(целевой NAT). Именно на данном этапе нужно проводить операции проброса(DNAT, REDIRECT, NETMAP).
INPUT — Для входящих пакетов, перед тем как они будут переданы локальному приложению (входящий траффик).
FORWARD — Для работы с транзитными пакетами(сначала проходят цепь PREROUTING, затем FORWARD и POSTROUTING).
OUTPUT — Для пакетов, генерируемых локально и выходящих из локального сервера(исходящий траффик).
POSTROUTING — Для обработки пакетов, после маршрутизации. Может преобразовать исходный IP-адрес пакетов в то, что будет соответствовать маршрутизации на сервер назначения. Другими словами подменяет адрес источника для исходящих пакетов адресом того интерфейса, с которого они исходят, то есть осуществляет маскарадинг. Используется для SNAT(источник NAT).

Цепочки с одинаковым названием, но в разных таблицах — совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил, пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING.

Правила

Как уже говорилось, цепочки содержат правила. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие.
Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT, можно настроить и DROP.
Чем меньше номер правила тем оно приоритетней, первое созданное вами правило получит номер 1, второе – 2 и так далее.

Действия

Действия это результат выполнения правил(чаще всего используются первые два):
ACCEPT — принять пакет, пакет не будет более отслеживаться никаким правилом этой цепочки.
DROP — сбросить пакет.
LOG — сделать запись о пакете в лог файл.
MARK – используется для установки меток для определенных пакетов.
CONNMARK – схожа с MARK. Позволяет установить метку на пакеты одной сессии или соединения. Можно использовать в любой цепочке, но при этом учтите, что в таблице nat проверяется только первый пакет, а потому метки на всех пакетах будут бесполезны.
QUEUE — отправить пакет на обработку пользовательскому приложению. Может быть использовано для нужд учета, проксирования или дополнительной фильтрации пакетов.
RETURN — межсетевой экран прекратит выполнение следующего набора правил в текущей цепочке для этого пакета. Элемент управления будет возвращен в вызывающую цепочку.
REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен.
REDIRECT – выполняет перенаправление пакетов и потоков на другой порт той же самой машины. Можно пакеты поступающие на HTTP порт перенаправить на порт HTTP-proxy.
SNAT – используется для преобразования сетевых адресов (Source Network Address Translation) изменение исходящего IP адреса в IP в заголовке пакета.
MASQUERADE – в основе своей представляет то же самое, что и SNAT только не имеет ключа –to-source, если у вас динамическое подключение, то нужно использовать маскарадинг, если же у вас статическое IP подключение, то лучше будет использование SNAT.
TOS – используется для установки битов в поле Type of Service IP заголовка.
TTL – используется для изменения содержимого поля Time To Live в IP заголовоке.
ULOG – система журналирования пакетов, которая заменяет традиционное действие LOG, базирующееся на системном журнале.

Состояние пакета

Каждый пакет может иметь одно из четырёх возможных состояний:
NEW – пакет является первым для данного соединения (открывает новый сеанс). Классический пример — пакет TCP с флагом SYN.
RELATED – пакет открывает новый сеанс, связанный с уже открытым сеансом (например пассивный FTP).
ESTABLISHED – говорит о том что это не первый пакет в соединении (является частью уже существующего сеанса).
INVALID – пакет не идентифицирован, поэтому не имеет статуса (все прочие пакеты).

Синтаксис

iptables -t таблица действие цепочка дополнительные_параметры

Общие ключи

-t – указание таблицы
-A – добавить правило в цепочку
-С – проверить все правила
-D – удалить правило
-I – вставить правило с нужным номером
-L – вывести все правила в текущей цепочке
-n – адреса и порты в цифровом формате
-v – Отображать дополнительную информацию
–line-numbers – порядок правил
-S – просмотреть только список правил
-F – очистить все правила
-N – создать цепочку
-X – удалить цепочку
-P или –policy – установить политику действий по умолчанию
-E – переименование пользовательской цепочки
-Z – Обнулить все счётчики во всех правилах (iptables -Z)

Основные параметры правил

-p – указать протокол, один из all, tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
-s, –src, –source – указать ip адрес или подсеть устройства-отправителя пакета. При установленном флаге ! перед указанием фильтра – значение будет инвертировано (обратное значение –source адрес является, –source ! адрес не является)
-d, –dst, –destination – указать ip адрес получателя
-i, –in-interface – для входящего трафика на указанном интерфейсе используется в цепочках INPUT, FORWARD и PREROUTING
-o, –out-interface – для исходящего трафика на указанном интерфейсе

Параметры правил TCP, UDP, ICMP

Общий синтаксис iptables -A INPUT -p tcp –sport 22
–sport, –source-port – правило для порта-источника, если не указан порт – сработает для всех портов, допустимо инвертирование (!). Использование портов вместо имён сервисов уменьшит нагрузку и ускорит обработку; допустимо указать диапазон портов, например 80:1024 – для всех портов от 80 до 1024 включительно, либо :80 – для всех портов от 0 до 80 включительно.
–dport, –destination-port – правило для порта назначения, аналогия выше.
–icmp-type – проверяет соответствие типа ICMP-пакета

Дополнительные модули и параметры

-m – Подключить модуль (перед параметром обязательно указывать модуль)
–src-type – фильтр на основе типа адреса источника, можно указать один или несколько типов, разделив их запятой, допустимо инвертирование значения(!). Пример iptables -A INPUT -m addrtype –src-type MULTICAST, BROADCAST
–dst-type – то же самое, но для адреса получателя пакета
–comment “Для коментариев в конфиге”. Пример iptables -A INPUT -m comment –comment “This is comment”
–mark – фильтр на основе наличия указанной метки. Пример iptables -A INPUT -m connmark –mark 12 -j ACCEPT
–src-range – диапазон IP источников между двумя конкретными адресами, а не подсетью. Пример iptables -A INPUT -p tcp -m iprange –src-range 192.168.1.13-192.168.2.19
–length – допустимо указание диапазона размеров. Пример iptables -A INPUT -p tcp -m length –length 1400:1500
–limit – средняя скорость заполнения “счётчика”. Это же значение учитывается для уменьшения счётчика в –limit-burst Пример iptables -A INPUT -m limit –limit 3/hour
–limit-burst – максимальное значение счётчика для срабатывания правила. Каждый раз, когда значение –limit превышается – счётчик увеличивается на единицу. Пример iptables -A INPUT -m limit –limit-burst 5
–mac-source – MAC-адрес источника, используется только в цеочках PREROUTING, FORWARD и INPUT.
Пример iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
–mark – метка, установленная MARK. Пример iptables -t mangle -A INPUT -m mark –mark 1
–source-port – список портов источника, максимум 15 значений, разделённых запятыми, должен использоваться только с -p tcp или -p udp. Пример iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110 Пример 2 iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
–port – аналогично для обоих значений –source-port и –destination-port, для обоих направлений, сработает только в случае, если порт источника и порт назначения идентичны. Пример iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
–cmd-owner – фильтр по имени сервиса, который сгенерировал пакет; допустимо использование инвертации. Пример iptables -A OUTPUT -m owner –cmd-owner httpd
–uid-owner – фильтр по UID (User ID) пользователя, который сгенерировал пакет. Пример iptables -A OUTPUT -m owner –uid-owner 500
–gid-owner – аналогично, но для GID
–pid-owner – аналогично, но для PID (Process ID)
–sid-owner – аналогично, но для SID (Service ID)
–pkt-type – фильтры на основе типа адресации пакета, допустимо использование unicast, broadcast или multicast типов; допустим использование инвертации. Пример iptables -A OUTPUT -m pkttype –pkt-type unicast
–state – указывает состояние пакета в соединении; могут быть использованы четыре тип состояния – INVALID, ESTABLISHED, NEW и RELATED. INVALID – означает, что пакет ассоциируется с неизвестным стримом или соединением и может содержать некорректные данные или заголовки. ESTABLISHED – пакет принадлежит к уже установленному в обоих направлениях соединению и полностью валиден. NEW – пакет устанавливает или будет устанавливать новое соединение, или пакет соединения,у которого ещё не было передачи данных в обоих направлениях; RELATED – пакет, который устанавливает новое соединение, которое ассоциировано с уже установленным соединением (пример – пассивный режим FTP, или ошибка ICMP, связанная с каким-то TCP или UDP соединением ). Пример iptables -A INPUT -m state –state RELATED,ESTABLISHED

Ключи целей

-j, –jump – выбрать действие, если правило подошло, если опция не задана в правиле (и ключ -g не использован), то сработает только счётчик количества правила, целью может быть цепочка.
-g, –goto – продолжить обработку в цепочке, определённой пользователем, в отличие от опции –jump, после действия RETURN из вызванной цепочки, применение правил будет продолжено не в текущей цепочке, а в той цепочке, которая вызвала текущую через –jump.

–set-mark – устанавливает метку на пакет; значение может быть long int (от 0 до 4294967295l)
–save-mark – используется для сохранения метки пакета на всё соединение
–restore-mark – восстановить метку пакета из метки всего соединения, заданного CONNMARK
–mask – используется вместе с –save-mark и –restore-mark
Общий пример iptables -t nat -A PREROUTING -p tcp –dport 80 -j CONNMARK –set-mark 4

–log-level – указание log-level при логировании события.
–log-prefix – добавляет префикс к сообщениям в лог-файле; допустимо максимум 29 символов,включая пробелы и другие специальные символы
–log-tcp-sequence – записывать в лог номер TCP Sequence
-log-tcp-options – записывать в лог различные опции из заголовка TCP-пакета
Общий примерiptables -A FORWARD -p tcp -j LOG –log-tcp-options

–to-destination – указывает механизму DNAT какой IP задать в IP-заголовке пакета, и куда его пересылать. Пример iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10

–set-mark – устанавливается в виде int (целого числа), например для дальнейшей расширенной маршрутизации. Пример iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark

–to-ports – может быть использована для указания исходных порта или портов для исходящих пакетов; обязательно указание протокола (p- tcp или -p udp). Пример iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 1024-31000
–to-ports – может указывать порт или диапазон портов назначения; что бы указать диапазон – укажите их через тире; обязательно указание протокола (-p tcp или -p udp) Пример iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

–reject-with – выполняет REJECT с указанным ответом; сначала будет выполнен REJECT, отправлен ответ, после чего – DROP пакета. Пример iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset
–to-source – используется для указания исходного адреса пакета; допустимо указать диапазон адресов. Пример iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to-source 194.236.50.155-194.236.50.160:1024-32000

Примеры

Просмотр информации

iptables –version – узнать версию своего iptables
iptables -L – Показать все правила (по умолчанию покажет для таблицы Filter)
iptables –list – Показать все правила (аналогично -L)
iptables -L INPUT – Показать правила для цепочки INPUT
iptables -L -n – вывести все правила c портами в цифровом формате
iptables -L -n –line-numbers – вывести правила, пронумеровав их для ясности приоритетов
iptables -L -v -n – развёрнутый просмотр всех правил
iptables -t mangle –list – смотреть таблицу Mangle
iptables -S – узнать статус по умолчанию для всех цепочек

Изображение ниже демонстрирует абсолютно чистую никак не настроенную iptables, которая всё пропускает (policy ACCEPT – по умолчанию трафик разрешен). Правила iptables по умолчанию:

Изображение уже отстроенной таблицы.

В выводе данных команды iptables -L содержат следующие поля у правил:
num — Номер правила в цепочке
target — Действия с пакетом
prot — Протоколы: all, TCP, UDP, ICMP и т.д.
opt — Специальные опции для этого правила.
source — IP-адрес источника пакета
destination — IP-адрес получателя пакета

Общие примеры

Пропуск пакетов

iptables -P OUTPUT ACCEPT – разрешаем по умолчанию трафик через цепочку OUTPUT
iptables –policy OUTPUT ACCEPT – аналогично выше
iptables -A INPUT -p tcp –dport 80 -j ACCEPT – разрешаем на 80 порт все входящие tcp пакеты
iptables -A INPUT -p tcp –dport 22 -j ACCEPT – разрешить порт SSH
iptables -A INPUT -p tcp -s 0/0 –dport 22 -j ACCEPT – Правило -s 0/0 разрешает любой IP-адрес источника на 22 порт.
iptables -A INPUT -p tcp -s 12.12.12.12/32 –dport 22 -j ACCEPT – разрешить только подсети 12.12.12.12/32 подключаться к 22 порту
iptables -A INPUT -s 10.16.103.0/24 -p tcp –dport 80 -j ACCEPT – Создаем правило, в цепочке INPUT, разрешающее весь траффик на порт 80 по tcp с подсети 10.16.103.0/24
iptables -A INPUT -p tcp –sport 80 -j ACCEPT – Пропустить входящие tcp пакеты с 80 порта
iptables -A INPUT -p tcp –dport 80 -j ACCEPT – Пропустить входящие tcp пакеты к 80 порту
iptables -I INPUT -p tcp –dport 22 -j ACCEPT – Вставка (I – insert) правила разрешения SSH, в начало цепочки
iptables -I INPUT 3 -p tcp –dport 22 -j ACCEPT – Вставка (I – insert) правила разрешения SSH, на конкретную позицию (3)
iptables -I INPUT 1 -m state –state RELATED, ESTABLISHED -j ACCEPT – первым правилом разрешить трафик с уже установленных соединений
iptables -A INPUT -p icmp -j ACCEPT – разрешим ping пакеты
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 6000:6005 -j ACCEPT – Открыть диапазон портов
iptables -A INPUT -p tcp –destination-port 80 -m iprange –src-range 192.168.1.100-192.168.1.200 -j ACCEPT – Открыть диапазон адресов от 192.168.1.100 до 192.168.1.200 на порту 80

Блокировка пакетов

iptables -P OUTPUT DROP – запрещаем по умолчанию весь исходящий трафик
iptables -P INPUT DROP – по умолчанию весь входящий не оговорённый трафик будет сбрасываться
iptables -A INPUT -p tcp –dport 135 -j DROP – заблокировать порт 135
iptables -A INPUT -s 10.10.10.10 -j DROP – блокировка всех входящих пакетов с 10.10.10.10
iptables -A INPUT -s example.ru -j DROP – блокировка всех входящих пакетов с домена example.ru
iptables -A OUTPUT -p tcp -s 10.10.10.10 -j DROP – блокировка всех исходящих пакетов с 10.10.10.10
iptables -A OUTPUT -d 10.10.10.10 -j DROP – блокировка всех исходящих пакетов к 10.10.10.10
iptables -A INPUT -s 10.10.10.0/24 -j DROP – блокировка подсети (диапазона ip) 10.10.10.0/24
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP – тоже самое что и выше
iptables -A INPUT -p tcp –dport ssh -s 10.10.10.10 -j DROP – блокировка всех входящих соединений ssh с 10.10.10.10
iptables -A INPUT -p tcp -s 12.12.12.0/24 –dport 22 -j DROP – блокировка подсети с 12.12.12.1 по 12.12.12.255 подключаться к порту 22
iptables -I INPUT -p icmp –icmp-type 8 -j DROP – заблокировать входящие ping запросы
iptables -A INPUT -p icmp –icmp-type echo-request -j DROP – аналогично выше
iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 –dport 80 -j DROP – заблокировать запрос порта 80 с подсети 192.168.1.0/24 интерфеса eth1
iptables -A INPUT -p tcp –syn –dport 22 -m connlimit –connlimit-above 3 -j REJECT – разрешить только 3 ssh соединения на одного клиента
iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j DROP – Установить количество запросов HTTP до 20

Удаление правил

Удалять правила можно либо по номеру либо по содержимому.
iptables -D OUTPUT -s 10.10.10.10 -j DROP – Удалить правило на основе того, что оно делает (блокировки всех исходящих пакетов к 10.10.10.10)
iptables -F – Удалить все правила всех цепочек, по умолчанию из таблицы filter, еcли policy DROP отрубит все соединения и вас в том числе (предварительно выполните iptables -P INPUT ACCEPT).
iptables -F INPUT – Удалить все правила, только из цепочки INPUT
iptables -D INPUT 3 – Удалит 3-e правило, по его номеру в цепочке
iptables -A INPUT -m mac –mac-source e6:e6:f0:41:89:80 -j DROP – запретить трафик с МАС адреса
iptables -A INPUT -p tcp –dport 21 -m –mac-source ! e6:e6:f0:41:89:80 -j DROP -запрещаем доступ к ftp кроме MAC e6:e6:f0:41:89:89, без ! будет запрещён доступ пользователю с указанным MAC.
iptables -A INPUT -p tcp –destination-port 22 -m mac –mac-source e6:e6:f0:41:89:80 -j ACCEPT – разрешить только для TCP port 22 с mac адреса e6:e6:f0:41:89:80

Пример задействования пользовательской цепочки

Добавить к концу цепочки INPUT следующие правила: пропустить пакеты из 192.168.1.1, а всё остальное отправить на анализ в пользовательскую цепочку other_chain
iptables -A INPUT –source 192.168.1.1 –jump ACCEPT
iptables -A INPUT –jump other_chain

Записать событие в журнал

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG –log-prefix “IP_SPOOF A: ” – пометим событие в журнале как IP_SPOOF A
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit –limit 10/m –limit-burst 5 -j LOG –log-prefix “IP_SPOOF A: ” – Чтобы не переполнить раздел раздутым журналом, ограничим количество записей, записывать каждые 10 минут максимум 5 строк
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP – и сбросим сессию
События отображатся в журнале tail -f /var/log/messages
grep -i –color ‘IP_SPOOF’ /var/log/messages – вывести события журнала помеченные как IP_SPOOF

Пример настройки NAT таблицы

iptables -t nat -A PREROUTING -s 192.168.79.0/24 -p tcp –dport 80 -j REDIRECT –to-port 3128 – перенаправление пакетов (на прокси сервер к примеру)
iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to-destination 192.168.79.2:80 – проброс порта (к веб серверу в локальной сети)
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE – маскарадинг для доступа локальных пользователей в интернет

Сохранение Iptables

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

Сохранение правил iptables в CentOS

Отключить firewalld с помощью следующей команды:
systemctl disable firewalld
Затем установите iptables-service, выполнив следующую команду:
yum install iptables-services
Затем включите iptables в качестве служб:
systemctl enable iptables
Теперь вы можете сохранить свои правила iptable, выполнив следующую команду:
service iptables save

Сохранение правил iptables в Debian (Ubuntu)

Если у вас Ubuntu и вы всёравно решили установить и использовать iptables то UFW следуте отключить
ufw disable

Решение 1
Создадим файл /etc/network/if-pre-up.d/iptablesload с содержимым

#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0

Создадим файл /etc/network/if-post-down.d/iptablessave с содержимым

#!/bin/sh
iptables-save -c > /etc/iptables.rules
if [ -f /etc/iptables.downrules ]; then
iptables-restore < /etc/iptables.downrules
fi
exit 0

Дадим скриптам права на исполнение
sudo chmod +x /etc/network/if-post-down.d/iptablessave
sudo chmod +x /etc/network/if-pre-up.d/iptablesload

Нужно заметить что NetworkManager(в Ubuntu) конфликтует с iptables. И тут его нужно отключать
sudo stop network-manager
Что-бы не запустился во время загрузки:
echo “manual” | sudo tee /etc/init/network-manager.override

Решение 2

Сохранение через утилиту iptables-persistent
Установите iptables-persistent:
apt-get install iptables-persistent
Сохранение текущей конфигурации iptables для Debian:
invoke-rc.d netfilter-persistent save
или банально
iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6
Сохранение текущей конфигурации iptables для Ubuntu:
service iptables-persistent save
или
invoke-rc.d iptables-persistent save
Иногда может понадобится запуск службы iptables-persistent
service iptables-persistent start
При следующей загрузке они будут применены.
Дополнительные функции iptables-persistent {start|restart|reload|force-reload|save|flush}
Правила сохраняются в /etc/iptables/rules.v4 и /etc/iptables/rules.v6

Вариант 3
Сохраняем правила в файл
iptables-save > /etc/iptables.rules
Добавим в файл /etc/network/interfaces строчку, которая будет обеспечивать восстановление правил при подъеме сетевого интерфейса:
pre-up iptables-restore < /etc/iptables.rules

Вариант 4
Сохранение и восстановление вручную
Сохранить текущий конфиг в файл
iptables-save > /etc/iptables.rules
Восстановить конфиг из файла
iptables-restore < /etc/iptables.rules

Готовые кейсы

# Правильная очистка iptables
Чтобы вас ненароком не отрубило из-за INPUT DROP.
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
# Принимать уже установленные и связанные с ними соединения
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
аналогия
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешаем FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
или
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 21 -j ACCEPT
# Разрешаем HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Разрешаем HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# HTTP и HTTPS одной строкой
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT
# Разрешаем SMTP (простой протокол передачи почты)
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# Разрешаем pop3
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# Разрешаем pop3 и pop3s
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110,995 -j ACCEPT
# Разрешаем DNS
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Разрешаем rdp
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j ACCEPT
# Разрешаем mysql
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# Разрешаем ICMP (для возможности пингования)
iptables -A INPUT -p icmp -j ACCEPT
или
iptables -A INPUT -p icmp --icmp-type echo-request -i $LOCAL_INT -j ACCEPT
или
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# Доступ к портам 8081 и 8082 разрешаем только из сетей 91.***.**.0/24, 195.***.***.0/23 и IP 37.***.**.174
for net in 91.***.**.0/24 195.***.***.0/23 37.***.**.174; do
iptables -A INPUT -p tcp -m tcp -s $net -m multiport --dports 8081,8082 -j ACCEPT
done
iptables -A INPUT -p tcp -m tcp -m multiport --dports 8081,8082 -j DROP
# Логировать всё (включать только на етапе отладки), иначе забьёт всё
iptables -A INPUT -j LOG
# Логирование отброшеных пакето, только 15 сообщений в минуту
iptables -A INPUT -m limit --limit 15/minute -j LOG --log-level 7 --log-prefix "Dropped by firewall: "
# Разрешаем ping
iptables -A INPUT -p icmp -j ACCEPT
# Разрешаем только определённый MAC-адрес для SSH
iptables -A INPUT -p tcp –destination-port 22 -m mac –mac-source 00:60:ef:0b:f6:1a -j ACCEPT
# Разрешить SSH с адресов начиная от 10.0.0.5 и до 10.0.0.10 включительно:
iptables -A INPUT -p tcp –destination-port 22 -m iprange –src-range 10.0.0.5-10.0.0.10 -j ACCEPT
# Ограничить количество параллельных соединений к серверу для одного адреса. Чтобы разрешить только 3 SSH соединения на одного клиента:
iptables -A INPUT -p tcp –syn –dport 22 -m connlimit –connlimit-above 3 -j REJECT
# Нужно заблокировать все недействительные пакеты. Пакеты могут быть недействительными по нескольким причинам: они могут относиться к несуществующим соединениям, они могут быть предназначены для несуществующих интерфейсов, адресов или портов или же просто использовать неправильный формат.
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
или
iptables -A INPUT -m state --state INVALID -j DROP
# Отбрасывание всего входящего трафика
iptables -A INPUT -j DROP
или отбрасывание его по умолчанию
iptables -P INPUT DROP
# Блокировка сканирования порта
iptables -N block-scan - Создаём новую пользовательскую цепочку block-scan
iptables -A block-scan -p tcp --tcp-flags SYN,ACK,FIN,RST -m limit --limit 1/s -j RETURN
iptables -A block-scan -j DROP
Предотвращение DDoS атаки с помощью iptables
Способ 1
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
--limit 20/minute — максимальная средняя частота положительных результатов. После числа можно указывать единицы: `/second’, `/minute’, `/hour’, `/day’; значение по умолчанию — 3/hour. Лимит настраивайте в зависимости от своих требований.
--limit-burst number — ограничивает исходное число пропускаемых пакетов: это число увеличивается на единицу каждый раз когда ограничение на частоту положительных результатов не достигается. Это происходит столько раз, сколько указано в данном параметре. Значение по умолчанию — 5.
Способ 2
IPTABLES -A INPUT -p tcp -m tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT
Способ 3
Несколько простых правил, которые предотвращают самые распространённые атаки и защищают сервер от скрипт-кидди. На самом деле, не стоит полагаться на то, что iptables сможет самостоятельно отразить полноценную DDOS-атаку или нечто подобное, однако этот фаервол может без труда заблокировать доступ для сканирующих сеть ботов, которые ищут лазейки в безопасности сервера.
Сначала заблокируйте нулевые пакеты:

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Это правило блокирует входящие пакеты с tcp-флагами. Нулевые пакеты, по сути, являются средством разведки; они позволяют выяснить настройки сервера и определить его слабые места. Это правило предотвратит syn-flood атаки:

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

При syn-flood атаке злоумышленник создает новое подключение, при этом не устанавливая никаких флагов (SYN, ACK и т.д.); такие атаки проводятся с целью отнять ресурсы сервера, следовательно, эти пакеты принимать не следует. После этого нужно запретить разведывательные пакеты XMAS:

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Эти правила защитят сервер от самых распространённых атак.

Настройки для тепичного LAMP/LEMP сервера
# Разрешение трафика на localhost, чтобы все взаимодействия между приложением и базой данных на сервере продолжались, как обычно.
iptables -A INPUT -i lo -j ACCEPT
# Заблокируем все недействительные пакеты.
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Принимать уже установленные и связанные с ними соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешение подключения к SSH(порт 22), HTTP(порт 80) и HTTPS(порт 443) портам:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Разрешаем ICMP, для возможности пингования
iptables -A INPUT -p icmp -j ACCEPT
# Отбрасывание всего остального трафика, это предотвращает несанкционированный доступ к серверу по другим открытым портам:
iptables -A INPUT -j DROP
iptables -P FORWARD DROP
Tagged with: , ,

RELATED ARTICLES

LEAVE YOUR COMMENT

Your email address will not be published. Required fields are marked *




Скоро останутся лишь две группы работников: те, кто контролирует компьютеры, и те, кого контролируют компьютеры. Постарайтесь попасть в первую.

technicscoffee.com

Если вас как и меня интересуют: Linux, фантастика, технологии, игры и фильмы данных тематик, добро пожаловать на мой более развлекательный ресурс!

Категории