Используем iptables для защиты сервера от DDOS и Flood

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

Удаление

Для начала посмотрим какие записи в iptables работают.

# iptables -S

Обратите особое внимание на следующее пояснение: символ «#» в приведенном примере означает, что команда должна быть выполнена непосредственно от имени root или через команду sudo (так принято называть суперпользователя из «мира» Linux). В ином случае реализовать задуманную идею на практике не получится. Обязательно соблюдайте это правило для корректности предпринятых мер.

Очистим все записи фаервола для протокола tcp/ip 4 версии. Для этого будем использовать аргумент «-F».

# iptables -F

Тоже самое будет для протокола 6 версии.

# ip6tables -F

Если интересует удаление правил из другой таблицы (не текущей), тогда пропишите её наименование в середине рассматриваемой команды. Это может выглядеть следующим образом (как пример):

# iptables -t nat -F

Все правила, которые наличествуют в цепочках таблицы «nat» будут удалены.

Хотите удалить правила из определенной цепи в указанной таблице? Найдите наименование цепочки и пропишите его в команде. Давайте рассмотрим на конкретном примере:

# iptables -t nat -F PREROUTING

По номеру в цепочке

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

Прежде всего необходимо узнать номера цепочек. Для этого будем использовать опцию «line-numbers».

# iptables -L —line-numbers

Узнаем номера для nat.

# iptables -L -t nat —line-numbers

Для удаления необходимо указать аргумент «-D» название цепочки и номер правила.

Для таблицы INPUT.

# iptables -D INPUT номер строки

FORWARD.

# iptables -D FORWARD номер строки

OUTPUT.

# iptables -D OUTPUT номер строки

Чтобы очистить запись из nat таблице, необходимы добавить опцию «-t nat».

Для примера очистим запись из таблицы nat в цепочке PREROUTING.

# iptables -t nat -D PREROUTING номер строки

По спецификации

Запустите команду iptables с приставкой -D. Эта опция позволит пользователю осуществить задуманное. После приставки нужно указать спецификацию правила. Стандартная команда «iptables -S» позволит удалить правила упомянутым способом.

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

iptables -D INPUT -m conntrack —ctstate INVALID -j DROP

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

Заключение

После прочтения данной статьи вы знаете, за что отвечает утилита iptables, и какие существуют варианты удаления её правил. Для лучшего закрепления материала еще раз напомним пройденное другими словами: утилита iptables – это один из главных инструментов системного администратора. Она применяется для настройки правил фильтрации пакетов, которые установлены на устройстве с операционной системой Linux.

Читайте также:  Apple выпускает обновление iOS 11.4.1 beta 4

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

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

Проверяем выход пакетов Wireshark

Wireshark фиксирует поток

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

Проверяем выход пакетов Wireshark

# tcpdump -i eth0 icmp

для фиксации пакетов ICMP-протокола. Я немного поздновато снял скриншот, увидите почему.

Итак, самое интересное – сохраняем правила файрволла в файл, затем открываем его для редактирования:

# iptables-save > /etc/sysconfig/iptables # vi /etc/sysconfig/iptables

Проверяем выход пакетов Wireshark

и добавляем там следующие правила в цепочку INPUT

-A INPUT -p icmp -m limit —limit 1/sec —limit-burst 1 -j ACCEPT -A INPUT -p icmp -j DROP

Что это значит? Мы используем модуль limit. Его можно представить в качестве большого сосуда объёмом в –limit-burst пакетов (в нашем случае 1). Сосуд опустошается со скоростью –limit 1 пакет в секунду. Вот пока наш сосуд не переполнился – правила идут по его действию (-j ACCEPT), то есть принимаются. Как только “сосуд переполняется”, пакеты следуют к следующим правилам, а следующее у нас -j DROP.

Если бы у нас был сосуд ёмкостью в 10 пакетов (т.е. параметр –limit-burst был бы равен 10), то первые 10 пингов бы мы приняли, а затем они бы начали дропаться.

Проверяем выход пакетов Wireshark

Теперь посмотрим, что мы получили. По идее, к нам приходят 4 пакета в секунду. Мы принимаем только один. Остальные будем дропать.

Проверим это:

# watch -n 1 iptables -vnL INPUT

Эта команда раз в секунду (параметр -n) выполнит команду iptables -vnL для цепочки INPUT, т.е. показывает статистику по пакетам/байтам.

