Защита сервера: фаервол и реальный IP

После переключения DNS весь трафик идёт через наш узел фильтрации, а ваш сервер (origin) принимает уже очищенные запросы. Чтобы защита имела смысл, прямой доступ к серверу нужно закрыть — иначе атакующий сможет бить по нему напрямую, в обход фильтрации. А чтобы в логах сайта остался настоящий IP посетителя, на сервере нужно включить разбор заголовка X-Forwarded-For.

Зачем закрывать прямой доступ

Мы прячем реальный адрес сервера: посетители видят только наш узел фильтрации. Но если IP вашего сервера станет известен (например, из старых DNS-записей или утечки), атака пойдёт мимо защиты — прямо на сервер. Поэтому сервер стоит настроить так, чтобы веб-запросы он принимал только от наших адресов.

Шаг 1. Пустить на сайт только наши серверы

Разрешите подключения к портам 80 и 443 только с адресов наших серверов фильтрации, а для всех остальных эти порты закройте. Актуальные адреса возьмите в кабинете: «Мои сайты» → ваш домен (это тот же адрес, что вы указали в A-записи). Если адресов несколько — добавьте правило на каждый.

iptables
# Разрешаем веб-порты 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
ufw
# По строке 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
nftables
# Несколько адресов перечисляются через запятую в фигурных скобках.
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. Чтобы сервер использовал его в логах и в коде сайта, включите разбор этого заголовка.

nginx — секция http
# /etc/nginx/nginx.conf, секция http { ... }
# Одна строка set_real_ip_from на каждый адрес из кабинета.
# НИКОГДА не указывайте здесь 0.0.0.0/0.
set_real_ip_from <адрес-из-кабинета>;
real_ip_header   X-Forwarded-For;
Apache — mod_remoteip
# Подключите модуль: a2enmod remoteip && systemctl restart apache2
# Доверяйте заголовку ТОЛЬКО адресам из кабинета (по строке на адрес).
RemoteIPHeader        X-Forwarded-For
RemoteIPTrustedProxy  <адрес-из-кабинета>

Проверка

  1. Сайт открывается и работает через защиту.
  2. Прямой доступ к серверу по его IP закрыт.
  3. В логах сервера виден настоящий IP посетителя, а не адрес узла фильтрации.