Как создать черный или белый список или несколько диапазонов IP-адресов с помощью ipset и iptables + fail2ban

РЕДАКТИРОВАТЬ:

Удивительно, что иногда стремление найти решение достаточно медленно, но неуклонно ведет к решению. Кроме того, чем чаще я перечитываю свой вопрос, чтобы прояснить его, я понимаю, что этот "вопрос" скорее выходит за рамки "простого" вопроса или идеи получения ответов от сообщества.

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


В двух словах: Моя проблема состоит в том, чтобы найти правильный набор правил для:

  • мои собственные правила
  • fail2ban
  • дополнительный черный список DNS работает вместе, в то время как "мои правила" также подразумевают либо внесение в белый список моей страны для ssh, и, следовательно, блокирование всех других стран для ssh, НО разрешает все страны / диапазоны / IP-адреса для запросов DNS, кроме набора из черного списка.

В цифрах:

  • для ssh: белый список 50 диапазонов ИЛИ черный список ок. 620.000 диапазонов (составлено через ipdeny.com и т. Д.)
  • черный список записей для днс: ок. 140 ( набор правил u32, скрипт (ы))
  • 25 +/- правила для дополнительных услуг (см. Ниже)

Лирическая версия: я борюсь с реализацией решения для моих нужд: сценарий выглядит следующим образом. У меня есть (предположим, DNS на данный момент) сервер. Помимо bind ssh необходимо учитывать sendmail, https и munin:

В целом этого было легко достичь. Кроме того, я установил fail2ban, так как столкнулся с некоторыми (d)dos атаками со всего мира. Моей основной целью было максимально заблокировать сервер.

Моя идея состояла в том, чтобы внести в белый список только некоторые диапазоны IP-адресов в моей стране, которые соответствуют возможному динамическому распределению DNS-провайдеров, к которым у меня есть доступ - то есть DSL & mobile. Таким образом, я не буду запираться.

Я просмотрел все диапазоны сети моих интернет-провайдеров, что привело к следующему набору скриптов / правил:

#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? -> (а); SSH? -> (б); одна из моих других услуг? -> (с); что-нибудь еще? -> (d):

  • (a): служить, если не в черном списке сценарий DNS черного списка
  • (b): служить, если не занесен в черный список ИЛИ если занесен в белый список в соответствии с моим сетевым диапазоном
  • (с): служить согласно моим определенным правилам
  • (d): DROP/TARPIT/ любой лучший метод
  • если (б), дополнительно передать fail2ban

Проблемы с вышеуказанными правилами:

  • fail2ban запускает перед проверкой белого списка - хорошо для моей части SSH, плохо для моей части DNS: мое предположение

Затем я попытался использовать ipset для блокировки / "черного списка" всего мира, за исключением моих 50 диапазонов. Теоретически возможно, но разбор диапазонов 620k длится более 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 серверами.

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

До излишнего заполнения этого вопроса я сейчас нахожусь в ожидании, предоставляя информацию по запросу.

PS: возможно кто-то может добавить тег "ipset", так как я не могу его создать из-за отсутствия репутации. Спасибо!

2 ответа

Выглядит ужасно сложно....

Я думаю, что вы можете найти большую ценность в безопасности и производительности, просто двигая sshd а также munin в разные порты.

Запуск этих служб на портах, которые не соответствуют стандартным, приведет к подавлению большей части трафика "грубой силы". Fail2ban должен иметь возможность обнаруживать любые выбросы после этого.

Переезжая в custom порты, вы по сути создаете следующее:

iptables -A "Anyone that doesn't know the correct ssh port" -j DROP

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

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
Другие вопросы по тегам