...

Правила брандмауэра для веб-серверов: Практические примеры для iptables и UFW

Брандмауэр iptables и UFW контролируют, какие соединения веб-сервер принимает, а какие блокирует - это определяет поверхность атаки и неудачи. В этой практической статье я покажу четкие правила, безопасные настройки по умолчанию и проверенные команды для SSH, HTTP(S), баз данных, протоколирования, IPv6 и Docker - непосредственно применимые на продуктивных хостах.

Центральные пункты

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

  • Ограничительный Начало: Запрет по умолчанию для входящих, открыто специально
  • SSH Разрешить первым: не рисковать доступом
  • UFW как интерфейс: простой синтаксис, iptables в фоновом режиме
  • Ведение журнала активировать: Проверьте правила, распознайте атаки
  • Настойчивость обеспечить: Поддерживать правила перезапуска

Основы: iptables и UFW с первого взгляда

Я полагаюсь на iptablesкогда мне нужен тонкий контроль над пакетами, цепочками и соответствиями. Я использую UFW, когда мне нужно быстро применить надежные правила, которые в итоге оказываются внутренними правилами iptables [1]. Это позволяет мне сочетать простые команды с мощью Linux netfilter, не теряясь в деталях. Для веб-серверов это означает: я создаю прозрачный фильтр перед Apache, Nginx или Node, чтобы к ним поступал только нужный трафик [2]. Такое разделение уменьшает площадь атаки и позволяет атакам чаще терпеть неудачу.

Оба инструмента дополняют друг друга, и я решаю, какой из них подходит для конкретной ситуации. UFW отличается удобством чтения, особенно на Ubuntu и Debian [3]. iptables предоставляет мне расширенные возможности, например, для NAT, специфических интерфейсов и сложных согласований. Важно: я лаконично документирую свои правила, чтобы потом было легко их поддерживать. Если вы хотите узнать больше о концепции безопасности, вы можете найти четкое введение здесь: Брандмауэр как защитный экран.

Запуск конфигурации: безопасная установка политик по умолчанию

Я начинаю с По умолчанию-Политики: блокировать входящие, разрешить исходящие. Так я предотвращаю непреднамеренный доступ к новым службам. Я всегда разрешаю loopback, чтобы внутренние процессы работали стабильно. Я принимаю существующие соединения, чтобы избежать отмены. Такая последовательность минимизирует ошибки при активации брандмауэра [2][5].

Я использую UFW для установки базы с помощью всего нескольких команд. Затем я детально проверяю состояние, чтобы сразу заметить ошибки ввода. Для особо чувствительных хостов я также ограничиваю исходящие порты. Это снижает риск утечки данных, если служба была взломана. Я часто использую следующие команды:

# UFW: правила по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Альтернативная более строгая политика для исходящих сообщений
sudo ufw default deny outgoing
sudo ufw allow out 53
sudo ufw allow out 80
sudo ufw allow out 443

# Проверка состояния
sudo ufw status verbose

Фильтрация по состояниям: состояния и последовательность

Чистый поток посылок то увеличивается, то уменьшается Контрек заявляет.. Я принимаю установленные соединения первым, отбрасываю недействительные пакеты раньше и оставляю loopback открытым. Это снижает нагрузку и предотвращает побочные эффекты из-за позднего отбрасывания. Для iptables я намеренно задаю порядок:

# iptables: прочная основа
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Всегда разрешайте обратную петлю
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешить существующие/ассоциированные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Раннее удаление недействительных пакетов
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

В UFW ESTABLISHED/RELATED уже учитываются внутри. Я также обращаю внимание на то, предпочитаю ли я DROP (без звука) или ОТКАЗАТЬСЯ (активный, более быстрый отказ). Для внутренних сетей я предпочитаю REJECT, в публичной сети обычно DROP.

Основные правила для веб-серверов: SSH, HTTP и HTTPS

Я включаю SSH сначала, иначе я легко заблокирую себя. Затем я разрешаю HTTP и HTTPS, чтобы веб-сервер был доступен. Я устанавливаю только те порты, которые мне действительно нужны. Позже я добавляю ограничение скорости или Fail2ban, чтобы пресечь грубые попытки входа. Я немедленно проверяю каждое изменение с помощью команд status или list.

Я использую простые команды для этого. UFW предлагает говорящие псевдонимы для веб-портов, что повышает удобочитаемость. С помощью iptables я могу задать точные порты и протоколы. После этого я сохраняю правила iptables, чтобы они пережили перезагрузку. Вот минимальные шаги:

