Menu

Прячем реальный IP-адрес сайта своими силами

На днях столкнулся с интересной и необычной задачей. Старый заказчик попросил спрятать реальный IP-адрес работающего сайта, который размещен на кириллическом домене тырыпыры.рф и обслуживает множество региональных поддоменов по всей России. Основная сложность заключалась в том, что сайт уже успешно работал за Cloudflare с автоматическими SSL-сертификатами и полноценной поддержкой HTTPS, но теперь потребовался российский IP-адрес вместо американских серверов CDN. При этом было важно сохранить функциональность всех поддоменов, включая wildcard, обеспечить корректную работу HTTPS с валидными сертификатами и использовать устаревшие версии TLS по специфическим требованиям (дабы избежать потенциальных технических ограничений на территории РФ). Надежность и производительность отошли на второй план – главное было удовлетворить заказчика и создать иллюзию сайта, физически размещенного на территории России. Традиционные облачные решения не подходили, а российские аналоги Cloudflare показали свою неготовность к таким задачам. Пришлось разрабатывать нестандартную архитектуру с промежуточным reverse proxy сервером, который бы принимал трафик на российский IP, обрабатывал SSL и передавал запросы основному серверу, сохраняя при этом весь функционал и не теряя в безопасности.

Размышления

Первая мысль была - использовать супер-простой в настройке веб-сервер Caddy, тем более, у меня есть опыт работы с ним. Однако, тут стоит оговориться. Caddy, несмотря на свою простоту и встроенные возможности автоматического получения SSL-сертификатов, плохо подходит для данной задачи по нескольким причинам. Во-первых, его автоматическое управление сертификатами через HTTP-01 challenge требует, чтобы сервер был напрямую доступен из интернета по порту 80, что противоречит нашей цели скрыть реальный IP основного сервера. Во-вторых, для wildcard-сертификатов Caddy также нуждается в DNS-01 challenge, но его интеграция с DNS-провайдерами, особенно такими как Cloudflare, может быть менее гибкой и надежной по сравнению с проверенными решениями certbot. В-третьих, Caddy по умолчанию использует более современные версии TLS и HTTP/2, тогда как в задаче требуются устаревшие протоколы вроде TLS 1.1. Также важным фактором является то, что Caddy может автоматически обновлять сертификаты, но в случае с ручной настройкой DNS-записей, как в нашем сценарии, это преимущество теряется, и приходится вручную управлять процессом обновления, что делает Caddy не более удобным, чем NGINX с certbot. Кроме того, экосистема NGINX гораздо более гибкая и документирована для сложных сценариев проксирования, что делает его более предсказуемым выбором для специфических требований маскировки IP и управления трафиком.

Полная инструкция по настройке обратного прокси с российским IP

Цель: Скрыть реальный IP основного сервера, сделать сайт доступным с российским IP и сохранить HTTPS с wildcard-поддержкой.

Архитектура: Пользователь → DNS (Beget/Cloudflare) → Reverse Proxy (Beget, российский IP) → Основной сервер (Beget, HTTP/80)

Пошаговая настройка

1. Подготовка сервера

Был выбран виртуальный сервер с минимальной конфигурацией в том же датацентре. В качестве ОС выбрана любимая Rocky 9.

# Установка NGINX
dnf install epel-release -y
dnf install nginx certbot -y
systemctl enable --now nginx
# Установка firewalld (если нужно)
systemctl enable --now firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Установка certbot через snapd имеет ряд преимуществ. Snap-пакеты содержат все необходимые зависимости, что исключает проблемы совместимости с системными библиотеками. Certbot, установленный таким образом, автоматически обновляется до последней версии, обеспечивая доступ к новым функциям и исправлениям безопасности без ручного вмешательства. Это особенно важно, поскольку Let's Encrypt периодически вносит изменения в свои API и процедуры выпуска сертификатов. Snap-версия также предоставляет лучшую изоляцию от остальной системы, снижая потенциальные риски безопасности.

