Использование белого и черного списков с iptables
#!/bin/bash
WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt
#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F
#
## Whitelist
#
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Permitting $x..."
$IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done
#
## Blacklist
#
for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
echo "Denying $x..."
$IPTABLES -A INPUT -t filter -s $x -j DROP
done
Скрипт для открытия портов
#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"
#
## Permitted Ports
#
for port in $ALLOWEDTCP; do
echo "Accepting port TCP $port..."
$IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
for port in $ALLOWEDUDP; do
echo "Accepting port UDP $port..."
$IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done
Блокировка портов
# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
# Once the day has passed, remove them from the portscan list
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove
# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
Поддельные / недействительные пакеты
# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP
#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP
# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
Блокировать атаки Smurf
# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP
# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
Блок ICMP (он же пинг)
# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
iptables
на строке 8, а затем$IPTABLES
позже. Достаточно ли просто использоватьiptables
везде? В противном случае я полагаю, вам нужно назначить что-то вродеIPTABLES=/sbin/iptables
правильно?Оптимизация производительности netfilter с помощью
ipset
Если вы пишете много похожих правил, основанных только на IP, порте или обоих, подумайте об использовании
ipset
для оптимизации производительности netfilter.Например:
Это означает, что пакет с адресом источника 192.168.251.177 должен сначала пройти сотни правил, прежде чем он сможет получить свой вердикт ACCEPT.
Конечно, опытные системные администраторы разделят правила по подсетям. Но это все еще означает сотни правил.
ipset
в помощь!Сначала определите набор IP
ipmap
типа:Затем заполните его адресами:
Наконец, замените сотни правил iptables выше одним правилом:
Когда пакет прибывает, netfilter выполнит очень быстрый битовый поиск IP-адреса источника (src) пакета по
Allowed_Hosts
IP-набору. Все пакеты, поступающие с 192.168.0.0/16, будут испытывать одно правило. И поверьте мне, что поиск растрового изображения по крайней мере на два порядка быстрее, чем выполнение сотен проверок правил iptables.ipset
не ограничивается IP-адресами. Он также может совпадать в зависимости от портов, кортежа IP-порта, адресов сети / подсети, кортежа IP-MAC и т. Д. И т. Д. И он может соответствовать этим критериям в качестве источника или места назначения или сочетания обоих (в случае кортежей).И, наконец,
ipset
вы можете автоматически добавлять IP-адреса в черные / белые списки. Эти черные и белые списки могут также «устаревать», таким образом автоматически удаляя IP-адрес по истечении настраиваемого промежутка времени.Пожалуйста, обратитесь к
ipset
справочной странице для более подробной информации.ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ:
Некоторые дистрибутивы Linux могут не иметь встроенной поддержки
ipset
(например, в Ubuntu 10.04 была эта проблема). На этих системах один из способов заключается в установкеipset
из исходного кода.Вместо этого загрузите
ipset
исходный код с его веб-сайта: http://ipset.netfilter.org/install.html.С другой стороны , если вы используете
xtables-addons
, ipset будет включен в его источник: http://xtables-addons.sourceforge.net/источник
Добавьте комментарии к своим правилам:
источник
Блокировать общеизвестные TCP-атаки
Добавьте следующие правила, желательно в
-t raw -A PREROUTING
Блокируемые атаки, соответственно:
(не стесняйтесь редактировать названия атак выше)
источник
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
Может быть удален, как-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
будет ловить каждый пакет он может блокировать.Включение NAT
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Шаг 1 устанавливает параметр ядра, чтобы разрешить пересылку ip, шаг 2 устанавливает правило iptables, которое включает NAT на интерфейсе eth0.
источник
/etc/sysctl.conf
net.ipv4.ip_forward = 1
. (Предполагается, что Red Hat или производная.)Блокировать атаки ICMP
Добавьте следующие правила, желательно в
-t raw -A PREROUTING
Первое правило блокирует все пакеты ICMP, чей «флаг фрагментации» не равен 0. (ICMP никогда не должен фрагментироваться; они должны нести небольшие полезные нагрузки)
Второе правило блокирует нерасфрагментированные ICMP-пакеты большого размера.
источник
использование FireHOL - удобная оболочка iptables
Я нашел это намного более интуитивным, чем прямые команды iptables. Специально для людей с опытом работы с другими брандмауэрами:
источник
(из моего файла iptables_tricks.txt, перекомпилированного из многих мест: P)
Заставляет iptables ждать 15 секунд между новыми подключениями с того же IP на порту 22 (SSH):
источник
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
IPTABLES видео уроки
Эпизод 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded
Эпизод 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related
Финальный эпизод
http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded
Будет хорошим началом для любого новичка.
источник
IP-наборы пересмотрены
Уже есть ответ, упоминающий наборы IP. Тем не менее, он является скорее одномерным, поскольку в нем основное внимание уделяется повышению производительности по сравнению с классическими правилами, а также тому факту, что наборы IP-адресов смягчают проблему, возникающую при использовании большого количества отдельных IP-адресов, которые нельзя легко выразить как подсеть в нотации CIDR.
Обозначения, используемые ниже
Ибо
ipset
я буду использовать обозначения, прочитанныеipset restore
и написанныеipset save
.Соответственно для
iptables
(иip6tables
) правил я буду использовать обозначения, которые прочитаныiptables-restore
и написаныiptables-save
. Это сокращает нотацию и позволяет выделить потенциальные правила-4
только для IPv4 (с префиксом ) или только для IPv6 (с префиксом-6
).В некоторых примерах мы перенаправим поток пакетов в другую цепочку. Предполагается, что цепочка существует в этой точке, поэтому строки для создания цепочек не создаются (не упоминается ни имя таблицы, ни команды
COMMIT
в конце).Расширенные наборы IP
Наборы IP могут сделать намного больше, чем было упомянуто в другом ответе, и вы обязательно должны прочитать документацию
ipset(8)
по IP-наборам ( ) вместе сiptables-extensions(8)
этой краткой записью здесь.Например , я буду в основном сосредоточены на три типа набора:
hash:ip
,hash:net
иlist:set
, но есть больше , чем те , и все они имеют действительные случаи использования.Например, вы можете также сопоставлять номера портов, а не только IP-адреса .
Сохранение и восстановление наборов IP , как с
iptables-save
иiptables-restore
Вы можете создавать декларации IP-наборов и импортировать их по трубопроводу
ipset restore
. Если вы хотите сделать вашу команду более устойчивой к уже существующим записям, используйтеipset -exist restore
.Если ваши правила находятся в файле, который
default.set
вы будете использовать:Подобный файл может содержать записи в
create
наборы иadd
записи в них. Но, как правило, большинство команд из командной строки имеют соответствующую версию в файлах. Пример (создание набора DNS-серверов):Здесь один набор создан для IPv4 (
dns4
) и один для IPv6 (dns6
).Тайм-ауты на наборах IP
Таймауты в наборах IP могут быть установлены по умолчанию для каждого набора, а также для каждой записи. Это очень полезно для сценариев, в которых вы хотите временно заблокировать кого-либо (например, для сканирования портов или попытки перебора вашего SSH-сервера).
Это работает следующим образом (по умолчанию при создании наборов IP):
Мы вернемся к этим конкретным наборам ниже и обоснованию того, почему они установлены так, как они есть.
Если вы хотите установить тайм-аут для определенного IP-адреса, вы можете просто сказать:
Блокировать IP 1.2.3.4 на два часа вместо (установить) полчаса по умолчанию.
Если вы посмотрите на это
ipset save ssh_dynblock4
через некоторое время, вы увидите что-то вроде:Тайм-аут предостережения
Kernel error received: Unknown error -1
).sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))
Проверка, существует ли запись в данном наборе IP
Внутри ваших скриптов может быть полезно посмотреть, существует ли уже запись. Это может быть достигнуто с помощью
ipset test
которого возвращает ноль, если запись существует, и ненулевое в противном случае. Таким образом, обычные проверки могут быть применены в сценарии:Тем не менее, во многих случаях вы предпочитаете использовать
-exist
переключательipset
, чтобы он не жаловался на существующие записи.Заполнение наборов IP из
iptables
правилЭто, на мой взгляд, одна из самых страшных особенностей IP-комплектов. Вы можете не только сопоставлять записи набора IP, но также добавлять новые записи в существующий набор IP.
Например, в этом ответе на этот вопрос у вас есть:
... с целью ограничения скорости попыток подключения к SSH (TCP-порт 22). Используемый модуль
recent
отслеживает последние попытки подключения. Однако вместоstate
модуля я предпочитаюconntrack
модуль.В этом случае я перенаправляю поток в
SSH
цепочку так, что мне не нужно повторяться-p tcp --dport ssh
для каждого отдельного правила.Чтобы повторить:
-m set
делает вiptables
курсе , что мы используем переключатели изset
модуля (который обрабатывает IP - наборы)--match-set ssh_dynblock4 src
говорит,iptables
чтобы сопоставить адрес источника (src
) с именованным набором (ssh_dynblock4
)sudo ipset test ssh_dynblock4 $IP
(где$IP
содержит IP-адрес источника для пакета)-j SET --add-set ssh_dynblock4 src --exist
добавляет или обновляет адрес источника (src
) из пакета в набор IPssh_dynblock4
. Если запись существует (--exist
), она будет просто обновлена.sudo ipset -exist add ssh_dynblock4 $IP
(где$IP
содержит IP-адрес источника для пакета)Если вы хотите сопоставить адрес назначения / цели вместо этого, вы бы использовали
dst
вместоsrc
. Консультируйтесь с руководством для большего количества вариантов.Наборы наборов
Наборы IP могут содержать другие наборы. Теперь, если вы проследовали до этой статьи, вы бы удивились, можно ли комбинировать наборы. И конечно это так. Для наборов IP сверху мы можем создать два совместных набора
ssh_dynblock
иssh_loggedon
соответственно содержать наборы только для IPv4 и IPv6:И следующий вопрос, который должен всплыть у вас в голове, заключается в том, позволяет ли это сопоставлять наборы IP и манипулировать ими в зависимости от версии IP.
И ответ на это звучит громко: ДА! (увы, это не было задокументировано явно в прошлый раз, когда я проверял)
Следовательно, правила из предыдущего раздела можно переписать так:
что намного лаконичнее. И да, это проверено и работает, как шарм.
Собираем все вместе: SSH перебор
На моих серверах у меня есть сценарий, выполняемый как
cron
задание, которое принимает несколько имен хостов и разрешает их в IP-адреса, а затем передает их в набор IP для «доверенных хостов». Идея состоит в том, что доверенные хосты получают больше попыток войти на сервер и не обязательно блокируются так долго, как кто-либо еще.Наоборот, у меня есть целые страны, заблокированные от подключения к моему SSH-серверу, с (потенциальным) исключением доверенных хостов (т. Е. Порядок правил имеет значение).
Тем не менее, это оставлено в качестве упражнения для читателя. Здесь я хотел бы добавить изящное решение, которое будет использовать наборы, содержащиеся в
ssh_loggedon
наборе, чтобы позволить последующим попыткам соединения проходить и не подвергаться такой же проверке, как другие пакеты.Важно помнить время ожидания по умолчанию: 90 минут
ssh_loggedon
и 30 минут дляssh_dynblock
следующихiptables
правил:Теперь вы должны спросить себя, как подключающийся IP-адрес попадает в
ssh_loggedon
подмножества. Так что читайте дальше ...Бонус: добавление IP-адреса, с которым вы входите при входе по SSH
Если вы экспериментировали с
sshrc
друзьями и знакомыми, вы узнали о его недостатках. Но PAM приходит на помощь. Модуль с именемpam_exec.so
позволяет нам вызывать скрипт во время входа в SSH в точке, где мы знаем, что пользователь допущен в.В
/etc/pam.d/sshd
нижеpam_env
иpam_selinux
записи добавьте следующую строку:и убедитесь, что ваша версия скрипта (
/path/to/your/script
выше) существует и является исполняемой.PAM использует переменные среды для передачи информации о происходящем, поэтому вы можете использовать простой скрипт, подобный следующему:
К сожалению,
ipset
утилита, похоже, не имеет встроенных умений netfilter. Таким образом, мы должны различать IPv4 и IPv6, установленные при добавлении нашей записи. В противном случаеipset
предположим, что мы хотим добавить другой набор к набору наборов вместо IP. И, конечно, вряд ли найдется набор, названный в честь IP :)Поэтому мы проверяем
:
IP-адрес и добавляем6
имя набора в таком случае и в4
противном случае.Конец.
источник
Другим графическим интерфейсом, который можно использовать для настройки iptables, является Firewall Builder . Это позволяет пользователям создавать элементы правил как объекты в базе данных, а затем перетаскивать эти объекты в редактор правил для создания требуемой политики брандмауэра. Затем приложение генерирует файл сценария со всеми командами iptables, необходимыми для реализации правил.
В отличие от некоторых других решений с графическим интерфейсом iptables, где вы можете одновременно управлять только одной конфигурацией iptables, с помощью Firewall Builder вы можете управлять большим количеством конфигураций iptables из одного приложения. Firewall Builder работает на Linux, Windows и Mac OS X, существует уже более 10 лет и имеет тысячи активных пользователей по всему миру.
Полное раскрытие информации. Я являюсь соучредителем NetCitadel, которая разрабатывает Firewall Builder.
источник
войти в исходящее соединение с UID
переадресация портов / соединений:
источник
NFLOG
цель. Это позволяет использовать более длинный префикс строки, и демон пользовательского режима также может регистрироваться в базах данных.Сопоставить несколько имен интерфейсов с подстановочным знаком
Пример: у вас есть
eth0
иeth1
и хотели бы, чтобы трафик между ними?Я использовал это в прошлом, чтобы соответствовать
veth<something>
интерфейсам, динамически созданным и названным LXC. Таким образом, я могу сопоставить все сразу сveth+
.Я также намеренно назвал некоторые интерфейсы
_<something>
для сравнения_+
.источник
Блокировать необычные значения MSS
Цель SYNPROXY для защиты от DDos
Установить синхронизирующие пакеты для таблицы отслеживания соединений в необработанной таблице
Включить synproxy для http-сервера:
Ресурс: SYNPROXY target из блога RHEL
источник
Ограничение всех отдельных IP-адресов квотой исходящей полосы пропускания с помощью наборов IP-адресов.
Вы можете настроить свой сервер таким образом, чтобы разрешать каждому отдельному IP-адресу 15 ГБ использования полосы пропускания в месяц в надежде отразить или избежать атаки на использование полосы пропускания, возможно, для вашей квоты измеренной полосы пропускания у вашего интернет-провайдера. Это может быть достигнуто следующим образом:
Сначала создайте наборы IP для IPv4 и IPv6:
Теперь добавьте свои правила iptables. Первая строка добавит IP к набору, если его там еще нет. Вторая строка не будет совпадать, если количество байтов, переданных для IP в наборе, больше указанного количества. Затем то же самое делается для IPv6.
Это предотвратит такие атаки, как пользователь, запрашивающий большой файл у вашего веб-сервера в течение длительного периода времени или у какой-либо службы в этом отношении. То же самое можно сделать для цепочки INPUT.
источник
Что-то, что я делаю, в основном из-за того, что я не знаю более элегантного решения, - это вручную проверять мои журналы Nginx каждые 4 часа, а почтовый сервер - каждые 2 минуты для чрезмерного доступа по отдельным IP-адресам. Я запускаю несколько сценариев вместе, которые:
access.log
и перечислите 10 лучших IP-адресов, упорядоченных по количеству обращений к серверу.iptables.save
Вот как это выглядит:
autoBanIPs_mail.sh checkBadIPs_mail.shОдна вещь, которую ОЧЕНЬ важно отметить здесь, это то, что вам НУЖНО настроить белый список, или вы собираетесь начать блокировку большого количества аутентичных IP-адресов с серверов, с которых вы просто получаете много писем, или, в случае других журналов, IP-адреса, которые просто поразите ваш сервер по законным причинам. Мой белый список только что встроен в этот скрипт путем добавления grep pipe сразу после | grep ']' | что-то вроде этого "grep -v 127.0 |" ,
BlockipВам нужно время, чтобы научить свой сервер, какие IP-адреса с высоким трафиком являются законными, а какие нет. Для меня это означало, что мне приходилось тратить первую неделю или около того, проверяя свои логи вручную каждые несколько часов, просматривая ip-ы с высоким трафиком на iplocation.net, а затем добавляя легальные, такие как amazon, box.com или даже мой дом / офис IP относится к этому белому списку. Если вы этого не сделаете, вы, вероятно, будете заблокированы с вашего собственного сервера, или вы собираетесь начать блокировать законные почтовые / веб-серверы и вызвать перебои в работе электронной почты или трафика.
Опять же, я знаю, что это чертовски грубо, и, вероятно, есть хороший чистый эффективный протокол, который делает все это, но я не знал об этом, и эта штука идет уже год или два и удерживает плохих парней в страхе. Одна вещь, которую я бы СЕРЬЕЗНО рекомендовал, - это то, что у вас есть прокси или другой сервер, который вы можете использовать для доступа к своему главному серверу. Причина в том, что если вы занимаетесь веб-разработкой однажды на ровном месте, и вы Пингуйте себя 2000 раз за 5 часов для тестирования, которое вы можете заблокировать, не возвращаясь, кроме прокси.
Вы можете видеть, что
checkBadIPs.sh
я поместил grep -v 127.0 и в моих реальных файлах у меня есть тонна правил игнорирования для моих собственных IP-адресов и других диапазонов доверенных IP-адресов, но иногда ваши IP-адреса меняются, вы забываете обновить и затем блокируетесь. вне вашего собственного сервера.В любом случае, надеюсь, это поможет.
ОБНОВИТЬ
Я немного изменил ситуацию, так что теперь вместо проверки каждые пару часов я проверяю некоторые журналы каждые 2 минуты, в основном мой журнал аутентификации ssh и почтовый журнал, когда они набирались :(.
Я настраиваю конкретные сценарии для каждого файла журнала, хотя это будет достаточно легко из сценария, который я использую сам, когда хочу просмотреть журналы. Выглядит так:
При запуске требуется 2 входа: файл журнала, который вы хотите отсканировать, и то, как далеко назад вы хотите сканировать прошлое.
Поэтому, если бы я хотел проверить mail.log для подсчета ip, скажем, 75 минут в прошлом, я бы запустил:
источник
ipset
а не удлинил цепочку iptables, но идея замечательная, и я думаю, что применю их на своих производственных серверах. Спасибо, что поделился!Я согласен с комментариями по поводу ipsets и флагов tcp, но многое еще упущено:
Используйте xopps-addons geoip match вместо ipsets для списков стран. Регулярно обновляйте данные Geoip (не реже одного раза в месяц). Данные более динамичны, чем список ipset «забей и забудь».
Рассмотрим отслеживание состояния соединения с помощью флагов tcp. Например, tcp RST или ACK имеет смысл только для установленного соединения. SYN имеет смысл только для новых и связанных соединений. SYN для установленного соединения означает, что ваш SYN + ACK был потерян или попытка взлома и должна быть сброшена, поскольку обе стороны соединения не согласны с утверждением.
Хотя ни один из них, SYN + RST и FIN + RST не являются недопустимыми комбинациями, теперь SYN + FIN действует в режиме быстрого открытия TCP (опция 34 TCP), особенно для DNS. Пакеты SYN, даже с быстрым открытием, не должны быть фрагментированы. Я не считаю правила с флагами PSH и URG полезными. Не путайте состояние отслеживания соединения с состоянием TCP: для целей отслеживания устанавливается ответ RST на пакет SYN.
SYNPROXY предназначен для пересылаемых пакетов и ничего не добавляет для локально доставляемых пакетов, кроме поддержки syncookie.
Пакеты с ошибками ICMP всегда будут в связанном состоянии и имеют длину 48: 576, если они действительны. Длина 84: 1280 для IPv6. Все остальные должны игнорироваться. Поскольку их максимальный размер также является минимальным MTU, они никогда не должны быть фрагментированы. ICMP-запросы (пинги, временные метки и т. Д.) Всегда будут новыми и ответы будут установлены. Отбрасывать ICMP-пакеты в других штатах.
Как и в примере с SSH с недавним списком и приемом только последующих пакетов SYN, то же самое должно быть сделано для SMTP и аналогично «серому списку» только для данных IP-адреса.
В таблице фильтров первое (или второе, если принимает сначала пакеты с установленным состоянием) правило во входных и выходных цепочках должно принимать все в интерфейсе обратной связи. Вы должны доверять своим собственным внутренним пакетам. Если вы не можете, у вас есть большие проблемы, кроме решения брандмауэра.
Наконец, не копируйте слепо правила, если вы действительно не понимаете, что они делают. Так много похожих списков правил, и в большинстве случаев результат смехотворен.
источник
источник