Защита сервера: фаервол и реальный IP
После переключения DNS весь трафик идёт через наш узел фильтрации, а ваш сервер (origin) принимает уже очищенные запросы. Чтобы защита имела смысл, прямой доступ к серверу нужно закрыть — иначе атакующий сможет бить по нему напрямую, в обход фильтрации. А чтобы в логах сайта остался настоящий IP посетителя, на сервере нужно включить разбор заголовка X-Forwarded-For.
Зачем закрывать прямой доступ
Мы прячем реальный адрес сервера: посетители видят только наш узел фильтрации. Но если IP вашего сервера станет известен (например, из старых DNS-записей или утечки), атака пойдёт мимо защиты — прямо на сервер. Поэтому сервер стоит настроить так, чтобы веб-запросы он принимал только от наших адресов.
Шаг 1. Пустить на сайт только наши серверы
Разрешите подключения к портам 80 и 443 только с адресов наших серверов фильтрации, а для всех остальных эти порты закройте. Актуальные адреса возьмите в кабинете: «Мои сайты» → ваш домен (это тот же адрес, что вы указали в A-записи). Если адресов несколько — добавьте правило на каждый.
# Разрешаем веб-порты 80 и 443 только нашим серверам фильтрации.
# <адрес-из-кабинета> — замените на адрес из кабинета (по правилу на каждый адрес).
sudo iptables -A INPUT -p tcp --dport 80 -s <адрес-из-кабинета> -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -s <адрес-из-кабинета> -j ACCEPT
# Остальным закрываем 80 и 443 (SSH и прочие порты не затрагиваются):
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -j DROP# По строке allow на каждый адрес из кабинета:
sudo ufw allow from <адрес-из-кабинета> to any port 80 proto tcp
sudo ufw allow from <адрес-из-кабинета> to any port 443 proto tcp
# Закрываем веб-порты для всех остальных:
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp# Несколько адресов перечисляются через запятую в фигурных скобках.
table inet web_filter {
chain input {
type filter hook input priority 0;
# Разрешаем веб-порты только нашим серверам фильтрации:
tcp dport { 80, 443 } ip saddr { <адрес-из-кабинета> } accept
# Остальным веб-порты закрыты:
tcp dport { 80, 443 } drop
}
}В firewalld тот же принцип настраивается через rich rules: разрешите наши адреса для служб http и https и уберите эти службы из зоны для остальных. Если не уверены в настройке — напишите в поддержку, поможем.
Шаг 2. Вернуть реальный IP посетителя
Так как запросы приходят на сервер от нашего узла фильтрации, в логах по умолчанию будет наш адрес, а не адрес посетителя. Настоящий IP мы передаём в заголовке X-Forwarded-For. Чтобы сервер использовал его в логах и в коде сайта, включите разбор этого заголовка.
# /etc/nginx/nginx.conf, секция http { ... }
# Одна строка set_real_ip_from на каждый адрес из кабинета.
# НИКОГДА не указывайте здесь 0.0.0.0/0.
set_real_ip_from <адрес-из-кабинета>;
real_ip_header X-Forwarded-For;# Подключите модуль: a2enmod remoteip && systemctl restart apache2
# Доверяйте заголовку ТОЛЬКО адресам из кабинета (по строке на адрес).
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy <адрес-из-кабинета>Проверка
- Сайт открывается и работает через защиту.
- Прямой доступ к серверу по его IP закрыт.
- В логах сервера виден настоящий IP посетителя, а не адрес узла фильтрации.