# SSH
sudo ufw allow 22
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP/HTTPS
sudo ufw allow http
sudo ufw allow https
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Безопасный SSH: Ограничивайте и открывайте выборочно

В дополнение к освобождению я гашу атаки с помощью Ограничение скорости или белых списков. UFW обеспечивает простую защиту:

# Ограничение скорости SSH (UFW)
sudo ufw limit 22/tcp comment "SSH Rate Limit"

Я устанавливаю более тонкие ограничения с помощью iptables. Это предотвращает массовое угадывание паролей, не исключая легитимных администраторов:

# SSH: ограничение количества попыток подключения к одному источнику
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH --update --seconds 60 --hitcount 10 -j DROP

По возможности я разрешаю использовать SSH только с IP-адреса администраторов и работать с ключами SSH. Изменение портов не заменит безопасности, но может снизить уровень шума. Я документирую исключения и регулярно их проверяю.

Защита баз данных и ограничение источников IP-адресов

Я никогда не открываю порты баз данных глобально, а только местный или для определенных IP-адресов источника. Это не позволяет сканерам найти открытые порты MySQL, PostgreSQL или MongoDB. Для локальных приложений в качестве цели достаточно 127.0.0.1; я контролирую доступ внешних администраторов строго по IP. Я кратко документирую изменения, например, в серверной вики. Это экономит мне время во время аудита.

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

# Только локально: MySQL
sudo ufw разрешить доступ с 127.0.0.1 на любой порт 3306
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT

# Разрешить один IP
sudo ufw allow from 203.0.113.10
iptables -A INPUT -s 203.0.113.10 -j ACCEPT

# Разрешить порт для определенного IP
sudo ufw allow с 10.1.2.3 на любой порт 4444
iptables -A INPUT -p tcp -s 10.1.2.3 --dport 4444 -j ACCEPT

# Блокировка известных злоумышленников
sudo ufw deny from 192.0.2.24
iptables -A INPUT -s 192.0.2.24 -j DROP

Чистая обработка протоколирования, интерфейсов и IPv6

Я включаю Ведение журнала для проверки правил и распознавания заметного трафика. Уровня "on" в UFW достаточно для большинства хостов, более высокие уровни я использую выборочно. Я анализирую журналы с помощью journalctl, fail2ban или инструментов SIEM. Это позволяет мне распознать закономерности в сканировании или попытках грубой силы. В случае обнаружения аномалий я оперативно корректирую правила [2].

Я часто привязываю правила к определенному Интерфейснапример eth0 в сетях общего пользования. Это предотвращает ненужное воздействие на внутренние сети. UFW может "разрешить вход через eth0 на любой порт 80", iptables использует -i для входных интерфейсов. Для IPv6 я проверяю активацию в /etc/default/ufw на "IPV6=yes" и использую ip6tables для собственных правил [2]. Такое разделение позволяет избежать проблем с двухстековыми хостами.

ICMP и ICMPv6: доступность без пробелов

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

# IPv4: ограничение эха, разрешение важных типов ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/second --limit-burst 20 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

# UFW: Разрешить ICMP в целом (возможна тонкая настройка в before.rules)
sudo ufw allow in proto icmp

На сайте IPv6 ICMPv6 абсолютно необходим (Neighbour Discovery, Router Advertisement). Я разрешаю основные типы и ограничиваю эхо-запросы:

# IPv6 (ip6tables)
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-solicitation -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type echo-request -m limit --limit 5/second --limit-burst 20 -j ACCEPT

Правильно используйте ограничение исходящего потока и NAT/маскарадинг

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

Для настройки маршрутизации я использую NAT/Masquerading через UFW-Before-Rules или raw с помощью iptables. Я обращаю внимание на порядок цепочек, чтобы пакеты переписывались правильно. После изменений я тестирую соединение и задержки. Для производственных систем я планирую окно обслуживания и делаю резервные копии конфигурации. Это позволяет мне отслеживать сетевые пути [7].

Исходящие данные: системные службы и протоколы

При строгой политике исходящих сообщений я специально разрешаю DNS (53/udp), HTTPS (443/tcp) и, если требуется NTP (123/udp). Для почтовых серверов я добавляю 25/tcp и 587/tcp. Я не разрешаю доменные исключения на уровне пакетов, а использую прокси-серверы или логику приложения.

# UFW: типичные системные службы
sudo ufw allow out 123/udp # NTP
sudo ufw allow out 25/tcp # SMTP - только если почтовый сервер
sudo ufw allow out 587/tcp # Submission - только при необходимости

# iptables: определенное разрешение
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

Docker и брандмауэры: как избежать подводных камней

