Руководства, Инструкции, Бланки

руководство по Iptables img-1

руководство по Iptables

Категория: Руководства

Описание

Руководство по iptables

Iptables. Настройка для начинающих

Feb 27 th. 2015 3:20 pm

Небольшой первоначальный скрипт (правила, iptables faq) для десктопа или простого сервера. В данном случае примеры по работе с портами того или иного ПО, запущенного на вашем компьютере. На любом компьютере необходимо соблюдать меры безопасности. Миф о том, что Linux более защищен - не верен, все зависит от корявости рук администратора. Есть и хорошо защищенные Windows -системы, как и открытые практически любому Linux -системы. Поэтому стоит все-таки немного подумать и о сетевой защите компьютера. Ниже добавлены некоторые правила для iptables. которые могут вначале пригодиться.

Специально заменил $IPT на /sbin/iptables, если кому-то понадобится только одно правило, чтобы не менять что-либо - просто скопировал и выполнил. Естественно, здесь пока мало правил, нет различных VPN и т.д. если есть желание - добавьте.

Эти строки можно скопировать целиком в какой-либо скрипт и просто его выполнить. Для обычных случаев этого вполне хватит. Если какое-либо приложение не может выйти в сеть, специально добавлено логирование. Просто открывайте tail -f /var/log/syslog (или ваше, если отличное от Ubuntu ) и смотрите! Если есть вопросы - добавьте их в обсуждение, будем вместе решать.

PS Кроме этих правил, подумайте о том, что стоит взять из статьи Оптимизация TCP .

Скрипт и правила IPTABLES

Другие статьи

21 пример использования iptables для администраторов

21 пример использования iptables для администраторов.

Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами - sudo -i в Debian-based системах или su в остальных.

1. Показать статус.

Примерный вывод команды для неактивного файрвола:

Для активного файрвола:

Где:
-L. Показать список правил.
-v. Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n. Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

# iptables -n -L -v --line-numbers

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

3. Отобразить INPUT или OUTPUT цепочки правил.

# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers

4. Остановить, запустить, перезапустить файрвол.

Силами самой системы:
# service ufw stop
# service ufw start

Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:
# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

Где:
-F. Удалить (flush) все правила.
-X. Удалить цепочку.
-t table_name. Выбрать таблицу (nat или mangle) и удалить все правила.
-P. Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Чтобы отобразить номер строки с существующими правилами:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:
# iptables -D INPUT 3

Или найдем IP адрес источника (202.54.1.1) и удалим из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP

Где:
-D. Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:
# iptables -L INPUT -n --line-numbers

Чтобы вставить правило между 1 и 2 строкой:
# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

Проверим, обновилось ли правило:
# iptables -L INPUT -n --line-numbers

Вывод станет таким:

7. Сохраняем правила файрвола.

Через iptables-save:
# iptables-save > /etc/iptables.rules

8. Восстанавливаем правила.

Через iptables-restore
# iptables-restore

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

Чтобы сбрасывать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

После вышеперечисленных команд ни один пакет не покинет данный хост.
# ping google.com

10. Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n

Пакеты исходящие и те, которые были запомнены в рамках установленных сессий - разрешены.
# ping google.com

11. Сбрасывать адреса изолированных сетей в публичной сети.

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

Чтобы заблокировать адрес взломщика 1.2.3.4:
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP

13. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

14. Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:
# host -t a facebook.com

Вывод: facebook.com has address 69.171.228.40

Найдем CIDR для 69.171.228.40:
# whois 69.171.228.40 | grep CIDR

Вывод:
CIDR: 69.171.224.0/19

Заблокируем доступ на 69.171.224.0/19:
# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Также можно использовать домен для блокировки:
# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

15. Записать событие и сбросить.

Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Проверим журнал (по умолчанию /var/log/messages):
# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages

16. Записать событие и сбросить (с ограничением на количество записей).

Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

17. Разрешить или запретить ICMP Ping запросы.

Чтобы запретить ping:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

Разрешить для определенных сетей / хостов:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Разрешить только часть ICMP запросов:
### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

19. Открыть диапазон адресов.

## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить количество запросов HTTP до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

Где:
--connlimit-above 3. Указывает, что правило действует только если количество соединений превышает 3.
--connlimit-mask 24. Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables

Чтобы посмотреть помощь по определенным командам и целям:
# iptables -j DROP -h

Проверка правила iptables.

Проверяем открытость / закрытость портов:
# netstat -tulpn

Проверяем открытость / закрытость определенного порта:
# netstat -tulpn | grep :80

Проверим, что iptables разрешает соединение с 80 портом:
# iptables -L INPUT -v -n | grep 80

В противном случае откроем его для всех:
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Проверяем с помощью telnet
$ telnet ya.ru 80

