LINUX.ORG.RU

Избранные сообщения i2life

Запрет FIN, X, N -сканирования для проброшенного порта

Форум — General

Возможно ли отбросить и залогировать данные типы сканирования, для проброшенных портов? Для входящего (INPUT) это все реализовано (лог пишется), и работает. А вот FORWARD никакого лога... Либо я неправильно тестирую проброшенный порт ?...

nmap -vvv -sT x.x.x.x -p 10000

Вот часть того, что сделано

...

# Запрет FIN-сканирования
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,ACK FIN -j LOG --log-prefix "FIN-scan: "
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
# Запрет X-сканирования
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j LOG --log-prefix "X-scan: "
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
# Запрет N-сканирования
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOG --log-prefix "N-scan: "
iptables -A scanners -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
# Защита от SYN/ACK-сканирования
iptables -A osf_scanners -p tcp -m osf --genre NMAP -j LOG --log-prefix "SYN-ACK-scan:"
iptables -A osf_scanners -p tcp -m osf --genre NMAP -j DROP

...

iptables -A INPUT -p tcp -j scanners
iptables -A INPUT -p tcp -j osf_scanners

...

iptables -A FORWARD -p tcp -j scanners
iptables -A FORWARD -p tcp -j osf_scanners



 , , ,

i2life
()

Защита от DDoS и флуда (iptables)

Форум — Security

Поделюсь своим опытом борьбы с DDoS флудом. Защищать будем операционную систему openSUSE Linux с помощью правил iptables.

Для защиты настроим систему и создадим скрипт, который будет отслеживать флуд соединениями на открытые порты.

Сначала о настройке системы. Моё содержимое файла /etc/sysctl.conf:

( читать дальше... )

Теперь о правилах iptables.

Создайте файл /etc/init.d/iptables_myrules и сделайте его исполняемым: chmod +x /etc/init.d/iptables_myrules. Его содержимое:

( Содержимое файла iptables_myrules )

Здесь заданы непосредственно правила iptables.

Рассмотрим настройки:

PROTECTZONE - в этой константе перечисляются через пробел интерфейсы, которые будут защищаться правилами (внешняя зона). Обычно это один интерфейс, через который осуществляется выход в интернет. В данном примере это интерфейс dsl0. Вы должны задать свой интерфейс.
FREEZONE - здесь перечисляются через пробел интерфейсы внутренней зоны, на которой разрешена любая активность (локальные интерфейсы). Интерфейс lo должен обязательно быть здесь. Если у Вас лишь один cетевой интерфейс (например, eth0), через который осуществляется выход в интернет, то он должен быть указан во внешней зоне, а интефейс lo во внутренней.
TCP_PORTS - перечень TCP портов через запятую без пробелов, которые нужно открыть (на которых у нас работают те или иные сервисы, принимающие входящие соединения из внешней зоны).
UDP_PORTS - перечень UDP портов через запятую без пробелов, которые нужно открыть.
TCP_PORTS_PRIV и UDP_PORTS_PRIV - аналогичны константам TCP_PORTS и UDP_PORTS соответственно, только к перечисленным здесь портам будут разрешены подключения лишь с определённых диапазонов IP-адресов, перечисленных в константе PRIV_RANGES (приватные диапазоны).
PRIV_RANGES - перечень приватных диапазонов IP-адресов (начальный-конечный, без пробелов через дефиз), по одному диапазону на каждой строчке. Перечисленные здесь адреса допускаются для соединения с портами, перечисленными в константах TCP_PORTS_PRIV и UDP_PORTS_PRIV. Чтобы задать лишь один IP-адрес, просто укажите одинковые начальный и конечный адреса диапазона.
IS_CONNLIMIT - задаётся разрешённое число оновременных соединений с одного IP-адреса (модуль connlimit). Если задать значение '0', то правило будет отключено.
CONNLIMIT_MASK - маска для проверки одновременных соединений модуля connlimit.
IS_RECENT - активация модуля recent, который ограничивает число соединений с одного адреса за определённый период времени. 1 - включено, 0 - выключено.
RECENT_SECONDS - период в секундах, за который не должно быть превышения лимита количества соединений за заданный интервал времени с одного IP-адреса.
RECENT_HITCOUNT - количество соединений за заданный период времени для модуля recent.
HASHLIMIT_UPTO - количество соединений в единицу времени для модуля hashlimit. Временной интервал может быть: /sec, /min, /hour, /day. При превышении данного лимита пакет будет заблокирован.
HASHLIMIT_BURST - пик количества разовой доставки соединений для модуля hashlimit.
HASHLIMIT_MODE - режим хеширования для модуля hashlimit. Варианты могут быть: dstip, srcip, dstport, srcport (несколько разделяютя запятыми без пробелов).
HASHLIMIT_EXPIRE - время жизни записи в хэш-таблице для модуля hashlimit.
IS_GRE - разрешение протокола GRE (1 - включено, 0 - выключено).
IS_BROADCAST - разрешение broadcast трафика (1 - включено, 0 - выключено).
IS_ICMP_ECHO - icmp echo пакеты (1 - включено, 0 - выключено).
BLACKLIST_IP - здесь можно указать перечень IP-адресов, которые будут блокироваться (по одному на каждой строчке).
BLACKLIST_RANGES - здесь можно указать перечень диапазонов IP-адресов, которые будут блокироваться (по одному на каждой строчке, через дефиз без пробелов).
BLACKLIST_COUNTRIES - перечень кодов стран, которые будут блокироваться, через запятую без пробелов (модуль geoip).