Docker устанавливает свой собственный iptables-правила, которые могут повлиять на мою политику. Поэтому я проверяю цепочки NAT и FORWARD после каждого запуска компа или демона. Я намеренно освобождаю открытые порты и избегаю "-p 0.0.0.0:PORT". Вместо этого я привязываю их к управляющему IP или обратному прокси. Так вектор атаки становится меньше и заметнее [1].

Я держу брандмауэры хостов активными, несмотря на Docker. Я также контролирую группы безопасности на уровне инфраструктуры, если это возможно. В случае конфликтов между UFW и Docker я использую документированные обходные пути или устанавливаю правила в DOCKER-USER. Важно четко распределить обязанности: хост всегда блокирует, контейнеры открываются только в явном виде. Такой порядок предотвращает неосознанные релизы.

# DOCKER-USER: применение глобальной политики хостов перед правилами Docker
iptables -N DOCKER-USER 2>/dev/null || true
iptables -I DOCKER-USER -s 192.0.2.24 -j DROP
iptables -A DOCKER-USER -j RETURN

Тонкие настройки UFW: Последовательность, профили и маршрутизируемый трафик

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

Последовательность управления #
sudo ufw insert 1 deny in from 198.51.100.0/24

# Нумерованный вид и целевое удаление
sudo ufw status numbered
sudo ufw delete 3

# Профили приложений (например, Nginx Full)
sudo ufw app list
sudo ufw app info "Nginx Full"
sudo ufw allow "Nginx Full"

# Блокируйте маршрутизируемый трафик по умолчанию (переадресация)
sudo ufw default deny routed

Более сложные исключения я храню в before.rules соответственно после.правила. Там я могу разместить тонкую настройку ICMP или точную настройку NAT, не теряя при этом читаемости стандартных правил.

Постоянные правила: Сохранение и восстановление

Правила UFW таковы постоянный и автоматически переносит перезагрузку. Это значительно упрощает администрирование на хостах Debian/Ubuntu. В iptables я сохраняю правила после изменений и восстанавливаю их при запуске. Для этого я использую iptables-save/restore или netfilter-persistent. Без этих шагов я теряю изменения после перезапуска [5].

Я проверяю устойчивость систематически: планирую перезагрузку, затем проверяю состояние. Если счетчики и цепочки верны, конфигурация надежна. Если правила отсутствуют, я исправляю путь загрузки в контексте init или systemd. Эта процедура позволяет избежать неожиданностей во время обслуживания. Документирование и резервное копирование файлов правил завершают процедуру.

# Debian/Ubuntu: Постоянство для iptables
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save

# Резервное копирование вручную
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6

Восстановление # (если требуется)
sudo iptables-restore < /etc/iptables/rules.v4
sudo ip6tables-restore < /etc/iptables/rules.v6

Производительность и защита: ограничения, наборы и настройка ядра

Когда нагрузка велика, я уменьшаю количество элементов управления и использую целевые Ограничения по ставкам. Для больших списков блоков я работаю с ipset, чтобы сократить время поиска. Я также использую системные механизмы защиты:

# Содержит SYN-флуд (ядро)
sudo sysctl -w net.ipv4.tcp_syncookies=1

# Ограничьте скорость HTTP-соединений для каждого IP-адреса источника (пример)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW
  -m hashlimit --hashlimit-name http_rate --hashlimit-above 50/second
  --hashlimit-burst 100 --hashlimit-mode srcip -j DROP

Я сохраняю размер Стол для транспортировки с первого взгляда. При большом количестве одновременных подключений я увеличиваю nf_conntrack_max, но предварительно тестирую эффект.

Управление, испытания и предотвращение ошибок

Я ухожу SSH прежде чем активировать "запрет на входящие". Затем я проверяю со второй сессии, остается ли доступ стабильным. Я проверяю каждое новое правило с помощью "ufw status verbose" или "iptables -L -v". Это позволяет мне узнать счетчики попаданий и увидеть, попадают ли пакеты в ожидаемую цепочку. Перед внесением серьезных изменений я делаю резервную копию файлов брандмауэра.

Для обеспечения комплексной безопасности я сочетаю брандмауэр с мерами по укреплению системы. К ним относятся безопасные настройки SSH, управление исправлениями и минимальное количество служб. Мне нравится использовать практическое руководство в качестве контрольного списка: Упрочнение серверов для Linux. Я регулярно повторяю эти проверки и придерживаюсь установленных сроков обслуживания. Это позволяет поддерживать мои серверы в надежной форме.

Расширенные испытания и наблюдения

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

Открытые розетки #
ss -lntup

