Введение
Безопасность сервера является одной из ключевых задач администратора системы. Одним из инструментов для обеспечения сетевой безопасности является iptables — мощный инструмент для настройки правил фильтрации трафика в Linux.В этом руководстве мы рассмотрим, как создать Bash-скрипт, который автоматически обновляет список IP-адресов Cloudflare и настраивает правила iptables для защиты вашего сервера.
Шаг 1: Основы работы с iptables
iptables — это утилита для настройки и управления таблицами правил фильтрации пакетов в ядре Linux.С его помощью можно контролировать входящий и исходящий сетевой трафик на основе различных критериев, таких как IP-адрес, порт, протокол и т.д.
Основные команды iptables:
- iptables -A — добавить правило в цепочку.
- iptables -D — удалить правило из цепочки.
- iptables -P — установить политику по умолчанию для цепочки.
- iptables -F — очистить все правила из цепочки.
Шаг 2: Автоматизация настроек с помощью Bash-скрипта
Bash-скрипты позволяют автоматизировать повторяющиеся задачи.Мы создадим скрипт, который:
- Обновляет списки IP-адресов Cloudflare.
- Настраивает правила iptables на основе этих списков.
- Добавляет дополнительные правила для защиты сервера.
Создание скрипта
Создайте новый файл скрипта, например firewall.sh, и сделайте его исполняемым:
Код:
touch firewall.sh
chmod +x firewall.sh
Откройте файл в текстовом редакторе и начните с указания интерпретатора:
Код:
#!/bin/bash
Если скрипт будет запускаться в планировщике, например если хотите автоматически проверять айпи-адреса CloudFlare, они могут меняться, то рекомендую задать переменную PATH:
Код:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Шаг 3: Обновление списков IP Cloudflare
Cloudflare предоставляет актуальные списки своих IP-адресов. Мы будем автоматически скачивать эти списки и использовать их в наших правилах iptables.Скачивание списков
Используйте команду curl для скачивания списков:
Код:
# Скачивание IPv4-адресов
curl -sf https://www.cloudflare.com/ips-v4 -o /path/to/cloudflare-ips-v4.txt
# Скачивание IPv6-адресов
curl -sf https://www.cloudflare.com/ips-v6 -o /path/to/cloudflare-ips-v6.txt
Проверка что команда отработала успешно:
Код:
curl -sf https://www.cloudflare.com/ips-v4 -o /path/to/cloudflare-ips-v4.txt
if [[ $? -ne 0 || ! -s /path/to/cloudflare-ips-v4.txt ]]; then
echo "Ошибка при скачивании IPv4 списка или файл пустой. Завершение работы скрипта."
exit 1
fi
curl -sf https://www.cloudflare.com/ips-v6 -o /path/to/cloudflare-ips-v6.txt
if [[ $? -ne 0 || ! -s /path/to/cloudflare-ips-v6.txt ]]; then
echo "Ошибка при скачивании IPv6 списка или файл пустой. Завершение работы скрипта."
exit 1
fi
Шаг 4: Настройка правил iptables
Перед применением новых правил рекомендуется очистить текущие и установить политики по умолчанию.Очистка правил и установка политик по умолчанию.
ВАЖНО:Мы устанавливаем политику блокировать всё, кроме специально разрещённых правил, это очень опасная политика, в плане что можно потерять доступ к серверу.
Как минимум всегда разрешайте ssh, как сделать разрешающие правила, смотри ниже.
Код:
# Установка политики по умолчанию в DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
# Очистка всех правил
iptables -F
ip6tables -F
Разрешение основных соединений
Локальный интерфейс (localhost):
Код:
iptables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
Установленные и связанные соединения:
Код:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Добавление правил для IP Cloudflare
Пройдитесь по спискам IP-адресов и добавьте соответствующие правила:
Код:
# Для IPv4
while read -r ip; do
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s "$ip" -j ACCEPT
done < /path/to/cloudflare-ips-v4.txt
# Для IPv6
while read -r ip; do
ip6tables -A INPUT -p tcp -m multiport --dports 80,443 -s "$ip" -j ACCEPT
done < /path/to/cloudflare-ips-v6.txt
Защита SSH
Защита SSH-сервера от перебора паролей и DDoS-атак является критически важной.Рекомендуется изменить порт по умолчанию и установить fail2ban.
Но мы в скрипте ещё кое-что сделаем.)
Ограничение частоты подключений (5 подключений в минуту):
Код:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
Т.к. политика нашего файервола блокируй всё, нужно обязательно разрешить доступ к SSH, иначе потеряете доступ к серверу.
Код:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Аналогичным образом, можно открыть другие порты.
Разрешение специфичных портов для определенных IP
Если вам нужно разрешить доступ к определенному порту только с определенных IP-адресов:
Код:
iptables -A INPUT -p tcp --dport 1500 -s your.allowed.ip.address -j ACCEPT
Блокировка остальных соединений
После того как все необходимые правила добавлены, остальные подключения будут автоматически блокироваться из-за политики по умолчанию DROP.Шаг 5: Сохранение и применение правил
Чтобы сохранить текущие правила и применять их после перезагрузки, используйте:
Код:
# Сохранение правил
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
Убедитесь, что утилита iptables-persistent установлена:
Код:
apt-get install iptables-persistent
И тогда можно так:
Код:
netfilter-persistent save
Придумал ещё безопасное атомарное сохранение правил, на случай если например сервер кто-то вырубит в момент сохранения правил, полезно если скрипт работает в планировщике:
Код:
iptables-save > /etc/ispiptable.conf.new && mv /etc/ispiptable.conf.new /etc/ispiptable.conf
ip6tables-save > /etc/ispip6table.conf.new && mv /etc/ispip6table.conf.new /etc/ispip6table.conf
Заключение
Создание скрипта для автоматизации настройки iptables позволяет обеспечить надежную защиту сервера и упростить управление правилами брандмауэра. Регулярное обновление списка IP-адресов Cloudflare гарантирует, что ваш сервер будет правильно взаимодействовать с их сетью, обеспечивая безопасность и производительность.Важно: Всегда тестируйте новые правила iptables в тестовой среде или осторожно применяйте их на рабочем сервере, чтобы избежать случайной блокировки доступа.
Данные советы можно использовать в зависимости от ваших целей.
Удачи!)