Можно использовать nmap для проверки:
$ nmap -sS -p 80 ya.ru

Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.

Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.

Основы использования iptables

Основы использования iptables

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

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

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

Например, к нам пришел пакет от адреса 192.168.164.84 для 128.3.4.5, применим цепочку из трех правил к этому пакету:номер правила условие действие результат

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

1 пакет от адреса 127.2.4.5 пропустить (ACCEPT) переход к следующему правилу
2 пакет для адреса 234.2.*.5 пропустить (ACCEPT) переход к следующему правилу
3 пакет от адреса 192.168.* выбросить пакет (DROP) пакет выброшен

Как видно, пакет не удовлетворил первым двум условиям цепочки, зато удовлетворил третьему правилу, которое заставило брандмауэр выбросить этот пакет.

Цепочки собраны в три основные таблицы (при желании можно добавить свои):

filter - Таблица, используемая по-умолчанию,
nat - Эта таблица используется, когда встречается пакет, устанавливающий новое соединение.
mangle - Эта таблица используется для специальных изменений пакетов.

Основными цепочками являются следующие:

FORWARD. для проходящих (пересылаемых) пакетов
INPUT. для входящих/получаемых пакетов
OUTPUT. для исходящих/отправляемых пакетов

Действие может быть именем цепочки, определенной пользователем, или одной из специальных целей: ACCEPT, DROP, QUEUE, RETURN или MASQUERADE.

ACCEPT означает принять пакет. DROP означет проигнорировать (выбросить) пакет. MASQUERADE означает скрыть (маскировать) IP. (ниже будет рассмотрено подробно)

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

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

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

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

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

Для добавления правила в цепочку используется ключ -A

iptables -A INPUT правило

добавит правило в цепочку INPUT таблицы filter (по умолчанию). Для указания таблицы, в цепочку которой следует добавить правило, используйте ключ -t :

Iptables: сетевая безопасность и фильтрация пакетов

iptables: сетевая безопасность и фильтрация пакетов

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

В Linux файрвол является модулем ядра, называемым netfilter и представляет собой набор хуков (hooks) для работы с сетевым стеком. Интерфейсом для модификации правил, по которым файрвол обрабатывает пакеты, служит утилита iptables для IPv4 и утилита ip6tables для IPv6.

Всю работу по фильтрации трафика выполняет ядро системы. Iptables не является демоном и не создает новых процессов в системе. Включение или выключение iptables это всего лишь отправка сигнала в ядро. Большая скорость фильтрации достигается за счёт анализа только заголовков пакетов.

К основным возможностям iptables относиться:

  • фильтрация трафика на основе адресов отправителя и получателя пакетов, номеров портов;
  • перенаправление пакетов по определенным параметрам;
  • организация доступа в сеть (SNAT);
  • проброс портов из глобальной сети в локальную (DNAT);
  • ограничение числа подключений;
  • установление квот трафика;
  • выполнение правил по расписанию;

Процесс работы iptables

Рассмотрим основной процесс работы iptables (источник картинки rigacci.org ).

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

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

  1. mangle – используется для внесения изменений в заголовок пакета;
  2. nat – используется для трансляции сетевых адресов;
  3. filter – для фильтрации трафика;

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

  • установка бита Type Of Service;
  • установка поля Time To Live;
  • установка метки на пакет, которая может быть проверена в других правилах;

Цепочки в таблице mangle :

  • PREROUTING — используется для внесения изменений в пакеты на входе в iptables, перед принятием решения о маршрутизации;
  • POSTROUTING — используется для внесения изменений в пакеты на выходе из iptables, после принятия решения о маршрутизации;
  • INPUT — используется для внесения изменений в пакеты, перед тем как они будут переданы локальному приложению;
  • OUTPUT — используется для внесения изменений в пакеты, поступающие от приложения внутри iptables;
  • FORWARD — используется для внесения изменений в транзитные пакеты;

Таблица используется для преобразования сетевых адресов (Network Address Translation) и когда встречается пакет, устанавливающий новое соединение. В этой таблице могут производиться следующие действия:

  • DNAT (Destination Network Address Translation) – преобразование адреса назначения в заголовке пакета;
  • SNAT (Source Network Address Translation) – изменение исходного адреса пакета;
  • MASQUERADE – используется в тех же целях, что и SNAT. но позволяет работать с динамическими IP-адресами;

Цепочки в этой таблице:

  • PREROUTING – используется для внесения изменений в пакеты на входе в iptables;
  • OUTPUT – используется для преобразования адресов в пакетах, перед дальнейшей маршрутизацией;
  • POSTROUTING – используется для преобразования пакетов, перед отправкой их в сеть;