Проверяем выход пакетов Wireshark

Мы увидим два счётчика, причём у первого правила счётчик увеличивается на 1 каждую секунду, а второй счётчик – на три каждую секунду. Как раз то, что мы и хотели!

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

Вроде получилось! Теперь как мы можем это использовать?

Цепочка. Таблица.

Существует пять типов стандартных цепочек, встроенных в систему:

  • PREROUTING — для изначальной обработки входящих пакетов.
  • INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу).
  • FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING).
  • OUTPUT — для пакетов генерируемых локальными процессами.
  • POSTROUTING — для окончательной обработки исходящих пакетов.

Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables.

Читайте также:  11 лучших дистрибутивов Linux для программиста

Цепочки организованны в таблицы:

  • raw — просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT.
  • mangle — содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL, TOS, и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек:
  • nat — просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, POSTROUTING.
  • filter — основная таблица, используется по умолчанию если название таблицы не указано. Содержит цепочки: INPUT, FORWARD, OUTPUT.
  • security — Предназначена для изменения маркировки безопасности (меток SELinux) пакетов и соединений. Данная таблица добавлена в ядро Linux в версии Ранее операции с метками безопасности выполнялись в таблице mangle, и в целях обратной совместимости все действия, разрешенные для таблицы security, можно использовать и в таблице mangle.

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

Обработка пакета

Схематично обработку пакета можно изобразить следующим образом:

PACKET IN —>—PREROUTING—[ маршрутизация ]—>—-FORWARD—->—POSTROUTING—>— PACKET OUT — mangle | — mangle — mangle — nat (dst) | — filter — nat (src) | | | | INPUT OUTPUT — mangle — mangle — filter — nat (dst) | — filter | | `—->—-[ приложение ]—->—-'

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

Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUARADE (подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть

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

  1. mangle PREROUTING
  2. nat PREROUTING
  3. mangle INPUT
  4. filter INPUT

Когда приложение, на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблицы filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется-ли использовать DNAT (модификация назначения), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING которая может использовать SNAT и QoS. В случае успешного прохождения POSTROUTING пакет выходит в сеть.

  • ??? какая правильна последовательность прохождения пакета на выходе?
Читайте также:  Как защитить браузер от взлома — 5 способов

— mangle OUTPUT

  1. nat OUTPUT
  2. filter OUTPUT

Немного о протоколе TCP/IP

TCP/IP является протоколом, в котором соединение устанавливается в 3 фазы. Если компьютер А пытается установить соединение с компьютером Б они обмениваются специальными TCP пакетами.

A: SYN пакет (првыед Б!) Б: ACK пакет, SYN пакет (Ога!, как оно?) A: ACK пакет (дык, ничего)

После чего соединение считается установленным (ESTABLISHED). iptables различает эти состояния как NEW и ESTABLISHED.

FIN (англ. final, бит) — флаг, будучи установлен, указывает на завершение соединения.

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

SYN флуд

Если вы вспомните обсуждение трехсторонних рукопожатий TCP в предыдущем разделе, мы обнаружим, что в схеме есть слабое место: для каждого пакета SYN, который получает сервер, он должен назначить — и запомнить — соответствующее значение «seq», которое он отправляет с его SYN + ACK, чтобы авторизовать ACK клиента, когда он наконец получен.

То есть, если клиент отправляет пакет SYN, а сервер отвечает пакетом SYN + ACK, он теперь ожидает от клиента пакета ACK для завершения соединения. До получения пакета ACK сервер удерживает соединение в «полуоткрытом» состоянии, где он отслеживает номер «seq», назначенный этому потенциальному соединению, в ожидании пакета ACK клиента для его завершения.

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

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

Protect against SYN floods by rate limiting the number of newconnections from any host to 60 per second. This does *not* do ratelimiting overall, because then someone could easily shut us down bysaturating the -A INPUT -m state —state NEW -p tcp -m tcp —syn \-m recent —name synflood —setiptables -A INPUT -m state —state NEW -p tcp -m tcp —syn \-m recent —name synflood —update —seconds 1 —hitcount 60 -j DROP То же самое может быть достигнуто при ipfw использовании dummynet формирователя: Direct SYNipfw pipe 500 config bw 64Kbit/s queue 5ipfw add 500 pipe 500 tcp from any to any in setup