Если система используется как шлюз или маршрутизатор, то нужно разрешить ip_forward и send_redirects.

При запуске скрипта без параметров все правила перезадаются. При запуске с параметром clean правила обнуляются. Параметр list выводит текущий список правил и статистику срабатываний.

Для добавления скрипта в автозапуск, выполните команду: chkconfig -a iptables_myrules. Для удаления скрипта из автозапуска выполните команду: chkconfig iptables_myrules off.

Теперь опишу дополнительный скрипт ddos_block.lua, который следит за входящими соединениями на заданные порты (или группы портов) и блокирует IP-адреса, с которых превышен лимит одновременного числа установленных соединений. Этот лимит задаётся отдельно для каждого порта или группы портов. Вот код скрипта:

( Содержимое файла ddos_block.lua )

Для удобства запуска сделайте его исполняемым. Скрипт написан на языке LUA. Рассмотрим настройки:

ports_protect - перечень защищаемых портов и разрешённое количество соединений с одного IP для каждого из них (или их группы). Количество соединений к группе портов отслеживается в совокупности, как к одному. Формат таблицы таков, что на каждой строке должна быть запись вида:
[{P1,P2,...,Pn}]=N,
где P1,P2,...,Pn - перечень группы портов через запятую, соединения к которым отслеживаются в совокупности. Здесь может быть просто один порт. N - количество разрешённых одновременно установленных соединений к данному порту или группе.
ranges_allow - перечень диапазонов IP-адресов и соответствующий им список портов. Перечисленные здесь адреса не будут ограничены по количеству соединений на указанные порты. Формат таблицы таков, что на каждой строке должна быть запись вида:
[{'IPstart','IPend'}]='P1,P2,...,Pn',
где IPstart - начальный адрес диапазона, IPend - конечный адрес диапазона, P1,P2,...,Pn - перечень разрешённых для данного диапазона портов, соединения к которым не будет ограничиватья. Если в качестве переченя портов указано 'all', то будут разрешены все порты. Чтобы задать только один IP-адрес, просто укажите его как начальный и конечный адрес диапазона.
time_ban - время блокировки IP-адреса, который превысил разрешённый лимит соединений (в секундах).
drop_allow - разрешённое количество попыток соединения во время блокировки. Если после истечения времени блокировки количество попыток соединения не будет превышать разрешённое число, IP-адрес будет разблокирован. В противном случае, блокировка будет продлена ещё на один срок.
scan_period - период между сканированиями в секундах.
log_folder - полный путь к папке для записи логов блокировок и разблокировок (должен оканчиваться слэшем). Если путь не задан (пустая строка), то ведение логов будет отключено.

Константы ниже менять не рекомендуется.
filter_command - шаблон команды для получения списка текущих соединений с защищаемыми портами (шаблон %PORTS заменится на защищаемые порты).
ban_command - шаблон команды блокировки IP-адреса.
unban_command - шаблон команды удаления блокировки IP-адреса.
stat_command - команда для получения статистики о заблокированных IP-адресах.

Данный скрипт должен быть постоянно запущен в терминале.

Вышеописанные методы отлично помогали против DDoS-атак даже на слабом ADSL-соединении, линк не терялся, серверы продолжали работу. Количество ботов было порядка 2000. У себя на ресурсах я использую свою же сборку SteelLinux на базе openSUSE. Во всяком случае, описанные ниже методы работоспособны на этой системе (на Ubuntu, например, это уже не помогало и сервер на её базе падал в оффлайн).

Скачать скрипты можно тут:
iptables_myrules
ddos_block.lua

 , , , ,

SteelLinux
()

Всё ли правильно в настройках iptables?

Форум — General

