Размышления
Первая мысль была - использовать супер-простой в настройке веб-сервер 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 (по требованиям)
Дискуссия
Написал Владимир
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Rocky 9
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Константин
Опубликовано в: Докеризация стека LEMP под Ubuntu c помощью Compose in LinuxНаписал bammbr
Опубликовано в: Шлюз для маленького отдела на Red Hat 9 in LinuxНаписал Федор
Опубликовано в: Установка и конфигурация Samba на CentOS 7 in Linux