# Компактный обзор iptables
sudo iptables -S
sudo iptables -L -v -n

# UFW: подробное состояние и журналы
sudo ufw status verbose
journalctl -k | grep -i ufw

# Внешняя проверка (с другого узла/сети)
nmap -Pn -p 22,80,443

Для изменений, связанных с высоким риском, я планирую Уровень резервного копирования включено. Я работаю в Screen/Tmux и, если необходимо, устанавливаю сброс по времени, если я заблокирую себя. После успешной проверки я снова отменяю действие отката.

# Пример: автоматическая деактивация в качестве аварийного якоря (используйте осторожно)
echo "ufw disable"| at now + 2 minutes
# Повторное удаление после успешной проверки: atrm

Сравнение хостинг-провайдеров: Фокус на интеграции брандмауэра

Для хостинга я полагаюсь на Безопасность близко к платформе. Настраиваемые политики, быстрое развертывание правил и хороший мониторинг приносят свои плоды. В текущих сравнениях webhoster.de впечатляет аккуратно интегрированными опциями брандмауэра и быстрой поддержкой. Те, кто предпочитает панельные настройки, получают четкие инструкции по Брандмауэр Plesk. В следующей таблице представлены основные критерии.

Поставщик Интеграция с брандмауэром Производительность Поддержка Размещение
веб-сайт webhoster.de индивидуальная конфигурация. Очень высокий топ 1
Провайдер B Стандарт высокий хорошо 2
Провайдер C Стандарт хорошо Удовлетворительно 3

Практические примеры: От теста к производственному правилу

Я начинаю каждый набор правил в Экран или во втором сеансе SSH. Таким образом, я могу спастись в случае ошибки в работе. Только когда тестовый хост работает нормально, я применяю правила в производстве. Правила обратного пути и план отката обеспечивают мне дополнительную безопасность. В конце я лаконично документирую изменения в журнале изменений.

Я использую повторяющиеся строительные блоки для веб-серверов: разрешить SSH, разрешить HTTP/S, привязать внутренние порты локально, залогиниться, ограничить ICMP, заблокировать лишние протоколы. Затем я забочусь о правилах зеркалирования IPv6, чтобы не оставалось пробелов. Я всегда проверяю цепочки Docker отдельно, потому что они устанавливают собственные пути. Наконец, я подтверждаю доступ с помощью внешних проверок и мониторинга. Таким образом, интерфейс остается чистым и отслеживаемым [1][2].

Резюме для администраторов

С четким Правила и несколько команд, я надежно защищаю веб-серверы. Входящие порты по умолчанию запрещены, сначала SSH, затем HTTP/S - это стабильная основа. Порты баз данных только локально или через белый список, активное протоколирование, соблюдение IPv6, проверка цепочек docker. Постоянное хранение и регулярные тесты предотвращают неприятные сюрпризы. Такая рутина обеспечивает доступность сервисов и значительно снижает риски.

Независимо от того, использую ли я UFW или iptables напрямую, четкая и экономичная политика имеет решающее значение. Я кратко документирую, регулярно проверяю и свожу исключения к минимуму. Ограничение исходящих соединений останавливает ненужные подключения и ограничивает ущерб в случае компрометации. Благодаря практическому наблюдению за журналами я быстрее распознаю аномалии и реагирую соответствующим образом. Таким образом, веб-сервер становится устойчивым, а площадь атаки - небольшой.

Текущие статьи

Серверная среда с контейнерными символами и Kubernetes в центре обработки данных
Администрация

Контейнерный хостинг и Kubernetes в веб-хостинге: будущее эффективного развертывания приложений

Откройте для себя преимущества Kubernetes Hosting Web: масштабируемые, автоматизированные и безопасные решения для веб-хостинга вашей компании.

Сетевые облачные серверы в современной мультиоблачной среде
облачные вычисления

Мультиоблачная оркестрация в веб-хостинге: сравнение инструментов, стратегий и поставщиков

Мультиоблачная оркестрация в веб-хостинге: информация об облачном хостинге, инструментах, гибридном облачном хостинге и сравнение поставщиков. В фокусе: мультиоблачный хостинг.

Современная серверная комната с цифровыми символами защиты и логотипом WordPress, символизирующим безопасность.
Wordpress

Аудит безопасности установок WordPress у хостинг-провайдера: соответствующий чек-лист для максимальной безопасности

Ознакомьтесь с полным списком проверок для аудита безопасности WordPress у хостинг-провайдера. Эффективно защитите свой сайт с помощью лучших советов для максимальной защиты — читайте сейчас!