Здравствуйте, господа. Имеются некоторые сомнения в правильности (правильной последовательности) в написании своего свода правил iptables для домашнего роутера. В связи с этим, хотелось бы Вас попросить указать мне, в чём именно я неправ. Домашний роутер представляет собой обычный системник на основе Intel Atom N2800 со встроенной сетевушкой (eth0, смотрящей в локальную сеть), USB-сетевушкой (eth1, смотрящей в Интернет) и WiFi-адаптер (wlan0, работающий в режиме точки доступа и имеющий доступ как в локальную сеть, так и в Интернет, благодаря мосту). На роутере используется proftpd, transmission-daemon, nginx, mysql, php-fpm и т.д.

#!/bin/sh

##################################################
#      Задаём часто используемые переменные      #
##################################################

export WAN=eth1
export LAN=eth0

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

echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

##################################################
#       Блокировка всего сетевого трафика        #
##################################################

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

##################################################
#          Очищаем все сетевые правила           #
##################################################

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -t filter -X

##################################################
#    Задаём сетевые правила для цепочки INPUT    #
##################################################

# Настраиваем правила маршрутизации
iptables -A INPUT ! -i lo -d 127.0.0.0/24 -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ${WAN} --match state --state ESTABLISHED,RELATED -j ACCEPT

# Отбрасываем ошибочные пакеты
iptables -A INPUT -m state --state INVALID -j DROP
iptables -I INPUT -m conntrack --ctstate INVALID -j DROP

# Отбрасываем фрагментированные пакеты
iptables -A INPUT -f -j DROP

# Защита от попытки открыть входящее соединение TCP не через SYN
iptables -I INPUT -m conntrack --ctstate NEW -p tcp ! --syn -j DROP

# Защита от SYN-флуда
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p udp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -j DROP

# Защита от сканеров портов
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

# Защита от Ping of death
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# Защита от спуфинга
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

# Защита от некорректных ICMP
iptables -I INPUT -p icmp -f -j DROP

# Разрешаем главные типы протокола ICMP
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT

# Чёрный список IP-адресов и их портов
iptables -A INPUT -s 5.45.75.10 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 174.143.173.119 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 61.231.91.253 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 94.102.51.155 -p tcp --dport 80 -j DROP

# Настройка моста
iptables -A INPUT -i br0 -s 192.168.0.0/24 -m state --state NEW -j ACCEPT

# Настраиваем доступ к определённым портам
iptables -A INPUT -i ${WAN} -p tcp -m multiport --ports 21,22,80,443,16843 -m state --state NEW -j ACCEPT
iptables -A INPUT -i ${WAN} -p udp -m multiport --ports 22,80,123,16843 -m state --state NEW -j ACCEPT
iptables -A INPUT -p TCP -i ${WAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP -i ${WAN} -d 0/0 --dport 0:1023 -j DROP

##################################################
#   Задаём сетевые правила для цепочки FORWARD   #
##################################################

# Настраиваем правила маршрутизации
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i br0 -o ${WAN} -j ACCEPT
iptables -A FORWARD -i ${WAN} -o br0 -j REJECT

# Отбрасываем ошибочные пакеты
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -I FORWARD -m conntrack --ctstate INVALID -j DROP

# Отбрасываем фрагментированные пакеты
iptables -A FORWARD -f -j DROP

# Выравниваем значение MTU во избежание глюков с сайтами
iptables -A FORWARD -t mangle -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Защита от SYN-флуда
iptables -A FORWARD -p tcp --syn -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p icmp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -j DROP

# Защита от сканеров портов
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

# Защита от Ping of death
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP

##################################################
#   Задаём сетевые правила для цепочки OUTPUT    #
##################################################

# Настраиваем правила маршрутизации
iptables -A OUTPUT ! -o lo -d 127.0.0.0/8 -j DROP
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ${WAN} --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Сбрасываем ошибочные пакеты
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -I OUTPUT -m conntrack --ctstate INVALID -j DROP

# Сбрасываем фрагментированные пакеты
iptables -A OUTPUT -f -j DROP

# Разрешаем главные типы протокола ICMP
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT

# Настраиваем доступ к определённым портам
iptables -A OUTPUT -o ${WAN} -p tcp -m multiport --ports 21,80,443 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o ${WAN} -p udp -m multiport --ports 22,80,123 -m state --state NEW -j ACCEPT

##################################################
# Задаём сетевые правила для цепочки POSTROUTING #
##################################################

# Маскируем внутренние IP под внешний для Интернета
iptables -A POSTROUTING -t nat -o ${WAN} -j MASQUERADE

Всё ли верно?

P.S. Да, и ещё вопрос вдогонку: на ПК, подключённому к роутеру по WiFi, установлен TightVNC Server для удалённого доступа к этому ПК извне. Но почему-то доступа нет - есть доступ к TightVNC Server только из локальной сети. Что следует убрать\добавить в iptables чтобы исправить ситуацию?

С уважением.

Sferg
()