Таблица используется для фильтрации пакетов. В этой таблице есть три цепочки:

  1. INPUT – цепочка для входящих пакетов;
  2. FORWARD – цепочка для пересылаемых (транзитных) пакетов;
  3. OUTPUT – цепочка для исходящих пакетов;

Пакет, проходящий через эти цепочки, может подвергаться действиям: ACCEPT. DROP. REJECT. LOG .

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

Восстановление правил из файла

Каждое правило в iptables — это отдельная строка, сформированная по определенным правилам и содержащая критерии и действия. В общем виде правило имеет такой формат:

  • t table — задает имя таблицы, для которой будет создано правило;
  • command — команда, которая определяет действие iptables — добавить правило, удалить правило и т. д.;
  • match — задает критерии проверки, по которым определяется, попадает ли пакет под действие правила или нет;
  • target/jump — какое действие должно быть выполнено при выполнении критерия;
  • -A - добавление правила в цепочку, правило будет добавлено в конец цепочки;
  • -D - удаление правила из цепочки;
  • -R - заменить одно правило другим;
  • -I - вставить новое правило в цепочку;
  • -L - вывод списка правил в заданной цепочке;
  • -F - сброс всех правил в заданной цепочке;
  • -Z - обнуление всех счетчиков в заданной цепочке;
  • -N - создание новой цепочки с заданным именем;
  • -X - удаление цепочки;
  • -P - задает политику по умолчанию для цепочки;
  • -E - переименование пользовательской цепочки;

Примеры команд iptables

Пакеты можно фильтровать по таким параметрам:

Для фильтрации по источнику используется опция -s. Например запретим все входящие пакеты с узла 192.168.1.95:

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

Также можно указать целую под сеть:

Также вы можете использовать отрицание (знак !). Например, все пакеты с хостов отличных от 192.168.1.96 будут уничтожаться:

Разрешаем хождение трафика по localhost:

Логируем попытки спуфинга с префиксом "IP_SPOOF A: " и дропаем соединение

Для этого нужно использовать опцию -d. Например запретим все исходящие пакеты на хост 192.168.1.95:

Запретить доступ к ресурсу

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

Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола (из /etc/protocols ).

Разрешаем входящие эхо-запросы

Разрешаем все исходящие пакеты с порта 80:

Заблокировать все входящие запросы порта 80:

Для указания порта необходимо указать протокол (tcp или udp). Можно использовать отрицание.

Открыть диапазон портов

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

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

Разрешаем получать данные от DHCP-сервера

Разрешаем rsync с определенной сети

Разрешаем IMAP/IMAP2 трафик

Разрешить исходящие HTTP, FTP, DNS, SSH, SMTP

Разрешаем mysql для локальных пользователей

Разрешить CUPS (сервер печати, порт 631) для пользователей внутри локальной сети

Разрешить синхронизацию времени NTP для пользователей внутри локальной сети

Разрешить исходящий Google Talk

Для примера направим трафик с порта 442 на 22, это значит что входящие ssh-соединения могут быть принятыми с порта 422 и 22.

Также надо разрешить входящие соединения с порта 422

Как и в случае с портом источника нужно указать протокол. Можно использовать отрицание.

Действия над пакетами

Для указания действия (цели) с пакетом служит опция -j. Основные действия:

  • ACCEPT - разрешить пакет;
  • DROP - уничтожить пакет;
  • REJECT - будет отправлено ICMP сообщение, что порт недоступен;
  • LOG - информация об этом пакете будет добавлена в системный журнал. Не прерывает цепочку.
  • RETURN - возвращает пакет в ту цепочку, из которой он прибыл;
  • SNAT - применить source NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы NAT ;
  • DNAT - применить destination NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочке POSTROUTING таблицы NAT*.
  • MASQUERADE - может применяться только в цепочке POSTROUTING таблицы NAT. Используется при наличии соединения с динамическим IP. Похож на SNAT. однако имеет свойство забывать про все активные соединения при потере интерфейса. Это полезно при наличии соединения, на котором время от времени меняется IP-адрес, но при наличии постоянного IP это только доставит неудобства. В том числе поэтому рекомендуется для статических IP использовать SNAT .

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

REJECT – сбрасывает соединение и отправляет в ответ сообщение, указанное в опции –reject-with. По умолчанию отправляется host is unreachable. Зато при сканировании (если установлено –reject-with icmp-port-unreachable) порт светится не будет.

И так, что же всё-таки использовать? На мой взгляд, лучше DROP, так как при больших атаках, вы просто перекроете себе кислород, отвечая всем «host is unreachable«. Этот ответ будет потреблять больше ресурсов, нежели мёртвое соединение (при желаении время таймаута можно сократить).

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

Пример базового набора правил

В большинстве случаев конечному пользователю (рабочая станция) достаточно выполнить такую последовательность команд:

В iptables есть возможность подключать модули, для этого используется опция -m .

Модуль limit предназначен для ограничения нагрузки, например:

Разрешаем поддерживать открытыми уже установленные соединения

Список текущих правил

  • L - показать список правил;
  • v - отображать дополнительную информацию; * n - отображать ip адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение);
  • -line-numbers - вывод номеров строк;

Очистка всех правил

Очистка правил в цепочке

Удаления пятого правила в цепочке INPUT:

Удалить правило, в котором адрес источника (192.168.1.15)

Защита от DDoS с помощью iptables

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

  • Удаленная эксплуатация ошибок в ПО с целью привести его в нерабочее состояние;
  • Flood - посылка на адрес жертвы огромного количества бессмысленных пакетов. Целью флуда может быть канал связи или ресурсы машины. В первом случае поток пакетов занимает весь пропускной канал и не дает атакуемой машине возможность обрабатывать легальные запросы. Во втором - ресурсы машины захватываются с помощью многократного и очень частого обращения к какому-либо сервису, выполняющему сложную, ресурсоемкую операцию. Это может быть, например, длительное обращение к одному из активных компонентов (скрипту) web-сервера. Сервер тратит все ресурсы машины на обработку запросов атакующего, а пользователям приходится ждать. Флуд бывает разным: ICMP-флуд, SYN-флуд, UDP-флуд и HTTP-флуд

Сбор информации о сетевых соединениях

Просмотр открытых соединений

Количество подключений к 80 порту

TCP-дамп подключений (на какой домен чаще всего идут запросы)

SYN-флуд можно проверить через подсчет числа полуоткрытых TCP-соединений

Защита от разных видов флуда.

ICMP-флуд. Очень примитивный метод забивания полосы пропускания и создания нагрузок на сетевой стек через монотонную посылку запросов ICMP ECHO (пинг). Легко обнаруживается с помощью анализа потока трафика в обе стороны: во время атаки типа ICMP-флуд они практически идентичны. Почти безболезненный способ абсолютной защиты основан на отключении ответов на запросы ICMP ECHO:

Или с помощью iptabels :

SYN-флуд. Один из распространенных способов не только забить канал связи, но и ввести сетевой стек операционной системы в такое состояние, когда он уже не сможет принимать новые запросы на подключение. Основан на попытке инициализации большого числа одновременных TCP-соединений через посылку SYN-пакета с несуществующим обратным адресом. После нескольких попыток отослать ответный ACK-пакет на недоступный адрес большинство ОС ставят неустановленное соединение в очередь. И только после n-ой попытки закрывают соединение. Так как поток ACK-пакетов очень велик, вскоре очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение. Наиболее умные DoS-боты еще и анализируют систему перед началом атаки, чтобы слать запросы только на открытые жизненно важные порты. Идентифицировать такую атаку просто: достаточно попробовать подключиться к одному из сервисов.

Оборонительные мероприятия обычно включают в себя:

Увеличение очереди "полуоткрытых" TCP-соединений:

Уменьшение времени удержания "полуоткрытых" соединений:

Включение механизма TCP syncookies:

Ограничение максимального числа "полуоткрытых" соединений с одного IP к конкретному порту:

UDP-флуд. Типичный метод захламления полосы пропускания. Основан на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установки лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза:

HTTP-флуд. Один из самых распространенных на сегодняшний день способов флуда. Основан на бесконечной посылке HTTP-сообщений GET на 80-ый порт с целью загрузить web-сервер настолько, чтобы он оказался не в состоянии обрабатывать все остальные запросы. Часто целью флуда становится не корень web-сервера, а один из скриптов, выполняющих ресурсоемкие задачи или работающий с базой данных. В любом случае, индикатором начавшейся атаки будет служить аномально быстрый рост логов web-сервера.

Определившись с IP виновника начинаем дропать по IP-адресам

Или сразу по подсетям:

Для ограничения количества одновременных подключений к серверу для клиента по IP используется модуль connlimit. Ограничим количество параллельных подключений по SSH до трех, для одного клиента

Ограничим количество параллельных подключений по HTTP до трех, для одного клиента

  • --connlimit-above 10 - условие для проверки одновременных подключенийне более 10;
  • --connlimit-mask 24 - группировка хостов по длине префикса (для IPv4 это число должно быть 0 и 32;

Также ограничить количество подключений в единицу времени можно с помощью модуля limit .

  • -m limit - подключаем модуль limit ;
  • –limit 25/minute - порог в 25 подключений в минуту;
  • –limit-burst 100 - условие включения порога: после достижения 100 подключений;

Добавь в /etc/sysctl.conf следующие строки:

Балансировка нагрузки с помощью iptables

Надстройки, GUI к iptables

Проверить настройки iptables можно с помощью nmap .