Код: Выделить всё
#!/usr/bin/env bash
# ============================================
# СКРИПТ ПРОВЕРКИ СТАТУСА ЗАЩИТЫ POSTFIX
# Версия: 2.0
# ============================================
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}=========================================${NC}"
echo -e "${GREEN} 📊 СТАТИСТИКА ЗАЩИТЫ POSTFIX${NC}"
echo -e "${BLUE}=========================================${NC}"
echo ""
echo -e "${YELLOW}🕐 $(date)${NC}"
echo ""
# 1. Количество забаненных IP и подсетей
echo -e "${BLUE}🔒 Забанено IP и подсетей:${NC}"
banned_count=$(sudo iptables -L INPUT -n 2>/dev/null | grep DROP | grep -v "ADDRTYPE" | grep -v "recent" | wc -l)
echo " $banned_count"
echo ""
# 2. Список последних 10 забаненных
echo -e "${BLUE}📋 Последние 10 забаненных:${NC}"
sudo iptables -L INPUT -n 2>/dev/null | grep DROP | grep -v "ADDRTYPE" | grep -v "recent" | tail -10 | while read line; do
echo " $line"
done
echo ""
# 3. Логи бана (последние 5)
echo -e "${BLUE}📝 Логи бана (последние 5):${NC}"
if [[ -f /var/log/ban-attacks.log ]]; then
sudo tail -5 /var/log/ban-attacks.log 2>/dev/null | while read line; do
echo " $line"
done
else
echo " ❌ Лог еще не создан"
fi
echo ""
# 4. Всего атак в логах
echo -e "${BLUE}📊 Всего атак в логах:${NC}"
total_attacks=$(sudo grep -c "SASL.*authentication failed" /var/log/mail.log 2>/dev/null || echo "0")
echo " $total_attacks"
echo ""
# 5. Топ атакующих IP
echo -e "${BLUE}🔍 Топ атакующих IP:${NC}"
sudo grep "SASL.*authentication failed" /var/log/mail.log 2>/dev/null | \
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort | uniq -c | sort -rn | head -5 | \
while read count ip; do
# Проверяем, забанен ли IP
if sudo iptables -L INPUT -n 2>/dev/null | grep -q "$ip"; then
status="✅ ЗАБАНЕН"
else
status="❌ НЕ ЗАБАНЕН"
fi
echo " $ip - $count атак $status"
done
echo ""
# 6. Проверка cron
echo -e "${BLUE}🔄 Статус cron:${NC}"
# Проверяем /etc/crontab
if grep -q "ban-attackers" /etc/crontab 2>/dev/null; then
cron_line=$(grep "ban-attackers" /etc/crontab 2>/dev/null | head -1)
echo " ✅ Cron настроен в /etc/crontab"
echo " $cron_line"
# Проверяем, что cron запущен
if systemctl is-active --quiet cron 2>/dev/null || service cron status 2>/dev/null | grep -q "running"; then
echo " ✅ Cron сервис запущен"
else
echo " ⚠️ Cron сервис НЕ запущен!"
echo " Запустите: sudo systemctl start cron"
fi
# Проверяем, что скрипт существует
if [[ -f /usr/local/bin/ban-attackers.sh ]]; then
echo " ✅ Скрипт бана существует"
if [[ -x /usr/local/bin/ban-attackers.sh ]]; then
echo " ✅ Скрипт бана исполняемый"
else
echo " ❌ Скрипт бана НЕ исполняемый!"
echo " Исправьте: sudo chmod +x /usr/local/bin/ban-attackers.sh"
fi
else
echo " ❌ Скрипт бана НЕ существует!"
fi
# Проверяем crontab -e
elif sudo crontab -l 2>/dev/null | grep -q "ban-attackers"; then
cron_line=$(sudo crontab -l 2>/dev/null | grep "ban-attackers" | head -1)
echo " ✅ Cron настроен (crontab -e)"
echo " $cron_line"
# Проверяем, что cron запущен
if systemctl is-active --quiet cron 2>/dev/null || service cron status 2>/dev/null | grep -q "running"; then
echo " ✅ Cron сервис запущен"
else
echo " ⚠️ Cron сервис НЕ запущен!"
echo " Запустите: sudo systemctl start cron"
fi
# Проверяем, что скрипт существует
if [[ -f /usr/local/bin/ban-attackers.sh ]]; then
echo " ✅ Скрипт бана существует"
if [[ -x /usr/local/bin/ban-attackers.sh ]]; then
echo " ✅ Скрипт бана исполняемый"
else
echo " ❌ Скрипт бана НЕ исполняемый!"
echo " Исправьте: sudo chmod +x /usr/local/bin/ban-attackers.sh"
fi
else
echo " ❌ Скрипт бана НЕ существует!"
fi
else
echo " ❌ Cron НЕ настроен!"
echo ""
echo -e "${YELLOW} Чтобы настроить cron:${NC}"
echo " sudo vim /etc/crontab"
echo " Добавьте строку:"
echo " */2 * * * * root /usr/local/bin/ban-attackers.sh > /dev/null 2>&1"
echo " Затем: sudo systemctl restart cron"
fi
echo ""
# 7. Проверка iptables
echo -e "${BLUE}🛡️ Статус iptables:${NC}"
if sudo iptables -L INPUT -n 2>/dev/null | grep -q "DROP"; then
echo " ✅ Правила iptables активны"
# Проверяем политику INPUT
policy=$(sudo iptables -L INPUT -n 2>/dev/null | head -1 | awk '{print $4}')
if [[ "$policy" == "DROP" ]]; then
echo " ✅ Политика INPUT: DROP"
else
echo " ⚠️ Политика INPUT: $policy (рекомендуется DROP)"
fi
else
echo " ⚠️ Правила iptables не найдены"
fi
echo ""
# 8. Проверка fail2ban (опционально)
echo -e "${BLUE}🔧 Статус fail2ban:${NC}"
if command -v fail2ban-client &> /dev/null; then
if systemctl is-active --quiet fail2ban 2>/dev/null || service fail2ban status 2>/dev/null | grep -q "running"; then
echo " ✅ Fail2ban запущен"
# Проверяем jail postfix-sasl
if sudo fail2ban-client status postfix-sasl 2>/dev/null | grep -q "Status"; then
banned_fail2ban=$(sudo fail2ban-client get postfix-sasl banip 2>/dev/null | wc -l)
echo " ✅ Jail postfix-sasl активен ($banned_fail2ban IP забанено)"
else
echo " ⚠️ Jail postfix-sasl не активен"
fi
else
echo " ⚠️ Fail2ban не запущен"
fi
else
echo " ❌ Fail2ban не установлен"
fi
echo ""
# 9. Последние запуски cron
echo -e "${BLUE}🔄 Последние запуски cron:${NC}"
if grep -q "ban-attackers" /var/log/syslog 2>/dev/null; then
sudo grep "ban-attackers" /var/log/syslog 2>/dev/null | tail -3 | while read line; do
echo " $line"
done
else
echo " Нет записей в логах"
fi
echo ""
# 10. Итоговый статус
echo -e "${BLUE}=========================================${NC}"
if [[ $banned_count -gt 0 ]]; then
echo -e "${GREEN}✅ СТАТУС: ЗАЩИЩЕН ($banned_count IP/подсетей забанено)${NC}"
else
echo -e "${YELLOW}⚠️ СТАТУС: ТРЕБУЕТ ВНИМАНИЯ (нет забаненных IP)${NC}"
fi
echo -e "${BLUE}=========================================${NC}"
# Советы по устранению проблем
if [[ $banned_count -eq 0 ]]; then
echo ""
echo -e "${YELLOW}💡 Советы:${NC}"
echo " 1. Проверьте логи атак: sudo tail -f /var/log/mail.log | grep 'SASL.*failed'"
echo " 2. Запустите бан вручную: sudo /usr/local/bin/ban-attackers.sh"
echo " 3. Проверьте cron: sudo systemctl status cron"
fi
echo ""
Код: Выделить всё
# 1. Создаем скрипт
sudo nano /usr/local/bin/setup-postfix-protection.sh
# 2. Вставляем код выше и сохраняем (Ctrl+O, Enter, Ctrl+X)
# 3. Даем права на выполнение
sudo chmod +x /usr/local/bin/setup-postfix-protection.sh
# 4. Запускаем установку
sudo /usr/local/bin/setup-postfix-protection.sh
Функция Описание
Проверка зависимостей Проверяет установленные пакеты
Создание скрипта бана ban-attackers.sh - автоматический бан
Создание скрипта проверки check-ban.sh - статус защиты
Настройка cron Бан каждые 2 и 5 минут
Настройка iptables Базовые правила защиты
Настройка fail2ban Дополнительная защита (если установлен)
Первый запуск Немедленный бан всех атакующих
Вывод информации Показывает статус и полезные команды
После установки:
Код: Выделить всё
# Проверить статус
sudo /usr/local/bin/check-ban.sh
# Посмотреть логи
sudo tail -f /var/log/ban-attacks.log
# Посмотреть атаки
sudo tail -f /var/log/mail.log | grep "SASL.*failed"