Процесс установки начинается с установки самого snapd, если он еще не присутствует в системе. На системах CentOS/Rocky Linux это делается через стандартный менеджер пакетов dnf. После установки snapd рекомендуется перезапустить сессию пользователя или перезагрузить систему, чтобы убедиться, что пути к исполняемым файлам snap корректно добавлены в переменную PATH. Затем можно выполнить установку certbot непосредственно через snap, используя классическую установку, которая предоставляет certbot необходимый доступ к системным ресурсам. После завершения установки становится доступна команда certbot, готовая к использованию для получения и управления SSL-сертификатами. Стоит отметить, что при использовании sudo с snap-командами иногда могут возникать предупреждения о PATH, но это не влияет на функциональность и может быть проигнорировано.

Установим snapd (если ещё не установлен):

sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap # Создаём симлинк для совместимости

Перезагрузим систему или выполним:

sudo snap wait system seed.loaded

Установим certbot через snap

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot # Добавляем в PATH

Проверить установку легко:

certbot --version

2. Получение SSL-сертификатов

# DNS-01 challenge для wildcard
certbot certonly --manual --preferred-challenges dns -d "*.xn++40aa2apjhca.xn--p1ai" -d "xn++40aa2apjhca.xn--p1ai"
Важно: Добавить TXT-записи в DNS и подождать 10-15 минут до распространения.

Проверка через dig:

dig @8.8.8.8 TXT _acme-challenge.xn++40aa2apjhca.xn--p1ai

3. Настройка NGINX

Файл /etc/nginx/nginx.conf (упрощенный):


user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}

 

Файл /etc/nginx/conf.d/roskassa.conf:



# HTTP - проксируем без редиректа (если основной сервер уже редиректит)
server {
listen 80;
server_name *.xn++40aa2apjhca.xn--p1ai xn++40aa2apjhca.xn--p1ai;

location / {
proxy_pass http://IP_ОСНОВНОГО_СЕРВЕРА:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

# HTTPS - обрабатываем на proxy сервере
server {
listen 443 ssl http2;
server_name *.xn++40aa2apjhca.xn--p1ai xn++40aa2apjhca.xn--p1ai;

ssl_certificate /etc/letsencrypt/live/xn++40aa2apjhca.xn--p1ai/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xn++40aa2apjhca.xn--p1ai/privkey.pem;

ssl_protocols TLSv1 TLSv1.1;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://IP_ОСНОВНОГО_СЕРВЕРА:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

4. Перезапуск и проверка

systemctl restart nginx
systemctl status nginx

5. Автообновление сертификатов

crontab

# Добавить строку:
0 2 * * 1 /usr/bin/certbot renew --quiet && /bin/systemctl reload nginx

6. Настройка DNS

Перевести DNS на сервера Beget или в Cloudflare выключить проксирование (серые облачка)
Указать A-записи на новый сервер с российским IP

⚠️ Возможные проблемы и решения

Проблема: ERR_TOO_MANY_REDIRECTS
Решение: Убрать HTTP→HTTPS редирект с reverse proxy, если основной сервер уже редиректит.

Проблема: TXT-записи не находятся
Решения:

Подождать 10-45 минут
Проверить через dig @8.8.8.8 TXT _acme-challenge.domain

Проблема: Сертификат не обновляется автоматически
Решение: Использовать Cloudflare API или вручную обновлять каждые 3 месяца.

Готово!
Теперь сайт:

✅ Доступен с российским IP
✅ Работает по HTTPS с валидными сертификатами
✅ Поддерживает все поддомены (wildcard)
✅ Использует TLS 1.1 (по требованиям)

Оставить комментарий

Ваше мнение очень важно для нас! Обязательно выскажите Ваши мысли, пожелания и критику! Не стесняйтесь задавать вопросы. Скорее всего, ответ появится уже через 2-3 дня. Спасибо заранее.

Удалите из списка все объекты, которые не являются животными:

🐶
🐱
🐭
🐹
🗑️ Перетащите сюда

Другие материалы в этой категории:

Go to top