РЕДАКТИРОВАТЬ:
Удивительно, как иногда одного желания найти решение достаточно, чтобы медленно, но верно привести к решению. Кроме того, чем чаще я перечитываю свой вопрос, чтобы прояснить его, тем больше понимаю, что этот «вопрос» выходит за рамки «простого» вопроса или идеи получения ответов от этого сообщества.
Я переделаю структуру этого вопроса в течение следующих часов, поскольку я все больше и больше понимаю операционные концепции iptables. Процесс понимания также дал некоторые более конкретные вопросы, которые я вскоре предоставлю этому сообществу и ссылку на этот вопрос.
В двух словах: Моя проблема — найти правильный набор правил, чтобы:
- мои собственные правила
- fail2ban
- дополнительные черные списки DNS работают вместе, тогда как «мои правила» также подразумевают либо внесение моей страны в белый список для SSH и, следовательно, блокировку всех других стран для SSH,НОпозволяявсестраны/диапазоны/IP-адреса для DNS-запросов, за исключением набора из черного списка.
В цифрах:
- для ssh: белый список 50 диапазоновИЛИчерный список примерно 620.000 диапазонов (составленный через ipdeny.com и т.д.)
- Записи в черном списке для DNS: около 140 (набор правил u32,сценарий(ы))
- 25+/- правил для дополнительных услуг (см. ниже)
Текст песни: Я борюсь с реализацией решения для своих нужд: Сценарий следующий. У меня есть сервер (предположим, DNS на данный момент). Помимо bind ssh, sendmail, https и munin нужно учитывать:
В целом, этого было легко достичь. Кроме того, я установил fail2ban, поскольку столкнулся с некоторыми (d)dos-атаками со всего мира. Моей главной целью было максимально заблокировать сервер.
Моя идея состояла в том, чтобы внести в белый список только некоторые диапазоны IP моей страны, которые соответствуют возможным динамическим распределениям DNS интернет-провайдеров, к которым у меня есть доступ - т. е. DSL и мобильный. Таким образом, я не заблокирую себя.
Я просмотрел все сетевые диапазоны моих интернет-провайдеров и получил следующий скрипт/набор правил:
#ports:
# 22: SSH (#4,#5) (ssh)
# 25: SMTP (#20) (outgoing, sendmail for f2b report)
# 53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind)
# 443: HTTPS (#10) (outgoing, dns-blacklist update)
#4949: munin (#26) (outgoing, sending client stats to server)
# Modify this file accordingly for your specific requirement.
# http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules
# 1. Delete all existing rules
#iptables -F
# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 4. Allow ALL incoming SSH
#iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated)
# note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban!
iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
service fail2ban restart
# 10. Allow outgoing HTTPS
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 13. Ping from outside to inside
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT
service munin-node restart
sh /root/update_domain_blacklist.sh
Перезапуск fail2ban перед набором правил № 10 необходим для того, чтобы цепочки были (пере)настроены правильно после очистки из iptable (сбрасывается с помощью -F в начале скрипта. То же самое относится и к munin, который жаловался на невозможность связаться со своим сервером, если не перезапустить его после применения правил исключений).
Я намерен применить правила через /etc/rc.local. Это подразумевает, что уже созданы цепочки для fail2ban и munin.
Поток проверки брандмауэра, который я хотел бы реализовать, следующий: запрос DNS? -> (a); ssh? -> (b); одна из моих других служб? -> (c); что-нибудь еще? -> (d):
- (a): обслуживать, если не занесен в черный список DNS-скрипт черного списка
- (b): обслуживать, если не занесен в черный список ИЛИ если занесен в белый список в соответствии с моим набором сетевых диапазонов
- (c): служить, согласно моим установленным правилам
- (d): DROP/TARPIT/любая другая лучшая практика
- если (б), дополнительно пройти fail2ban
Проблемыс вышеуказанными правилами:
- fail2ban срабатывает до проверки белого списка -хорошийдля моей части ssh,плохойдля моей части DNS: мое предположение
Затем я попытался использовать ipset, чтобы заблокировать/внести в черный список "весь мир", за исключением моих 50 диапазонов. Теоретически это возможно, но разбор 620 тыс. диапазонов длится больше 10 минут; я отменил операцию и вернулся к своим белым диапазонам. Следующая идея: все еще использовать ipset для 50 диапазонов и заблокировать/внести в черный списокобратныйиз этого списка для ssh:
!/bin/bash
#Script to process ip ranges to ban using IPSet and IPTables
# 10. Allow outgoing HTTPS
iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# 12. Ping from inside to outside
iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# 14. Allow loopback access
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
# 16. Allow outbound DNS
iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT
#Allow inbound DNS
iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT
# 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134)
iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# 26. Allow Munin Stats
iptables -I INPUT -p tcp --dport 4949 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT
#iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
ipset create countryblock hash:net
while read line; do ipset add countryblock $line; done < blocklist.txt
iptables -A INPUT -m set ! --match-set countryblock src -j DROP
тогда как 'blocklist.txt' содержит мои 50 диапазонов, которые нужно внести в белый список или наоборот, чтобы попасть в черный список. Но обратное этому набору также подразумевает, что ВЕСЬ трафик DNS должен быть заблокирован и т. д... это сводит меня с ума! :-D
Но по какой-то причине у меня либо вообще не было доступа к моему серверу, либо обратное не работало (пробовал несколько апплетов web2ssh, просто чтобы проверить наличие приглашения ssh).
Я также нашел соответствующие определения правил fail2ban createaction в его конфигурациях; но для уменьшения накладных расходов мне бы очень хотелось оставить правила munin и f2b по умолчанию такими, какие они есть, и применить необходимые изменения к моим собственным правилам и, возможно, к скрипту dns-blacklist.
Я знаю, что этот вопрос/запрос может быть не самым простым, и вы можете спросить, почему бы просто не использовать fail2ban? Мне нравится знать, есть ли подозрительные действия, и поэтому получение отчета о заблокированном хосте приятно. Хотя я не хочу иметь это для каждого зарубежного хоста (десятикратно, так как я запускаю fail2ban на более чем 10 серверах).
Другим подходом, возможно, был бы выделенный сервер/маршрутизатор брандмауэра, обрабатывающий весь трафик. Но это была бы довольно сложная настройка правил, и я не хочу случайно заблокировать ВСЕ мои серверы из-за глупой неправильной конфигурации/неправильного правила или чего-то еще. Кроме того, это превысит мой бесплатный трафик, который в настоящее время делится между всеми 10 серверами.
Надеюсь, рядом найдется какой-нибудь проницательный друг, который поможет мне правильно разобраться в правилах.
Прежде чем излишне раздувать этот вопрос, я сейчас на паузе и предоставлю информацию по запросу.
P.S.:может кто-то сможет добавить тег "ipset", так как я не могу его создать из-за отсутствия репутации. Спасибо!
решение1
Выглядит ужасно сложно...
Я думаю, что вы можете получить большую выгоду с точки зрения безопасности и производительности, просто переместив устройства sshd
в munin
другие порты.
Запуск этих служб на портах, которые не соответствуют порту по умолчанию, подавит большую часть трафика brute force/dos. После этого Fail2ban должен быть в состоянии обнаружить любые выбросы.
Переходя к custom
портам, вы по сути создаете следующее:
iptables -A "Anyone that doesn't know the correct ssh port" -j DROP
Вы по-прежнему можете регистрировать попытки подключения к порту 22
, но я думаю, что вы, вероятно, могли бы найти более эффективное применение дисковому пространству.
решение2
ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment
iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT
ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44
сохранить все ipset
ipset save >all.txt
загрузить все готово
ipset load <all.txt